Laravel无法通过__construct实例化接口(使用App :: bind)

时间:2014-07-21 09:05:20

标签: php laravel laravel-4

我正在尝试使用Laravel的__construct方法通过bind()解析课程。

我在这做什么:

routes.php(当然我会把它从这里移开)

// Bindings
App::bind(
    'License\Services\ModuleSelector\SelectorInterface',
    'License\Services\ModuleSelector\ModuleSelector'
);

SelectorInterface.php - 我期望在__construct方法中使用的界面。

<?php namespace License\Services\ModuleSelector;


interface SelectorInterface {

    /**
     * Simply return query that will select needle module fields
     *
     * @return mixed
     */
    public function make();

}

ModuleSelector.php - 这是我想通过Laravel的DI解决的课程(见下面的例子)。

<?php namespace License\Services\ModuleSelector;    

use License\Services\ModuleSelector\Selector;   

class ModuleSelector extends Selector
{       
    /**
     * Get module by it's code
     *
     * @return mixed
     */
    public function find()
    {
        return $this->make()
            ->where('code', $module_code)
            ->first();
    }    
}

Module.php

<?php namespace License\Services\ModuleType;    

use License\Services\ModuleType\TypeInterface;
use License\Services\ModuleSelector\SelectorInterface;    

class Module 
{    
    ...    

    function __construct(SelectorInterface $selector)
    {
        $this->selector = $selector;
    }
    ...
}

发生错误的地方:

在我的回购中,我有use License\Services\ModuleType\Module as ModuleService;

比有find()的方法:

/**
 * Find module by its code with all data (types, selected type)
 * @return mixed
 */
public function find($module_code)
{
    $module = new ModuleService;

    // Get module id in order to use build in relations in framework
    $module = $this->module->find($module_code);

    ...
}

所以,换句话说,我有2个类和一个接口。我想做的是:

1)创建Class1.php / Class2.php / Class2Interface.php

2)在Class1.php的{​​{1}}我指定__construct

3)实例化__construct(Class2Interface $class2)

我做错了什么?找到的示例here

2 个答案:

答案 0 :(得分:1)

在这一行:

$module = new ModuleService;

您正在直接调用Module类,而不是传入SelectorInterface

的实例

要使IoC正常工作,您可以使用它绑定 make类。再次尝试该行:

$module = App::make('License\Services\ModuleSelector\SelectorInterface');

alernative是将它直接注入你的repos构造函数,只要repo是由IoC容器创建的,你的混凝土就会被自动注入。

答案 1 :(得分:0)

你没有一个标记为实际“实现SelectorInterface”的类。