У меня есть несколько ремесленных команд для выполнения некоторой логики CLI.
class SyncFooCommand extends AbstractBaseSyncCommand
class SyncBarCommand extends AbstractBaseSyncCommand
class SyncBazCommand extends AbstractBaseSyncCommand
Каждая команда ремесленника расширяется abstract class AbstractBaseSyncCommand extends Command implements SyncInterface
.
Благодаря этому внутри абстрактного родительского класса я могу поместить некоторую общую логику.
Я внедряю Carbon или FileSystem иоба работают в дочерних классах как очарование.
<?php
namespace App\Console\Commands\Sync;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\Factory as Filesystem;
use League\Csv\Reader;
abstract class AbstractBaseSyncCommand extends Command implements SyncInterface
{
protected $carbon;
protected $fileSystem;
protected $reader;
public function __construct(
Carbon $carbon,
FileSystem $fileSystem,
Reader $reader
) {
parent::__construct();
$this->carbon = $carbon; // works like a charm
$this->fileSystem = $fileSystem; // works like a charm
$this->reader = $reader; // fails, why?
}
}
В SyncWhateverCommand
я могу легко вызвать и использовать $this->carbon
или $this->fileSystem
, но как только оно достигает $this->reader
, я получаю:
Illuminate\Contracts\Container\BindingResolutionException : Target [League\Csv\Reader] is not instantiable while building [App\Console\Commands\Sync\SyncFooCommand].
at /home/vagrant/code/foo/vendor/laravel/framework/src/Illuminate/Container/Container.php:945
941| } else {
942| $message = "Target [$concrete] is not instantiable.";
943| }
944|
> 945| throw new BindingResolutionException($message);
946| }
947|
948| /**
949| * Throw an exception for an unresolvable primitive.
Что не так? Установка была простой и не требовала никаких привязок.Чего мне не хватает?
Подводя итог:
$csv = $this->reader->createFromPath($path, 'r'); // fails, but I want to use it this way
$csv = Reader::createFromPath($path, 'r'); // works but I don't want facades because they look ugly