Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.06.2017 11:45:49

Отложенные провайдеры

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

Не в сети

#2 05.06.2017 15:44:29

Re: Отложенные провайдеры

потому что объект создаётся коллбэком, а не в момент регистрации. когда ты запрашиваешь этот объект из сервис-контейнера, выполняется коллбэк и вуаля

Не в сети

#3 05.06.2017 16:15:52

Re: Отложенные провайдеры

constb пишет:

потому что объект создаётся коллбэком, а не в момент регистрации. когда ты запрашиваешь этот объект из сервис-контейнера, выполняется коллбэк и вуаля

ок, немного изменил пример:

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. Выходит, что регистрация проходит в любом случае, почему?

Не в сети

#4 05.06.2017 16:27:28

Re: Отложенные провайдеры

а если сделать php artisan clear-compiled ?

ещё может быть на первой загрузке сервис-провайдера, когда фреймворк ещё не сгенерил кэш сервис-провайдеров приложения может дёргать

ещё вариант – что $defer работает только в продакшен-окружении, проверяется установкой APP_ENV в production и APP_DEBUG в false

Не в сети

Подвал раздела