2016-05-31 9 views
-1

Ich habe ein benutzerdefiniertes Repository in meinem Symfony-Projekt und möchte es wie ein Suchwerkzeug verwenden. Die Struktur meines Projekts ist die folgende:Wie verwende ich ein benutzerdefiniertes Repository in Symfony?

P.D. AKTUALISIERT Frage und Code

-Manager: 
* BaseManager.php 
* MyEntityManager.php 
-Repository: 
* BaseRepository.php 
* MyEntityRepository.php 

Nun, ich möchte den Zugang zu meinen benutzerdefinierten Repository und verwenden Sie die folgende Methode findByTitle, die Methode sollte ein Array mit Objekten zurück, die Beschreibungsfeld ähnlich sein. Ich habe einen einfachen Druck (var_dump des Begriffs eingegeben) innerhalb meiner Funktion zu sehen, ob mein Browser zeigt es, aber es ist noch nicht zeigte ...

Mein BaseManager:

<?php 
namespace AppBundle\Manager; 

use AppBundle\Repository\BaseRepository; 

class BaseManager 
{ 
    /** 
    * @var BaseRepository 
    */ 
    protected $repo; 


    /** 
    * @param BaseRepository $repo 
    */ 
    public function __construct(BaseRepository $repo) 
    { 
     $this->repo = $repo; 
    } 

    /** 
    * @param $model 
    * @return bool 
    */ 
    public function create($model) 
    { 
     return $this->repo->create($model); 
    } 

    /** 
    * @param CrudModel $model 
    * @return bool 
    */ 
    public function update($model) 
    { 
     return $this->repo->save($model); 
    } 

    /** 
    * @param CrudModel $model 
    * @return bool 
    */ 
    public function delete($model) 
    { 
     return $this->repo->delete($model); 
    } 

    /** 
    * @param $id 
    * @return null|object 
    */ 
    public function getOneById($id) 
    { 
     return $this->repo->findOneById($id); 
    } 

    /** 
    * @return array 
    */ 
    public function all() 
    { 
     return $this->repo->all(); 
    } 

} 

MyEntityManager:

<?php 
namespace AppBundle\Manager; 

use AppBundle\Repository\MyEntityRepository; 
use AppBundle\Entity\MyEntity; 

/** 
* Class MyEntityManager 
* @package AppBundle\Manager 
*/ 
class MyEntityManager extends BaseManager{ 

    public function findByTitle($title){ 

     echo '<h1>flux of code here</h1>'; 
     return $this->repo->findByTitle($title); 
    } 

    public function findSimilars($term){ 
     echo '<h1>flux of code here</h1>'; 
     return $this->repo->findSimilars($term); 
    } 
} 

BaseRepository:

<?php 
namespace AppBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

abstract class BaseRepository extends EntityRepository 
{ 
    public function create($model, $autoFlush = true) 
    { 
     return $this->insert($model,$autoFlush); 
    } 

    public function save($model, $autoFlush = true) 
    { 
     return $this->insert($model,$autoFlush); 
    } 

    public function delete($model) 
    { 
     try{ 
      $this->getEntityManager()->remove($model); 
      $this->getEntityManager()->flush(); 
      return true; 
     }catch (\Exception $e){ 
      echo $e->getMessage(); 
     } 
    } 

    public function findOneById($id) 
    { 
     return $this->findOneBy(array('id' => $id)); 
    } 

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

    private function insert($model, $autoFlush = true) 
    { 
     $this->getEntityManager()->persist($model); 
     if ($autoFlush) { 
      $this->getEntityManager()->flush(); 
      return true; 
     } 
    } 
} 

MyEntityRepository:

<?php 

namespace AppBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

/** 
* Class MyEntityRepository 
* @package AppBundle\Repository 
*/ 
class MyEntityRepository extends BaseRepository{ 

    private function findById($id){ 
    $query = $this->createQueryBuilder('myentity') 
    ->where('myentity.id = :id') 
    ->setParameter('id', $id) 
    ->getQuery(); 

    $myentity = $query->getResult(); 

    return $myentity; 
    } 

    private function findByTitle($term){ 
     echo '<h1>'; 
     var_dump($term); 
     echo '</h1>', 
     $query = $this->createQueryBuilder('myentity') 
       ->andwhere('myentity.description = :description') 
       ->setParameter('description', $term) 
       ->getQuery(); 
     $myentity = $query->getResult(); 

     return $myentity; 
    } 
} 

Der Anfang MyEntity:

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 


/** 
* @ORM\Table(name="myentity") 
* @ORM\Entity 
* @ORM\Entity(repositoryClass="AppBundle\Repository\MyEntityRepository") 
*/ 
class MyEntity { 

...... 

Mein services.yml:

parameters: 
    app.myentity.repository.class: AppBundle\Repository\MyEntityRepository 
    app.myentity.manager.class: AppBundle\Manager\MyEntityManager 

services: 

    app.myentity.repository: 
     class: %app.myentity.repository.class% 
     public: true 
     factory_service: doctrine.orm.entity_manager 
     factory_method: getRepository 
     arguments: [ AppBundle\Entity\MyEntity ] 

    app.myentity.manager: 
     class: %app.myentity.manager.class% 
     arguments: [@app.myentity.repository] 

Und ich meinen Dienst in der folgenden Art und Weise aufrufen:

public function searchAction(Request $request, $term){ 
     $manager = $this->get('app.myentity.manager'); 
     $result = $manager->findByTitle($term); 

     echo '<h5>'; 
     var_dump($result); 
     echo '</h5>'; 
     .... 
    } 
+0

Having Probleme beim Verständnis Ihrer Sätze, aber Sie könnten prüfen, ob Ihr Entity Manager Ihrer Entitätsklasse korrekt zugeordnet ist. Es klingt so, als ob Sie das Basisrepository erhalten und nicht Ihr eigenes. – Cerad

+0

Sie sollten den Code angeben, den Sie verwenden möchten. –

+0

Ja, es scheint, dass ich nur mein BaseRepository bekomme ... aber ich sehe meine Schuld nicht @Cerad –

Antwort

0

Das Problem war, dass ich meine Funktion als privat deklariert statt öffentlichen

private function findByTitle($term){ 

statt

public function findByTitle($term){ 
0

Nur eine Vermutung, da Ihre Frage bei weitem nicht klar ist (va. der letzte Absatz): Haben Sie den Dienst nur registriert oder haben Sie Symfony auch angewiesen, das Repository für die Entität zu verwenden (vermutlich MyEntity)? Zum Beispiel mit Anmerkungen, würden Sie so etwas wie dieses benötigen:

@ORM\Entity(repositoryClass="The\RepositoryClass") 
+0

Ja, Sie haben Recht; Es tut mir leid, wenn ich falsch verstanden habe. Ich habe meine Frage aktualisiert und meinen Code hinzugefügt. Ich denke, dass es jetzt klarer ist mein Problem –

+0

Und ich verwende die Annotation zu meinem Repository in meiner Entity-Klasse –