(Symfony 4) Как вручную добавить класс вендора в контейнер, а затем внедрить в класс репозитория / службы? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть класс репозитория для фотографий:

use Imagine\Image\ImageInterface;
use Imagine\Image\ImagineInterface;
use Imagine\Image\BoxInterface;

class PhotoRepository extends ServiceEntityRepository
{

protected $imagineInterface;
protected $mode;
protected $box;

public function __construct(ImagineInterface $imagineInterface,
    BoxInterface $box,
    $mode = ImageInterface::THUMBNAIL_OUTBOUND)
    {
        $this->imagineInterface = $imagineInterface; 
        $this->$box = $box; 
         $this->mode = $mode;
    }

Я получаю типичный Cannot autowire service "App\Repository\PhotoRepository": argument "$box" of method "__construct()" references interface "Imagine\Image\BoxInterface" but no such service exists. Did you create a class that implements this interface?

Класс Imagine \ ImageBox явно существует в моей папке поставщика и реализует BoxInterface, он начинается следующим образом:

namespace Imagine\Image;

use Imagine\Exception\InvalidArgumentException;

/**
 * A box implementation
 */
final class Box implements BoxInterface
{
    /**
     * @var integer
     */
    private $width;

Вот изображение моей структуры папок, вы можете видеть, что этот класс Box существует и что он реализует BoxInterface:

enter image description here

Я застрял, потому что он говорит, что служба не существует, но вы можете видеть, что она существует.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 08 марта 2019

Чтобы ответить на ваш вопрос относительно работы с интерфейсами, проверьте этот раздел документации: https://symfony.com/doc/current/service_container/autowiring.html#working-with-interfaces

Однако вы неправильно понимаете цель услуг. BoxInterface Imagine ни в коем случае не является услугой и не должен объявляться как единое целое. Служба необходима только , когда вам нужен только один ее экземпляр во всем приложении. BoxInterface просто описывает координаты изображения, поэтому их будет столько, сколько вам нужно.

Просто создайте, например, $box = new Imagine\Image\Box(50, 50);, когда вам нужна коробка.

...