При использовании отдельного класса для наблюдателя модели, где именно я должен зарегистрировать наблюдателя? В документации сказано вызывать User::observe(new UserObserver);
, но я не уверен, где лучше всего это сделать.
Точное место для регистрации наблюдателя в Laravel 4
Ответы (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
.