Инъекция зависимостей Laravel в промежуточном программном обеспечении

Я использую промежуточное ПО Authentication по умолчанию Laravel-5.0, но я изменил подпись функции дескриптора, чтобы иметь:

 public function handle($request, Closure $next, AuthClientInterface $authClient) 

Я также зарегистрировал AuthClientInterface у поставщика услуг:

 public function register() { $this->app->bind('App\Services\Contracts\AuthClientInterface', function() { return new AuthClient( env('AUTH_SERVER_URL'), env('AUTH_SESSION_URL'), env('AUTH_CLIENT_ID') ); }); } 

Однако, несмотря на это, я вижу следующую ошибку:

 Argument 3 passed to HelioQuote\Http\Middleware\Authenticate::handle() must be an instance of HelioQuote\Services\Contracts\HelioAuthClientInterface, none given, called in C:\MyApp\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php on line 125 and defined... 

Может ли кто-нибудь увидеть, что я делаю неправильно?

EDIT: я получил его работу, передав HelioAuthClientInterface в конструктор промежуточного программного обеспечения. Однако я думал, что контейнер IoC также будет добавлять зависимость к методам в дополнение к конструктору.

Вы не можете делать инъекции зависимостей в методе handle в запросе напрямую, делайте это в конструкторе.

call_user_func вызывается call_user_func , поэтому любая инъекция здесь не будет работать.

 <?php namespace App\Http\Middleware; use Closure; use App\Foo\Bar\AuthClientInterface; # Change this package name class FooMiddleware { protected $authClient; public function __construct(AuthClientInterface $authClient) { $this->authClient = $authClient; } public function handle(Request $request, Closure $next) { // do what you want here through $this->authClient } } 

IoC Laravel обрабатывает метод конструктора для всех объектов по умолчанию. IoC будет только вводить зависимости в функции / методы, обрабатываемые маршрутизатором. Это может быть закрытие, используемое для обработки маршрута или, чаще, методы контроллера, используемые для обработки маршрутов.

IoC не выполняет инъекцию зависимостей метода для любого другого объекта по умолчанию. Вы можете вызывать методы самостоятельно через IoC и разрешать зависимости, но инфраструктура делает это только для обработчиков маршрутов. Вы можете взглянуть на этот вопрос / ответ для получения дополнительной информации об использовании инъекции зависимостей метода за пределами контроллера: можно ли использовать инъекцию зависимостей метода вне контроллера? ,

Обработка этого путем ввода вашей зависимости через ваш конструктор – правильный путь, если вы хотите продолжать использовать инъекцию зависимостей.

Здесь вы не можете изменить подпись метода. Просто вы можете использовать что-то вроде этого:

 public function handle($request, Closure $next) { // Get the bound object to this interface from Service Provider $authClient = app('App\Services\Contracts\AuthClientInterface'); // Now you can use the $authClient } 

Кроме того, вы можете использовать метод __construct для достижения этого, проверьте ответ, заданный – Francis.TM .