Разрешение неразрешимой зависимости ]

Внимание: этот вопрос относится к Laravel 4.

Раньше я использовал Facades в своих контроллерах. Поэтому я знаю, что код работает. Теперь мне нужно ввести инъекцию зависимостей по разным причинам.

После рефакторинга контроллера я получаю следующую ошибку:

Illuminate \ Container \ BindingResolutionException

Разрешение неразрешимой зависимости [Параметр # 0 [$ name]].

Я не могу понять, где проблема. Сообщение об ошибке кажется загадочным для меня, и я этого не понимаю. (Я не вижу проблем с моими параметрами __constructor так как я зарегистрировал привязку для HelpersInterface )

Вот важные части моего кода:

Файл: app / start / global.php

 <?php // ... App::bind('Acme\Interfaces\HelpersInterface', 'Acme\Services\Helpers'); 

Файл: composer.json

 // ... "autoload": { // ... "psr-0": { "Acme": "app/" } }, // ... 

Файл: app / Acme / Контроллеры / BaseController.php

 <?php namespace Acme\Controllers; use Carbon\Carbon; use Controller; use Illuminate\Foundation\Application as App; use Illuminate\View\Factory as View; use Acme\Interfaces\HelpersInterface as Helpers; use Illuminate\Http\Response; class BaseController extends Controller { /** * @var \Illuminate\Foundation\Application */ private $app; /** * @var \Carbon\Carbon */ private $carbon; /** * @var \Illuminate\View\Factory */ private $view; /** * @var \Acme\Interfaces\HelpersInterface */ private $helpers; function __construct(App $app, Carbon $carbon, View $view, Helpers $helpers) { $this->app = $app; $this->carbon = $carbon; $this->view = $view; $this->helpers = $helpers; $lang = $this->app->getLocale(); $now = $this->carbon->now(); $this->view->share('lang', $lang); $this->view->share('now', $now); } /** * Missing Method * * Abort the app and return a 404 response * * @param array $parameters * @return Response */ public function missingMethod($parameters = array()) { return $this->helpers->force404(); } } 

Файл: app / Acme / Services / Helpers.php

 <?php namespace Acme\Services; use Illuminate\Config\Repository as Config; use Illuminate\Database\Connection as DB; use Illuminate\Http\Request; use Illuminate\Routing\Redirector as Redirect; use Illuminate\Session\Store as Session; use Illuminate\Support\Facades\Response; use Illuminate\Translation\Translator as Lang; use Illuminate\View\Factory as View; use Acme\Interfaces\MockablyInterface; use Monolog\Logger as Log; class Helpers implements HelpersInterface { // ... public function __construct( Config $config, Lang $lang, View $view, MockablyInterface $mockably, Log $log, Request $request, Session $session, DB $db, Redirect $redirect, Response $response ) { // ... } // ... } 

Файл: app / Acme / Providers / HelpersServiceProvider.php

 <?php namespace Acme\Providers; use Illuminate\Support\ServiceProvider; use Acme\Services\Helpers; class HelpersServiceProvider extends ServiceProvider { private $db; private $defaultDbConnection; protected function init() { $this->db = $this->app['db']; $this->defaultDbConnection = $this->db->getDefaultConnection(); } public function register() { $this->init(); $this->app->bind('helpers', function () { return new Helpers( $this->app['config'], $this->app['translator'], $this->app['view'], $this->app['mockably'], $this->app->make('log')->getMonolog(), $this->app['request'], $this->app['session.store'], $this->db->connection($this->defaultDbConnection), $this->app['redirect'], $this->app['Illuminate\Support\Facades\Response'] ); }); } 

Solutions Collecting From Web of "Разрешение неразрешимой зависимости ]"

Кажется, ваш конструктор Acme\Services\Helpers принимает параметр $name , но не намекает на тип.

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

Это исправлено. Все учебники об инъекции зависимостей касались конкретных реализаций интерфейсов, поэтому я подумал, что это способ сделать это. Ответ Joseph Silber's заставил меня на правильном пути.

Хитрость заключается в том, чтобы привязать интерфейс к привязке ServiceProvider как показано ниже. Таким образом, Laravel будет знать, как создать экземпляр службы Helpers.

Файл: app / start / global.php

 <?php // ... App::bind('Acme\Interfaces\HelpersInterface', 'helpers');