2016-09-23 3 views
0

In meinem Repositories, ich habe Methoden mit zu vielen Argumenten (für den Einsatz in dem):Was ist die beste Vorgehensweise für das Repository?

Beispiel:

class ProchaineOperationRepository extends EntityRepository 
{ 
     public function getProchaineOperation(
      $id = null, // Search by ID 
      \DateTime $dateMax = null, // Search by DateMax 
      \DateTime $dateMin = null, // Search by DateMin 
      $title = null // Search by title 
     ) 

In meinem Controller, ich differents Aktion habe ... für bekomme mit ID, für erhalten mit ID und DateMin, für bekommen ID und Titel, ...

Meine Methode zu unleserlich becaus ist e zu viele Argumente ... und es wäre schwierig, viele Methoden zu erstellen, weil sie fast identisch sind ...

Was ist die beste Praxis?

+8

Ihre erste bewährte Vorgehensweise könnte darin bestehen, auf Ihre Fragen zu antworten. Dies ist die dritte Frage, die Sie in 5 Stunden gestellt haben. Die anderen beiden haben Kommentare und Antworten, aber keine Antworten von Ihnen.Und es sieht so aus, als hätten Sie 50 Fragen gestellt und nur eine Antwort akzeptiert? Huch. Fahren mit Plakaten sollte nicht viel Hilfe erwarten. – Cerad

Antwort

1

Wenn Ihr Ziel nur mit einem AND Operator zwischen den einzelnen Eigenschaften abzufragen, könnte der beste Weg sein, das Verfahren durch Lehre für die vorgeschlagene Anwendung: findBy() cf: this part of the doc

zum Beispiel:

$results = $this 
      ->getDoctrine() 
      ->getRepository('AppBundle:ProchaineOperation') 
      ->findBy(array('dateMax' => $myDate, 'title' => 'Hello world'); 

EDIT: nach Kommentar

Dann verwenden Sie die gleiche Weise wie Doctrine tun: Nur ein Array mit ID, dateMax ... als Schlüssel übergeben, wenn diese gesetzt sind. Dies sollte das Methodensignaturproblem lösen, das Ihnen so viele Probleme bereitet. :)

+0

Mein Code ist viel komplizierter in der Realität ... und ich verwende RSM und benutzerdefinierte Abfragen :) –

+0

Bearbeitete meine Antwort –

2

Sie haben zwei Hauptanliegen in Ihrer Frage

  1. Sie haben zu viele Argumente in Ihrer Repository-Methode, die verwendet wird in ‚wo‘ Zustand der eventuellen Abfrage. Sie wollen, dass sie in einer besseren Art und Weise sollte
  2. Die Repository-Methode von der Steuerung in einer sinnvollen Art und Weise möglich, wegen der Argumente

ich Ihnen eine Repository-Methode zu schreiben, lege nahe, übergab Komplexität aufrufbar sein organisieren wie:

namespace AcmeBundle\Repository; 

/** 
* ProchaineOperationRepository 
* 
*/ 
class ProchaineOperationRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function search($filters, $sortBy = "id", $orderBy = "DESC") 
    { 
     $qb = $this->createQueryBuilder("po"); 

     foreach ($filters as $key => $value){ 
      $qb->andWhere("po.$key='$value'"); 
     } 

     $qb->addOrderBy("po.$sortBy", $orderBy); 

     return $qb->getQuery()->getArrayResult(); 
    } 
} 

Die $filters Variable hier ist ein Array, das die Filter halten soll man in ‚where‘ Zustand verwenden werden. $sortBy und $orderBy sollte auch nützlich sein, um das Ergebnis in richtig sequenzierte Weise

Jetzt erhalten Sie das Repository-Methode aus dem Controller wie anrufen:

für alle
class ProchaineOperationController extends Controller 
{ 
    /** 
    * @Route("/getById/{id}") 
    */ 
    public function getByIdAction($id) 
    { 
     $filters = ['id' => $id]; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters); 
     //process $result 
    } 

    /** 
    * @Route("/getByTitle/{title}") 
    */ 
    public function getByTitleAction($title) 
    { 
     $filters = ['title' => $title]; 
     $sortBy = 'title'; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy); 
     //process $result 

    } 

    /** 
    * @Route("/getByIdAndDateMin/{id}/{dateMin}") 
    */ 
    public function getByIdAndDateMinAction($id, $dateMin) 
    { 
     $filters = ['id' => $id, 'dateMin' => $dateMin]; 
     $sortBy = "dateMin"; 
     $orderBy = "ASC"; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy, $orderBy); 
     //process $result 
    } 

} 

Beachten Sie, dass Sie das gleiche Repository-Methode aufrufen Controller-Aktionen mit geringfügigen Änderungen gemäß Ihren Parametern. Beachten Sie auch, dass $sortBy und $orderBy optional übergeben werden.

Hoffe es hilft!

Verwandte Themen