Laravel 5.7: я добавляю кучу классов в конструктор, но не работает League \ Csv \ Reader - PullRequest
0 голосов
/ 17 октября 2018

У меня есть несколько ремесленных команд для выполнения некоторой логики 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

1 Ответ

0 голосов
/ 17 октября 2018

Может быть, ваше приложение должно знать, как его получить?Нравится

$this->app->bind('SomeAbstraction', function ($app) {
    return new Implementation();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...