Laravel по-русски

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

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

#1 11.11.2017 13:09:13

Ioc container

Добрый день.
Есть главный контроллер

PHP
    /**
     * @var Page
     */
    
protected $page;

    
/**
     * BackendBaseController constructor
     * @param Page $page
     */
    
public function __construct(Page $page)
    {
        
$this->page $page;
    }

В нем внедряю сервис Page
Другие контроллеры наследуют главный контроллер. И когда перегружаю конструктор, приходится все время этот сервис передовать в конструктор.

PHP
   /**
     * BackendShopController constructor
     *
     * @@param Page $page
     * @param Shop $shop
     */
    
public function __construct(Shop $shopPage $page)
    {
        
parent::__construct($page);
        
$this->shop $shop;
    }

Как избавиться от инъекции этого сервиса в чаилд контроллерах? Пытался в сервис провайдере добавить

PHP
$this->app->bind('App\Services\Page');

Но он жалуется на то что я его не передал в чаилд контроллере.

Не в сети

#2 11.11.2017 13:38:46

Re: Ioc container

может как необязательный параметр с инициализацией типа

public function __construct(Shop $shop, Page $page = something)

Не в сети

#3 11.11.2017 13:59:45

Re: Ioc container

Cделай без type-hinting внедрения:

PHP
public function __construct()
{
    
$this->page resolve(Page::class);
}

А вообще, лучше внедрять в конструкторе конкретного контроллера.

Не в сети

#4 11.11.2017 14:53:18

Re: Ioc container

[QUOTE]А вообще, лучше внедрять в конструкторе конкретного контроллера.[/QUOTE]

А вообще, если отойти от всего, без «сильного» di, зависимости в конструкторе — это всегда большая проблема.
В laravel эта проблема решена и перевернута в плюс, в удобство.

Изменено covobo (11.11.2017 15:02:07)

Не в сети

#5 11.01.2018 14:10:29

Re: Ioc container

  1. Cделай без type-hinting внедрения:

забыл ответить. так и сделал. Жаль что айд потом методы не видит.

Не в сети

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