При использовании отдельного класса для наблюдателя модели, где именно я должен регистрировать наблюдателя? В документации говорится, что вы вызываете 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);
Или:
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
.