在Laravel 4中处理自定义类依赖的正确方法


Proper way to deal with class dependency in a custom class in Laravel 4

我正在向我的Laravel库添加一个自定义类,并且似乎非常接近成功。下面是我到目前为止所做的,然后是我得到的错误:

我的类名为Connector,位于Acme/Api/Zurmo/Connector

这个类需要另一个类,所以这是它的代码:

use Acme'Api'Rest'ApiRestHelper;
class Connector implements ConnectorInterface {
    protected $rest;
    public function __construct(ApiRestHelper $rest)
    {
        $this->rest = $rest;
    }

和ApiRestHelper类是这样开始的:

namespace Acme'Api'Rest;
class ApiRestHelper {

然后我刚刚在routes.php中添加了一个快速闭包来测试它是否有效,(它没有):

Route::get('/', function()
{
    $connector  = new Acme'Api'Zurmo'Connector;
    var_dump($connector); 
});

这是我得到的错误:

参数1传递给Acme'Api'Zurmo'Connector::__construct()必须是一个Acme'Api'Rest'ApiRestHelper的实例,none given

我首先假设我搞砸了我的命名空间,文件命名,但Laravel可以找到类,因为我可以做以下事情而不会出错:

$rest = new Acme'Api'Rest'ApiRestHelper;
var_dump($rest);

你知道我错过了什么吗?谢谢你。

构造函数期望您传入一个resthelper实例:

//manual dependency injection
Route::get('/', function()
{
    $connector  = new Acme'Api'Zurmo'Connector(new Acme'Api'Rest'ApiRestHelper);
    var_dump($connector); 
});

或者改变构造函数

//creates a hard dependency
use Acme'Api'Rest'ApiRestHelper;
class Connector implements ConnectorInterface {
    protected $rest;
    public function __construct()
    {
        $this->rest = new ApiRestHelper();
    }
}

一个更高级的选择是使用IOC容器进行依赖注入,但那超出了这个答案的范围

http://laravel.com/docs/ioc