Подтвердить что ты не робот

Точное место для регистрации наблюдателя в Laravel 4

При использовании отдельного класса для наблюдателя модели, где именно я должен регистрировать наблюдателя? В документации говорится, что вы вызываете User::observe(new UserObserver);, но я не уверен, где лучше всего сделать это.

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

4b9b3361

Ответ 1

Поскольку наблюдатель - это всего лишь совокупность событий, которые вы слушаете, я бы сказал, где-то там, где Laravel предлагает вам разместить отдельные события: по методу boot самой модели.

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

        User::observe(new UserObserver);
    }
}

Где поставить класс UserObserver немного более гибким и зависит от того, насколько он будет сложным.

Для простых наблюдателей

Если вы можете загружать его каждый раз при запуске приложения, создайте файл app/observers.php, а затем поместите его в конец вашего app/start/global.php:

require app_path().'/observers.php';

В качестве альтернативы вы можете использовать композитор для автозагрузки этого одного файла, добавив composer.json:

{
    "autoload": {
        "classmap": [
            //...
        ],
        "files": [
            "app/observers.php"
        ]
    }
}

Для более сложных наблюдателей

Если вы планируете иметь много разных наблюдателей, я бы сказал, создайте собственное пространство имен и пусть Laravel/Composer сделает автозагрузку для вас. Чтобы сделать это, создайте папку типа app/MyNamespace/Observers, затем поместите в нее каждый файл наблюдателя (каждый из них точно так же, как класс, т.е. UserObserver.php).

Ваш класс UserObserver.php должен выглядеть следующим образом:

<?php

namespace MyNamespace\Observers;

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

    public function saved($model)
    {
        // ...
    }
}

И вам придется объявлять полный класс всякий раз, когда вы его используете:

User::observe(new MyNamespace\Observers\UserObserver);

Или:

use MyNamespace\Observers\UserObserver;

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

        User::observe(new UserObserver);
    }
}

Наконец, отредактируйте свой composer.json и добавьте пространство имен, чтобы выполнить автозагрузку PSR-0:

{
    "autoload": {
        "classmap": [
            //...
        ],
        "psr-0": [
            "MyNamespace": "app/"
        ]
    }
}

PS: Не забудьте запустить composer dump-autoload после редактирования composer.json.