Laravel 依赖注入“不可实例化”

Posted

技术标签:

【中文标题】Laravel 依赖注入“不可实例化”【英文标题】:Laravel dependency injection "not instantiable" 【发布时间】:2014-02-28 00:39:22 【问题描述】:

我花了一天时间尝试调试并试图了解出了什么问题,但是......

这是我的代码:

<?php

namespace RememberCalories\Rest;

interface MyJsonResponseInterface

    public function getResponse();

这是我要注入的类:

<?php

namespace RememberCalories\Rest;

class MyJsonResponse implements MyJsonResponseInterface

    protected $success;
    protected $responseCode;
    protected $responseMsg;
    protected $data;

    public function __construct($data, $responseCode=0, $responseMsg='')
    
        $this->data         = $data;
        $this->responseCode = $responseCode;
        $this->responseMsg  = $responseMsg;

        if ( $this->responseCode === 0 ) 
            $this->success = true;
        
    
...

绑定:

\App::bind('MyJsonResponseInterface', function($app, $parameters) 
    $obj = new \RememberCalories\Rest\MyJsonResponse(null);
//    var_dump($obj);
//    die();

    return $obj;
);

最后是控制器:

<?php

use \RememberCalories\MainMenu\MainMenu;
use \RememberCalories\Repository\TargetEloquentRepository as TargetRepository;
use \RememberCalories\Rest\MyJsonResponseInterface;
//use \RememberCalories\Rest\MyJsonResponse;

class BaseController extends Controller 

    protected $viewVars;
    protected $mainMenu;

    //Dependency injection classes
    protected $target;
    protected $myJsonResponse;


    public function __construct(TargetRepository $target, MyJsonResponseInterface $myJsonResponse )
    
        $this->beforeFilter('accessFilter');

        $this->target       = $target;
        //$this->myJsonResponse = $myJsonResponse;

        $this->mainMenu = (new MainMenu())->build();

        $this->prepareViewVariables();
    

所以问题出在BaseController的第二个参数:MyJsonResponseInterface。第一个注入没有问题,但这个我得到一个错误:

照亮\容器\BindingResolutionException

目标 [RememberCalories\Rest\MyJsonResponseInterface] 不是 可实例化。

似乎没有调用 \App::bind('MyJsonResponseInterface' ...) 中的闭包。 我已将其移至服务提供商,结果相同。

但同时如果手动调用\App::make('MyJsonResponseInterface'),一切都是理想的创建。

请告知如何调查。

【问题讨论】:

【参考方案1】:

您需要 App::bind 完整的命名空间 - 所以在您的示例中,App::bind('RememberCalories\Rest\MyJsonResponseInterface')

【讨论】:

非常感谢。它有帮助。

以上是关于Laravel 依赖注入“不可实例化”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:依赖注入身份验证

Laravel:命令中的依赖注入

译深入研究 Laravel 的依赖注入容器

Laravel:如何模拟依赖注入类方法

Laravel 单元测试依赖注入

laravel依赖注入浅析