2013-01-16 36 views
7

मैं इंटरफेस को "targetEntity" के रूप में उपयोग करने का प्रयास कर रहा हूं। सरल कोड मैं क्या करने का इरादा क्या व्याख्या करनी चाहिएसिद्धांत लक्ष्य एंटीटी इंटरफेस

इंटरफ़ेस:

namespace Project\Entity; 

interface AnimalInterface{ 


} 

बिल्ली:

namespace Project\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Project\Entity\AnimalInterface; 

/** 
* Represents an Invoice. 
* 
* @ORM\Entity 
* @ORM\Table(name="Cat") 
*/ 
class Cat implements AnimalInterface { 

    /** 
    * @var int 
    * @ORM\Id @ORM\Column(type="integer", name="id") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 
} 

कुत्ता:

namespace Project\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Project\Entity\AnimalInterface; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Dog") 
*/ 
class Dog implements AnimalInterface { 

    /** 
    * @var int 
    * @ORM\Id @ORM\Column(type="integer", name="id") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 
} 

AnimalFarm (सिर्फ एक जानवर हो सकती है;)):

namespace Project\Entity; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="AnimalFarm") 
*/ 
class AnimalFarm { 
    /** 
    * 
    * @var int 
    * @ORM\Id @ORM\Column(type="integer", name="id") 
    * @ORM\GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Project\Entity\AnimalInterface") 
    * @var AnimalInterface 
    */ 
    protected $animal; 


    public function setAnimal(AnimalInterface $animal){ 
     $this->animal = $animal; 
    } 
} 

को यहां निर्धारित मैं TargetEntityResolver उपयोग कर रहा हूँ ->http://symfony.com/doc/master/cookbook/doctrine/resolve_target_entity.html

bootstrap.php (Zend):

$em = $doctrine->getEntityManager(); 
    $evm = $em->getEventManager(); 

    $listener = new \Doctrine\ORM\Tools\ResolveTargetEntityListener(); 
    $listener->addResolveTargetEntity(
      'Project\Entity\AnimalInterface', 
      'Project\Entity\Dog', 
      array() 
    ); 
    $listener->addResolveTargetEntity(
      'Project\Entity\AnimalInterface', 
      'Project\Entity\Cat', 
      array() 
    ); 
    $evm->addEventListener(Doctrine\ORM\Events::loadClassMetadata, $listener); 

यह रिज़ॉल्वर लगता है केवल एक इंटरफेस के लिए एक इकाई हल कर सकते हैं, पहले एक दिया इस उदाहरण बिल्ली में। सिद्धांत तालिका कुत्ते को रिश्ते (विदेशी) के साथ AnimalFarm का निर्माण करें। जब मैं EntityManager Doctrine के माध्यम से तालिका में कुत्ते को जोड़ने का प्रयास कर रहा हूं, तो निम्न त्रुटि के साथ विफल रहता है: संदेश के साथ अपवाद अपवाद 'सिद्धांत \ ORM \ ORMException' 'परियोजना के प्रकार की परियोजना \ Entity \ Dog पर परियोजना \ Entity \ AnimalFarm # पशु, लेकिन परियोजना \ Entity \ Cat 'की अपेक्षा [...]

ऐसा लगता है कि इंटरफ़ेस के माध्यम से एकाधिक लक्ष्य एंटीटी को परिभाषित करना संभव नहीं है?

मैं विरासत का उपयोग नहीं करना चाहता क्योंकि संस्थाएं कई इंटरफेस लागू कर सकती हैं। (एकाधिक विरासत संभव नहीं है)

कोई विचार?

शायद अच्छे खोजशब्द खोजशब्द मैं देख सकता हूं?

बहुत बहुत धन्यवाद।

उत्तर

1

यह doctrine2 docs से लिया गया है। आप इस विधि का उपयोग कर केवल एक वस्तु को हल कर सकते हैं।

/** 
* An interface that the invoice Subject object should implement. 
* In most circumstances, only a single object should implement 
* this interface as the ResolveTargetEntityListener can only 
* change the target to a single object. 
*/ 
interface InvoiceSubjectInterface 
{ 
    // List any additional methods that your InvoiceModule 
    // will need to access on the subject so that you can 
    // be sure that you have access to those methods. 

    /** 
    * @return string 
    */ 
    public function getName(); 
}