【问题标题】:Laravel dependency injection "not instantiable"Laravel 依赖注入“不可实例化”
【发布时间】: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'),一切都是理想的创建。

请告知如何调查。

【问题讨论】:

    标签: php dependency-injection laravel


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2015-04-06
    • 2016-10-05
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多