Home > Software engineering >  Dependency Injection
Dependency Injection

Time:07-22

I have this code

Controller

<?php

namespace App\Exchange\Helpers;

use App\Contracts\Exchange\Notification;

class Locker
{
    protected $notification;

    public function __construct(Notification $notification)
    {
        $this->notification = $notification;
    }

    public function index()
    {
        return $this->notification->sendMessage('test');
    }

Interface

<?php

namespace App\Contracts\Exchange;

interface Notification
{
    public function sendMessage($message);
}

File Kernel.php

namespace App\Providers;

use App\Contracts\Exchange\Notification;
use App\Exchange\Helpers\Notification\Telegram;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(Notification::class, function (){
            return new Telegram(env('TELEGRAM_EXCHANGE_TOKEN'), env('TELEGRAM_EXCHANGE_CHAT_ID'));
        });
    }

If I try to use new Locker(); I get a TypeError error: Too few arguments to function App\Exchange\Helpers\Locker::__construct(), 0 passed in Psy Shell code on line 1 and exactly 1 expected

CodePudding user response:

Your controller should extend Illuminate\Routing\Controller in order for dependency injection to work. Or just refactor your __construct method using app helper:

<?php

namespace App\Exchange\Helpers;

use App\Contracts\Exchange\Notification;

class Locker
{
    protected $notification;

    public function __construct()
    {
        $this->notification = app(Notification::class);
    }

    public function index()
    {
        return $this->notification->sendMessage('test');
    }
}
  • Related