Hak
Hak

Reputation: 1275

Laravel 5 target is not instantiable

Multiple questions already asked about this topic, but I still have this problem and I don't have a clue on what the problem is.

I want to achieve that I can instantiate an interface instead of an implementation.

I'm using Laravel 5, this is the code/structure:

In app, I have created a Contracts folder. In this folder I have Messenger.php:

Messenger.php

<?php namespace App\Contracts;

interface Messenger {

    public function goodmorning($name);

}

In app/Services I have DailyMessenger.php

<?php namespace App\Services;

use App\Contracts\Messenger;

class DailyMessenger implements Messenger {

    public function goodmorning($name)
    {
        return 'Goodmorning '. $name;
    }

}

Now I want to instantiate the interface in my controller:

public function __construct(Messenger $messenger)
    {
        $this->messenger = $messenger;
    }

Now, if I follow the documentation on the Laravel website I should only have to register this in the service container, which I do in the existing AppServiceProvider.php

public function register()
    {
        $this->app->bind(
            'Illuminate\Contracts\Auth\Registrar',
            'App\Services\Registrar'
        );

        $this->app->bind('App\Contacts\Messenger', 'App\Services\DailyMessenger');
    }

If I visit appropriate route that maps to the controller I get the error:

BindingResolutionException in Container.php line 785:
Target [App\Contracts\Messenger] is not instantiable.

I think I have followed the Laravel docs precisely but what am I missing? Thanks in advance :-)

Upvotes: 3

Views: 12864

Answers (1)

Dan Krieger
Dan Krieger

Reputation: 119

Looks like you've spelled the namespace wrong when binding, used App\Contacts instead of App\Contracts. Should be:

$this->app->bind('App\Contracts\Messenger', 'App\Services\DailyMessenger');

Upvotes: 3

Related Questions