it-swarm.com.de

Wie füge ich ein Repository in einen Service in Symfony ein?

Ich muss zwei Objekte in ImageService einfügen. Einer von ihnen ist eine Instanz von Repository/ImageRepository, das bekomme ich so:

$image_repository = $container->get('doctrine.odm.mongodb')
    ->getRepository('MycompanyMainBundle:Image');

Wie erkläre ich das in meiner services.yml? Hier ist der Service:

namespace Mycompany\MainBundle\Service\Image;

use Doctrine\ODM\MongoDB\DocumentRepository;

class ImageManager {
    private $manipulator;
    private $repository;

    public function __construct(ImageManipulatorInterface $manipulator, DocumentRepository $repository) {
        $this->manipulator = $manipulator;
        $this->repository = $repository;
    }

    public function findAll() {
        return $this->repository->findAll();
    }

    public function createThumbnail(ImageInterface $image) {
        return $this->manipulator->resize($image->source(), 300, 200);
    }
}
74
ChocoDeveloper

Ich fand das link und das hat bei mir funktioniert:

parameters:
    image_repository.class:            Mycompany\MainBundle\Repository\ImageRepository
    image_repository.factory_argument: 'MycompanyMainBundle:Image'
    image_manager.class:               Mycompany\MainBundle\Service\Image\ImageManager
    image_manipulator.class:           Mycompany\MainBundle\Service\Image\ImageManipulator

services:
    image_manager:
        class: %image_manager.class%
        arguments:
          - @image_manipulator
          - @image_repository

    image_repository:
        class:           %image_repository.class%
        factory_service: doctrine.odm.mongodb
        factory_method:  getRepository
        arguments:
            - %image_repository.factory_argument%

    image_manipulator:
        class: %image_manipulator.class%
45
ChocoDeveloper

Hier ist eine aufgeräumte Lösung für diejenigen, die wie ich von Google kommen:

pdate: hier ist die Symfony 2.6 (und höher) Lösung:

services:

    myrepository:
        class: Doctrine\ORM\EntityRepository
        factory: ["@doctrine.orm.entity_manager", getRepository]
        arguments:
            - MyBundle\Entity\MyClass

    myservice:
        class: MyBundle\Service\MyService
        arguments:
            - "@myrepository"

Veraltet Lösung (Symfony 2.5 und weniger):

services:

    myrepository:
        class: Doctrine\ORM\EntityRepository
        factory_service: doctrine.orm.entity_manager
        factory_method: getRepository
        arguments:
            - MyBundle\Entity\MyClass

    myservice:
        class: MyBundle\Service\MyService
        arguments:
            - "@myrepository"
103
Matthieu Napoli

Falls Sie nicht jedes Repository als Service definieren möchten, beginnen Sie mit Version 2.4 Sie können Folgendes tun (default ist ein Name des Entitätsmanagers):

@=service('doctrine.orm.default_entity_manager').getRepository('MycompanyMainBundle:Image')
39
b.b3rn4rd

2017 und Symfony 3.3 + haben dies wesentlich vereinfacht. In Symfony 4.x ist es dasselbe.

Überprüfen Sie meinen Beitrag Verwendung von Repository mit Doctrine als Dienst in Symfony für allgemeinere Informationen Beschreibung.

Für Ihren Code müssen Sie nur Komposition über Vererbung - eines der SOLID Muster verwenden.

1. Erstellen Sie ein eigenes Repository ohne direkte Abhängigkeit von Doctrine

<?php

namespace MycompanyMainBundle\Repository;

use Doctrine\ORM\EntityManagerInterface;
use MycompanyMainBundle\Entity\Image;

class ImageRepository
{
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(Image::class);
    }

    // add desired methods here
    public function findAll()
    {
        return $this->repository->findAll();
    }
}

2. Fügen Sie die Konfigurationsregistrierung mit PSR-4-basierte Autoregistrierung hinzu

# app/config/services.yml
services:
    _defaults:
        autowire: true

    MycompanyMainBundle\:
        resource: ../../src/MycompanyMainBundle

3. Jetzt können Sie über die Konstruktorinjektion beliebige Abhängigkeiten hinzufügen

use MycompanyMainBundle\Repository\ImageRepository;

class ImageService
{
    public function __construct(ImageRepository $imageRepository)
    {
        $this->imageRepository = $imageRepository;
    }
}
7
Tomáš Votruba