简体   繁体   中英

Laravel IoC doesn't automatically resolving the interface

I've just crossed this example, but it fails to resolve binding interface to implementation.

Having the follow code files:

// 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());
    }
}

The binding are taken place in app/Providers/AppServiceProvider.php

// File: app/Providers/AppServiceProvider.php

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

The MakeSomeNoise job is dispatched from a Controller

// File: any controller

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

At the (*), I expect Laravel will automatically resolve the binding, but it doesn't. Here the error,

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

But if I just inject into controller constructor, it works fine.

Any thought on this?

My mistake in the code. The DI should be taken in handle() method, not constructor.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM