Являются ли Laravel автоматическим впрыском только для функций контроллера? - PullRequest
0 голосов
/ 12 декабря 2018

Вот проблема, когда я вызываю функцию контроллера, используя запрос через маршрутизатор, Laravel делает автоматический впрыск.Например:

public function store(Request $request){
    // do staff
} 

здесь Request передается автоматически, но если я вызываю эту store() функцию из другой функции того же контроллера, он говорит, что мне нужно передать 1 аргумент.Он не вводит Request автоматически, так почему же это так?Laravel вводит переменную автоматически только для функций на роутере?как?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Внедрение автоматической зависимости Laravel работает только в том случае, если объекты создаются из контейнера IOC.Когда маршрут разрешается действием Controller, Laravel делает это через контейнер.Поэтому, если в методе Controller есть какие-либо зависимости, они разрешаются автоматически.Но если вы вызываете метод напрямую, например $object->method(), зависимости не разрешаются автоматически.

Так что в вашем случае вы не можете выполнить $this->store().Но вы можете сделать это следующим образом ->

$container = \Illuminate\Container\Container::getInstance();
$container->call([$this, 'store'], []); //$container->call([$object, 'method'], [args]);

Это также верно для других пользовательских классов.Если эти классы разрешаются через контейнер Laravel, их зависимости конструктора разрешаются автоматически.

Пример:

class MyClass
{
    private $dependency;

    public function __construct(AnotherClass $dependency)
    {
        $this->dependency = $dependency;
    }
}

Затем вы можете получить экземпляр объекта MyClass через контейнер, какthis ->

$instance = $container->make(MyClass::class);

Контейнер автоматически создаст экземпляр AnotherClass.Это равно:

$instance = new MyClass(new AnotherClass());

Если у AnotherClass есть зависимости, контейнер будет их рекурсивно создавать.

Пример взят из: source

0 голосов
/ 13 декабря 2018

Вы можете попытаться разрешить из сервисного контейнера "вручную", когда вызываете метод контроллера:

$this->store(app('Request'));

Но, похоже, вам может потребоваться другой шаблон, чем этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...