在Laravel 4注册观察员的确切位置

Gow*_*raj 12 model observers laravel

当为模型观察者使用单独的类时,我应该在哪里注册观察者?文档说要打电话,User::observe(new UserObserver);但我不知道最好的地方在哪里.

https://laravel.com/docs/5.4/eloquent#observers

Tom*_*ler 21

由于观察者只是您正在收听的事件的集合,我会说它放在Laravel建议您放置单个事件的地方:boot模型本身的方法.

class User extends Eloquent
{
    public static function boot()
    {
        parent::boot();

        User::observe(new UserObserver);
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里UserObserver上课更灵活,取决于它最终会变得多么复杂.

对于简单的观察者

如果您每次运行应用程序时都无法加载它,请创建一个app/observers.php文件,然后将其放在app/start/global.php:

require app_path().'/observers.php';
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用composer通过附加以下内容自动加载该文件composer.json:

{
    "autoload": {
        "classmap": [
            //...
        ],
        "files": [
            "app/observers.php"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

对于更复杂的观察者

如果你计划有许多不同的观察者,我会说创建你自己的命名空间,让Laravel/Composer为你做自动加载.为了做到这一点,创建一个像这样的文件夹app/MyNamespace/Observers,然后将每个观察者文件放在其中(每个名称与类完全相同 - 即UserObserver.php).

你的UserObserver.php课现在应该是这样的:

<?php

namespace MyNamespace\Observers;

class UserObserver
{
    public function saving($model)
    {
        // ...
    }

    public function saved($model)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

每当你使用它时,你必须声明完整的类:

User::observe(new MyNamespace\Observers\UserObserver);
Run Code Online (Sandbox Code Playgroud)

要么:

use MyNamespace\Observers\UserObserver;

class User extends Eloquent
{    
    public static function boot()
    {
        parent::boot();

        User::observe(new UserObserver);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,编辑composer.json并添加命名空间以遵循PSR-0自动加载:

{
    "autoload": {
        "classmap": [
            //...
        ],
        "psr-0": [
            "MyNamespace": "app/"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:composer dump-autoload编辑后不要忘记运行composer.json.