Laravel по-русски
      
      
    Русское сообщество разработки на 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