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

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

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


person Gowtham Selvaraj    schedule 16.07.2014    source источник


Ответы (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);

Or:

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.

person Tomas Buteler    schedule 16.07.2014
comment
Ваш комплексный подход сработал для меня как шарм. Спасибо! - person lephleg; 09.05.2017