Laravel IoC不会自动解析接口

时间:2016-08-17 04:12:36

标签: laravel laravel-ioc

我刚刚越过这个例子,但它无法解析绑定接口到实现。

拥有以下代码文件:

// File: app/App/Services/Talkable.php
<?php

namespace App\Services;

interface Talkable {
    public function talk();
}



// File: app/App/Services/Cat.php
<?php

namespace App\Services;

use App\Services\Talkable;

class Cat implements Talkable
{
    public function talk()
    {
        return 'meow meow';
    }
}



// File: app/Jobs/MakeSomeNoise.php
<?php

namespace App\Jobs;

use App\Jobs\Job;
use App\Services\Talkable;

class MakeSomeNoise extends Job
{
    private $talkable;

    public function __construct(Talkable $talkable)
    {
        $this->talkable = $talkable;
    }

    public function handle()
    {
        return ($this->talkable->talk());
    }
}

绑定发生在app/Providers/AppServiceProvider.php

// File: app/Providers/AppServiceProvider.php

    ...
    $this->app->bind('App\\Services\\Talkable', 'App\\Services\\Cat');

从控制器发送MakeSomeNoise作业

// File: any controller

    public function makeNoises()
    {
        return $this->dispatch(new MakeSomeNoise); // (*)
    }

在(*),我希望Laravel会自动解析绑定,但事实并非如此。这里的错误,

Argument 1 passed to App\Jobs\MakeSomeNoise::__construct() must be an instance of App\Services\Talkable, none given, called in ...

但是,如果我只是注入控制器构造函数,它工作正常。

有没有想过这个?

1 个答案:

答案 0 :(得分:0)

我在代码中的错误。 DI应该采用handle()方法,而不是构造函数。

public function handle(Talkable $talkable) {
    // blah lbah
}