Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Пытаюсь создать отложенный сервис-провайдер как в данной статье:
https://laravel.ru/docs/v5/providers#отложенные
код моего сервис-провайдера выглядит следующим образом:
class SaveStrServiceProvider extends ServiceProvider
{
protected $defer = true;
public function boot()
{
//
}
public function register()
{
App::bind('App\Helpers\Contracts\SaveStr', function(){
dd(1);
return new SaveEloquent();
});
}
public function provides()
{
return ['App\Helpers\Contracts\SaveStr'];
}
}
В данном коде я использовал
$defer = true;
и
public function provides()
для отложенного создания объекта своего класса SaveEloquent()
Так же в код анонимной функции поместил вызов dd(1) что должно прервать выполнение так же как и exit(1).
Так вот в чем вопрос - в данном случае, объект SaveEloquent() действительно не создается пока я в коде контроллера (например) не обращусь к своему классу (например через внедрение зависимости). Когда вызову методы класса, тогда выполнение прервется и отобразится "1".
Но! Если я не использую все эти примочки для создания отложенного провайдера $defer = true и public function provides() - результат такой же - объект не создается, пока к нему не будет обращения. Почему так?
Не в сети
потому что объект создаётся коллбэком, а не в момент регистрации. когда ты запрашиваешь этот объект из сервис-контейнера, выполняется коллбэк и вуаля
Не в сети
потому что объект создаётся коллбэком, а не в момент регистрации. когда ты запрашиваешь этот объект из сервис-контейнера, выполняется коллбэк и вуаля
ок, немного изменил пример:
class SaveStrServiceProvider extends ServiceProvider
{
protected $defer = true;
public function boot()
{
//
}
public function register()
{
dd(1);
App::bind('App\Helpers\Contracts\SaveStr', function(){
return new SaveEloquent();
});
}
public function provides()
{
return ['App\Helpers\Contracts\SaveStr'];
}
}
В данном случае коллбэки нипричем, т.к. перенес dd(1) выше. Как написано по ссылке из документации: "вы можете отложить регистрацию до момента, когда одна из этих привязок будет запрошена из сервис-контейнера. " Я создал "отложенный" провайдер, указав свойство $defer и метод provides(). Все равно работа скрипта прерывается, хотя метод register() не должен срабатывать пока нет запроса к App\Helpers\Contracts\SaveStr. Выходит, что регистрация проходит в любом случае, почему?
Не в сети
а если сделать php artisan clear-compiled ?
ещё может быть на первой загрузке сервис-провайдера, когда фреймворк ещё не сгенерил кэш сервис-провайдеров приложения может дёргать
ещё вариант – что $defer работает только в продакшен-окружении, проверяется установкой APP_ENV в production и APP_DEBUG в false
Не в сети
Страницы 1