webentwicklung-frage-antwort-db.com.de

Nicht auflösbare Abhängigkeitsauflösung [Parameter # 0 [<erforderlich> $ name]]

Warnung: Diese Frage ist spezifisch für Laravel 4.

Ich habe Facades schon in meinen Controllern verwendet. Daher weiß ich, dass der Code funktioniert. Jetzt muss ich aus verschiedenen Gründen die Abhängigkeitsinjektion einführen.

Nach dem Refactoring des Controllers erhalte ich folgende Fehlermeldung:

Illuminate\Container\BindingResolutionException

Nicht auflösbare Abhängigkeitsauflösung [Parameter # 0 [$ name]].

Ich kann nicht herausfinden, wo das Problem liegt. Die Fehlermeldung erscheint mir kryptisch und ich verstehe sie nicht. (Ich sehe kein Problem mit meinen __constructor-Parametern, seit ich die Bindung für die HelpersInterface registriert habe.)

Hier sind die wichtigen Teile meines Codes:

Datei: app/start/global.php

<?php

// ...

App::bind('Acme\Interfaces\HelpersInterface', 'Acme\Services\Helpers');

Datei: composer.json

// ...

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

// ...

Datei: app/Acme/Controller/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();
    }

}

Datei: 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
    ) {
        // ...
    }

// ...

}

Datei: 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']
        );
    });
}
16
Martin

Es scheint, dass Ihr Acme\Services\Helpers-Konstruktor einen $name-Parameter verwendet, der Typ ist jedoch nicht angegeben.

Laravels IoC ist keine Zauberei. Wenn Sie nicht für jeden Parameter einen Typhinweis angeben, kann der IoC-Container nicht wissen, was übergeben werden soll.

17
Joseph Silber

Habe es behoben. Alle Tutorials zur Abhängigkeitsinjektion bezogen sich auf konkrete Implementierungen von Schnittstellen, so dass ich dachte, dass dies der richtige Weg ist. Joseph Silber's answer brachte mich auf den richtigen Weg.

Der Trick besteht darin, das Interface wie unten gezeigt an die Bindung der ServiceProvider zu binden. Auf diese Weise wird Laravel wissen, wie der Helpers-Dienst instanziiert werden kann.

Datei: app/start/global.php

<?php

// ...

App::bind('Acme\Interfaces\HelpersInterface', 'helpers');
1
Martin

Für mich war es nur eine Frage des Laufens

php artisan optimize:clear
0
CIRCLE