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 @   Laravel自学开发  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示