我正在尝试使用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。
答案 0 :(得分:1)
在这一行:
$module = new ModuleService;
您正在直接调用Module类,而不是传入SelectorInterface
。
要使IoC正常工作,您可以使用它绑定和 make类。再次尝试该行:
$module = App::make('License\Services\ModuleSelector\SelectorInterface');
alernative是将它直接注入你的repos构造函数,只要repo是由IoC容器创建的,你的混凝土就会被自动注入。
答案 1 :(得分:0)
你没有一个标记为实际“实现SelectorInterface”的类。