【问题标题】:Unresolvable dependency resolving [Parameter #0 [ <required> $name ]]无法解析的依赖解析 [Parameter #0 [ <required> $name ]]
【发布时间】:2014-07-30 05:37:24
【问题描述】:

警告:这个问题是 Laravel 4 特有的。

我之前一直在我的控制器中使用 Facades。因此我知道代码正在运行。现在由于各种原因需要引入依赖注入。

重构控制器后出现以下错误:

照亮\容器\BindingResolutionException

无法解析的依赖解析 [Parameter #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/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();
    }
 
}

文件: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']
        );
    });
}

【问题讨论】:

    标签: php oop laravel dependency-injection laravel-4


    【解决方案1】:

    对我来说,这只是跑步的问题

    php artisan optimize:clear
    

    【讨论】:

    • 我认为这与修改您的组件文件有关?至少在我的情况下,这是原因。当我在路由文件 (web.php) 中编辑某些内容时,我总是必须执行此命令。
    【解决方案2】:

    您的Acme\Services\Helpers 构造函数似乎采用$name 参数,但没有类型提示。

    Laravel 的 IoC 并不神奇。如果您没有为每个参数提供类型提示,则 IoC 容器无法知道要传入什么。

    【讨论】:

    • 感谢您的帮助 Joseph Silber。我添加了一些更多的代码 sn-ps 以表明我已经键入提示了所有内容。此外,我还有一个 ServiceProvider 应该告诉 IoC 容器如何制作具体的 HelpersInterface 实现。我错过了什么吗?
    • 我接受了你的回答,因为你是对的。 Laravel 不知道如何实例化助手服务。这让我在正确的轨道上修复它。我提供了更多的代码 sn-ps 和一个可行的解决方案。您或其他人可能有兴趣:-)
    • @Martin - 只需使用完整的类名 (Acme\Services\Helpers) 作为服务提供者中的键。这样您就可以坚持使用App::bind('Acme\Interfaces\HelpersInterface', 'Acme\Services\Helpers') 来注册具体类型(顺便说一句,您应该通过$this-&gt;app-&gt;bind() 在您的服务提供商中执行此操作)。
    • 我有一个非常简单的类,它只需要一个密钥(字符串)作为参数。我基本上只是在单例回调中返回一个“new MyClass(config('secret')”。我尝试添加一个“string”类型提示,但仍然出现此错误。
    【解决方案3】:

    解决了。所有关于依赖注入的教程都提到了接口的具体实现,所以我认为这就是解决问题的方法。 Joseph Silber's 回答让我走上了正轨。

    诀窍是将接口绑定到ServiceProvider 的绑定,如下所示。这样 Laravel 就会知道如何实例化 Helpers 服务。

    文件:app/start/global.php

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

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2019-04-23
      • 2019-08-23
      • 2019-05-25
      • 2018-05-11
      • 2021-07-21
      • 1970-01-01
      • 2021-06-12
      • 2015-12-25
      相关资源
      最近更新 更多