У меня есть несколько ремесленных команд для выполнения некоторой логики интерфейса командной строки.
class SyncFooCommand extends AbstractBaseSyncCommand
class SyncBarCommand extends AbstractBaseSyncCommand
class SyncBazCommand extends AbstractBaseSyncCommand
Каждая команда artisan расширяет 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






Может быть, ваше приложение должно знать, как его получить? Нравиться
$this->app->bind('SomeAbstraction', function ($app) {
return new Implementation();
});
какой класс вы связали в
appserviceprovider class