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

时间:2014-02-04 06:51:39

标签: php dependency-injection laravel

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

所以这是我的代码:

<?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。第一个注入没有问题,但这个我得到一个错误:

  

Illuminate \ Container \ BindingResolutionException

     

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

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

但同样如果要手动调用\App::make('MyJsonResponseInterface'),理想情况下就会创建所有内容。

请告知调查方法。

1 个答案:

答案 0 :(得分:1)

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