无法解析的依赖关系解析

时间:2016-06-22 10:34:20

标签: php laravel lumen

我在routes.php项目中有以下代码。

class Foo {
    public function __construct($name) {
    }
}

$app->get('/', function () {
    return "Ola, mundo! :)";
});

$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
    $app->post('v1/payment/create', function(Foo $api){
        dd($api);
    });
});

当我尝试访问我的/ api / v1 / payment / create时,这给了我错误:

Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] in class Foo

显然我没有将任何值传递给$ name。我的问题是如何做到这一点,这是最可行和最正确的方式。

1 个答案:

答案 0 :(得分:2)

您需要向IOC容器添加绑定。 https://laravel.com/docs/5.2/container#binding

在Lumen中,$app是容器的一个实例,因此您可以在同一个文件中执行绑定,如下所示:

class Foo
{

    public function __construct($name)
    {

    }
}

$app->bind(Foo::class, function($app){
    return new Foo('David');
});

$app->get('/', function () {
    return "Ola, mundo! :)";
});

$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
    $app->post('v1/payment/create', function(Foo $api){
        dd($api);
    });
});

您可能希望在服务提供商中执行此操作,但由于您的示例代码具有内联定义的类,因此我认为这是描述解决方案的最简单方法

编辑以解决$name参数变化很大的情况,有几种方法可以处理它。

Ditch IOC并在路由闭包中创建Foo实例:

$app->get('blah', function(){
    $foo = new Foo('blahblah');
});
$app->get('splarg', function(){
    $foo = new Foo('blobblob');
});

更改Foo并添加setName方法:

class Foo
{
    private $name;
    public function setName($name)
    {
        $this->name = $name;
    }

}

$app->get('blah', function(Foo $foo){
    $foo->setName('blahblah');
});
$app->get('splarg', function(Foo $foo){
    $foo->setName('blobblob');
});

创建一个FooFactory并注入:

Class FooFactory
{
    public function createFoo($name)
    {
        return new Foo($name);
    }
}

$app->get('blah', function(FooFactory $factory){
    $foo = $factory->createFoo('blahblah');
});
$app->get('splarg', function(FooFactory $factory){
    $foo = $factory->createFoo('blobblob');
});