Model中的unguard()

在 Laravel 中,Model::unguard(); 通常会在需要临时禁用所有模型的批量赋值保护的场合下使用。最典型的场合是在数据库的种子填充(seeding)过程中。

你可以在以下两个地方使用 Model::unguard();

  1. 数据库种子类(Database Seeders):在数据库种子类中调用 Model::unguard(); 可以让你在填充数据库时不受 $fillable$guarded 属性的限制。通常,这会在 run 方法的开始调用,并在方法结束时通过 Model::reguard(); 恢复保护。

    use Illuminate\Database\Seeder;
    use Illuminate\Database\Eloquent\Model;
    
    class DatabaseSeeder extends Seeder
    {
        public function run()
        {
            Model::unguard();
    
            // 调用其他种子类
            $this->call(UserTableSeeder::class);
    
            Model::reguard();
        }
    }
    
  2. 服务提供者(Service Providers):如果你想要在整个应用程序的生命周期中禁用批量赋值保护,可以在 AppServiceProvider 或你创建的任何其他服务提供者的 boot 方法中调用 Model::unguard();

    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            Model::unguard();
        }
    
        public function register()
        {
            //
        }
    }
    

请注意,全局禁用批量赋值保护可能会引入安全风险,因为它允许所有属性在批量赋值时不受限制。因此,这通常只在控制严格的环境下(如本地开发环境或数据库种子填充时)使用,并且在操作结束后应该使用 Model::reguard(); 来重新启用批量赋值保护。在生产环境中,应该避免使用 Model::unguard();,除非你完全了解潜在的安全风险并有相应的安全措施。

** AppServerProvider **
AppServiceProvider 是 Laravel 框架中的一个核心组件,它是所有服务提供者的基类。服务提供者主要用于配置和注册服务。在 Laravel 中,服务是用来提供某种功能的类,例如数据库服务、队列服务、邮件服务等。服务提供者用于把这些服务绑定到 Laravel 的服务容器中,使得这些服务可以在整个应用中被方便地使用。

AppServiceProvider 中的 bootregister 方法都是用于配置和注册服务的,但它们的用途和调用时机有所不同。

  1. register 方法:此方法在所有服务提供者被注册时调用。也就是说,当 Laravel 启动并开始收集所有服务提供者时,它会调用每个服务提供者的 register 方法。你应该只在 register 方法中绑定服务到服务容器,不要在这里尝试访问已经注册的服务,因为这个时候这些服务可能还没有被加载和配置好。

  2. boot 方法:此方法在所有服务提供者被注册之后调用。换句话说,当所有服务提供者都注册完毕,并且所有服务都已经被绑定和配置好,Laravel 就会调用每个服务提供者的 boot 方法。在 boot 方法中,你可以访问已经注册的服务,进行各种启动后的配置,例如设置视图共享数据,注册视图合成器,或者发布资源文件等。

posted @ 2024-05-23 11:28  Laravel自学开发  阅读(107)  评论(0)    收藏  举报