2016-08-09 117 views
1

Ich habe eine Car -Eigenschaft und es ist insurance fees (nicht Teil der Entität!), Die ich von einem externen Anbieter erhalten. Im Moment bin ich Looping beide gegen jeden anderen:Symfony 3: Wie man Entitäten dynamisch manipuliert?

Aktuell: (Pseudo-Code)

foreach ($insuranceFeesArr as $insuranceFeesObj):   
    if ($insuranceFeesObj.carId == $car.id): 
     echo 'Fees: ' . $insuranceFeesObj.USD; // "Fees: 75.00 USD" 
    endif; 
endforeach; 

Ich mag würde vorbereiten/verschmelzen die überall Daten (? Repository-Dienst) in der Lage sein die Versicherungsgebühren für den Zugriff durch den Car:

Wunsch: (Zweig)

{{ car.insuranceFees.USD }} // Fees: 75.00 USD 

Was ist die beste oder eine gute Praxis?

Vielen Dank im Voraus!

+1

abrufen Sie sollten immer Logik zwischen Controllern, Services, Repositories, Fabriken usw. trennen. Controller sollte nicht viel tun. Repository sollte nur mit DB-Dingen umgehen. Factory sollte für das Daten/Modell-Mapping verwendet werden. Der Dienst sollte das meiste aus der Logik machen. "Thin Controller, fetter Service". Es hört sich so an, als würden Sie hier mit Daten arbeiten, sodass das Mapping in eine Factory-Klasse übergeht. So wird es gemacht. [Wie man Service, Modell und Fabrik verwendet, um paginiertes json-Ergebnis in Symfony zu erstellen] (http://www.inanzzz.com/index.php/post/yl5h/how-to-use-service-model-and-facco- paginiert-json-result-in-symfony erstellen – BentCoder

Antwort

2

Ich nehme an, Sie verwalten Ihre Entitäten mit Lehre.

Sie sollten einen Repository-Service für diesen Zweck erstellen.

/** 
* @Entity(repositoryClass="CarRepository") 
*/ 
class Car 
{ 

// ... 
} 

dieses Repository deklarieren als Dienst:

dieses Repository innerhalb des Controllers
insurance_fee_api: 
    class: My\InsuranceFee\Api 

car_repository: 
    class: Doctrine\ORM\EntityRepository 
    factory_service: doctrine.orm.default_entity_manager 
    factory_method: getRepository 
    arguments: 
    - My\Entity\Car 
    calls: 
    - ['setInsuranceFeeApi', ['@insurance_fee_api']] 

Verwenden zu holen

use Doctrine\ORM\EntityRepository; 

class CarRepository extends EntityRepository 
{ 
    $protected $insuranceFeeApi; 

    public function setInsuranceFeeApi($insuranceFeeApi) 
    { 
     $this->insuranceFeeApi = $insuranceFeeApi; 
     return $this; 
    } 

    /** 
    * overwrite doctrine repository functions you will use to enrich your car entities with insurancefee objects 
    */ 
    public function fetchAll() 
    { 
     $insuranceFees = $this->insuranceFeeApi->getInsuranceFees(); //pseudocode 
     $cars = parent::fetchAll(); 
     //enrich your car instances here 

     return $cars; 
    } 
} 

Set dieses Repository als Repository für Ihr Fahrzeug Einheit verwendet werden Ihre Auto-Instanzen:

$carRepository = $this->get('car_repository'); 
$cars = $carRepository->fetchAll(); // cars with insurancefees 

Sie können diese Car-Instanzen nun an Ihre View-Templates übergeben und nach Belieben auf die Versicherungsbeiträge zugreifen.

Nachteile mit dieser Methode:

  • Sie können nicht Konstruktor-Injektion mit den Abhängigkeiten von CarRepository verwenden

  • Sie können nicht auf das Repository erhalten mit $this->getDoctrine()->getRepository(). Stattdessen müssen Sie das Repository über Container