Warning: This question is Laravel 4 specific.
I've been using Facades in my controllers before. Therefore I know the code is working. Now I need to introduce dependency injection for various reasons.
After refactoring the controller I get following error:
Illuminate \ Container \ BindingResolutionException
Unresolvable dependency resolving [Parameter #0 [ $name ]].
I can't figure out where the problem is. The Error message seems cryptic to me and I don't understand it. (I don't see any problem with my __constructor
parameters since I've registered the binding for the HelpersInterface
)
Here are the important parts of my code:
File: app/start/global.php
<?php // ... App::bind('Acme\Interfaces\HelpersInterface', 'Acme\Services\Helpers');
File: composer.json
// ... "autoload": { // ... "psr-0": { "Acme": "app/" } }, // ...
File: app/Acme/Controllers/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(); } }
File: 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 ) { // ... } // ... }
File: 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'] ); }); }
For me it was just a matter of running
php artisan optimize:clear
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With