【问题标题】:Unresolvable dependency resolving无法解析的依赖解析
【发布时间】:2016-10-24 05:51:09
【问题描述】:

我的 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。我的问题是如何做到这一点,最简单和最正确的方法。

【问题讨论】:

标签: php laravel lumen


【解决方案1】:

您需要向 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参数变化很大的情况,有几种方法可以处理它。

抛弃 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');
});

【讨论】:

  • 按我想要的方式工作!只是看文档我无法弄清楚。谢谢
  • 太好了,很高兴能帮到你
  • 有没有办法在$app->post()里面绑定?
  • 并非如此,这打破了控制反转的整个想法。如果需要为每条路由定义具体的$name,则需要重构。要么在路由关闭中创建 Foo 实例(快速,但违反 IOC 原则),将 Foo 更改为具有 setName() 方法,或者创建一个 FooFactory 接受名称并返回一个新的 Foo实例,然后将其注入
  • 我进行了编辑以更好地解释我的评论
猜你喜欢
  • 2019-01-24
  • 2015-01-08
  • 2018-01-01
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多