Jimmy Obonyo Abor
Jimmy Obonyo Abor

Reputation: 7875

Laravel service provider not binding to contract

i have below contract/interface which is binded by a service provider ,however the i get below error :

ReflectionException in RouteDependencyResolverTrait.php line 81: Class App\Http\Controllers\RocketShipContract does not exist

What am i doing wrong ?

Contract

namespace App\Contracts\Helpers;

Interface RocketShipContract
{

    public function blastOff();


}

The concrete class

namespace app\Contracts;

use App\Contracts\Helpers\RocketShipContract;

class RocketShip implements RocketShipContract
{

    public function blastOff()
    {

        return 'Houston, we have ignition';

    }

}

The service provider

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Contracts\RocketShip;

class RocketShipServiceProvider extends ServiceProvider
{
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Contracts\Helpers\RocketShipContract', function($app){

            return new  App\Contracts\RocketShip($app['HttpClient']);

        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['App\Contracts\Helpers\RocketShipContract'];
    }

}

The controller

public function test(RocketShipContract $rocketship)
    {
         $boom = $rocketship->blastOff();

        return view('test.index', compact('boom'));
    }

Upvotes: 3

Views: 1901

Answers (1)

Bogdan
Bogdan

Reputation: 44526

The error you're getting hints at the problem: the class is being resolved in the App\Http\Controllers namespace. That's because you need to specify the full namespace of your interface in the controller.

So either include it with a use statement:

use App\Contracts\Helpers\RocketShipContract;

Or type hint the full namespace:

public function test(App\Contracts\Helpers\RocketShipContract $rocketship)
{
    // ...
}

Upvotes: 2

Related Questions