Laravel dependency injection in a command method

I am sorry if for someone the title of my question turns out to be very common, but the truth is that I have been trying for hours to obtain the expected result and I have not succeeded.

It happens, that I am developing a small package for Laravel, and I cannot perform a dependency injection in a method within a command that will contain the package.

Inside the directory structure of my package, I have the ServiceProvider

<?php

namespace AuthorPackage;

use AuthorPackageCommandsBaseCommand;
use AuthorPackageContractsMyInterface;
use IlluminateSupportServiceProvider;

class PackageServiceProvider extends ServiceProvider
{
/**
* The commands to be registered.
*
* @var array
*/
protected $commands = [
AuthorPackageCommandsExampleCommand::class
];

/**
* Register services.
*
* @return void
*/
public function register()
{
if (! $this->app->configurationIsCached()) {
$this->mergeConfigFrom(__DIR__ . '/../config/package.php', 'package');
}

$this->app->bind(MyInterface::class, BaseCommand::class);
}

/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
if ($this->app->runningInConsole()) {
$this->publishes([
__DIR__ . '/../config/package.php' => config_path('package.php')
], 'package-config');

$this->configureCommands();
}

}

/**
* Register the package's custom Artisan commands.
*
* @return void
*/
public function configureCommands()
{
$this->commands($this->commands);
}
}

As you can see from the register method, I am creating a binding for when it calls the MyInterface interface, it returns the concrete BaseCommand class

    public function register()
{
...
$this->app->bind(MyInterface::class, BaseCommand::class);
}

The structure of the ExampleCommand file is as follows:

<?php

namespace AuthorPackageCommands;

use AuthorPackageContractsMyInterface;
use IlluminateConsoleCommand;

class ExampleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'my:command';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Command Description';

/**
* Execute the console command.
*
* @return void
*/
public function handle(MyInterface $interface)
{
// TODO
}
}

But when I run the command, I get the following error:

TypeError 

Argument 1 passed to AuthorPackageCommandsExampleCommand::handle() must be an instance of AuthorPackageContractsMyInterface, instance of AuthorPackageCommandsBaseCommand given

I wonder why dependency injection is not working, in essence it should inject the concrete BaseCommand class into the handle method of the ExampleCommand class, but it isn’t. I would appreciate any help you can give me.

from Newest questions tagged laravel-5 – Stack Overflow https://ift.tt/2GCA4tA
via IFTTT

Related Posts

Codeigniter : Parse error: syntax error, unexpected ‘const’ (T_CONST), expecting variable (T_VARIABLE) in Laravel project

I’m getting following error: **Parse error: syntax error, unexpected ‘const’ (T_CONST), expecting variable (T_VARIABLE)** Note : It’s working in local but facing issue in production server. private…

Firebase receive notification while tab is active or on focus

What i want is to be able to perform an action when a user receives a notification while the browser is open and tab is active or…

Laravel’s alias loader does not find class

We have a legacy project that we cannot update and we need to make some changes in symfony’s Response.php in vendor. We have solved this by copying…

Laravel 5 – generic document management

I have a system where you can create different types of unique documents. For instance, one document is called Project Identified and this expects certain inputs. Originally,…

Laravel Nova limit the results in indexQuery

I ran intro a situation where I need to limit the results of a resource to only 3 results. To be more specific, based on the logged…

Auditoria en laravel 5.8 [closed]

Cómo puedo automatizar el registro de actividades de un usuario en laravel? Si un usuario ingresa a un app de laravel, debo guardar toda su actividas, a…

Leave a Reply

Your email address will not be published.