промежуточное ПО laravel в __construct

Я использую https://github.com/appstract/laravel-multisite, который работает отлично.

В моих методах контроллера я могу var_dump current_site(), и отображается правильная информация.

Моя проблема заключается в том, что в моем методе контроллера __construct функция current_site возвращает null, т.е. объект multi_site еще не настроен.

public function __construct()
{
    //this returns null
    var_dump(current_Site());
}


public function index()
{
    //this works
    var_dump(current_Site());
}

Я предполагаю, что конструктор вызывается до того, как маршрутизация была выполнена, и, следовательно, это проблема, но я хотел вызвать функцию current_site только один раз и чтобы контроллер знал, какой сайт используется с самого начала, чтобы все методы и т. д. знали.

Я думаю, что это просто недостаток знаний с моей стороны, а не проблема с кодом... какие-нибудь рекомендации?

Мои группы маршрутов, как это

'domain' => 'dealer1.'.config('multisite.host'),
'as' => 'dealer1.',
'middleware' => 'site:dealer1'

Я знаю, что это связано с промежуточным программным обеспечением, которое не выполняется до вызова __construct, но должен ли я вызывать его, выполняя

  $this->middleware('CurrentSite');

wКакой шаг я должен сделать дальше?

Редактировать

Я изменил свой код на

 public function __construct()
    {



        $this->middleware(function ($request, $next) {
            //this dumps correctly
            var_dump(current_Site() );
               $this->currentSite = current_Site();
            return $next($request);
        });
        //this is null
       //var_dump($this->currentSite);
       //die("here");

    }

person Jim Phillips    schedule 07.07.2017    source источник


Ответы (1)


Вы можете попробовать что-то вроде:

public function __construct()
{
    $this->middleware(function ($request, $next) {
        var_dump(current_Site());

        return $next($request);
    });
}

https://laravel.com/docs/master/controllers#controller-middleware

Надеюсь это поможет!

person Rwd    schedule 07.07.2017
comment
Это выводит текущие данные... но когда я пытаюсь $this->currentSite = current_Site(); свойство равно нулю - person Jim Phillips; 07.07.2017
comment
@JimPhillips Несмотря на то, что var_dump($this->currentSite) написано после промежуточного программного обеспечения, оно все еще выполняется до закрытия промежуточного программного обеспечения. Это не работает по той же причине, по которой не работала ваша вспомогательная функция до того, как вы поместили ее в закрытие промежуточного программного обеспечения. - person Rwd; 07.07.2017
comment
$this->currentSite должен быть установлен, если/когда вы пытаетесь использовать его в одном из ваших методов контроллера - person Rwd; 07.07.2017
comment
Я думаю, что это может помочь... Я не понимаю, как работает код, который вы добавили, но я посмотрю его.. спасибо - person Jim Phillips; 07.07.2017
comment
@JimPhillips Это потому, что вы передаете закрытие методу middleware(). Это закрытие не вызывается сразу, а вместо этого сохраняется в массиве, а затем вызывается позже с остальным промежуточным программным обеспечением вашего приложения. - person Rwd; 07.07.2017
comment
Спасибо за вашу помощь - person Jim Phillips; 07.07.2017
comment
@Rwd как я могу использовать это в laravel 5.1! так как нет способа использовать этот клоузер по умолчанию! - person Alauddin Ahmed; 30.12.2019
comment
@AlauddinAhmed Вы также используете многосайтовый пакет? - person Rwd; 30.12.2019
comment
@Rwd, нет, но у меня также есть сценарий, в котором мне нужно использовать этот Clouser, как вы ответили здесь .. Который недоступен в laravel 5.1 - person Alauddin Ahmed; 30.12.2019
comment
@AlauddinAhmed Я бы определенно предложил создать новый вопрос, поскольку похоже, что он выходит за рамки этого. - person Rwd; 30.12.2019