【问题标题】:How do I configure a Doctrine2 entity which extends PersistentObject within Symfony2 project?如何配置在 Symfony2 项目中扩展 PersistentObject 的 Doctrine2 实体?
【发布时间】:2013-06-13 14:11:33
【问题描述】:

我希望能够在开发 Symfony2 项目期间使用此处描述的 PersistentObject http://www.doctrine-project.org/blog/a-doctrine-orm-odm-base-class.html,以避免在数据库和实体设计不断变化时无休止地创建和删除 getter 和 setter。

在 Symfony2 项目中的什么地方“配置”了 ObjectManager,正如简要文档中所建议的那样(下面的代码引用)?它应该在控制器中,如果是,它会是什么样子?

 $entityManager = EntityManager::create(...);
 PersistentObject::setObjectManager($entityManager);

我找不到任何可行的示例(尽管我确实在 stackoverflow 上找到了 Zend2 框架的类似示例:Using PersistentObject from Doctrine in Zend Framework

感谢您的宝贵时间!

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    PersistentObject 是您不必手动保留的对象。因此,它使用 php 的 __call() 方法提供了ma​​gic getter 和 setter

    您只需在实体类中扩展 Object 并在控制器中使用它。无需生成 getter 和 setter。

    示例实体

    <?php
    namespace Vendor\YourBundle\YourEntity;
    
    use Doctrine\Common\Persistence\PersistentObject; 
    use Doctrine\Common\Persistence\ObjectManager;
    use Doctrine\ORM\Mapping as ORM;
    
    class YourEntity extends PersistentObject
    {
    
       // i added the constructor in order to save the setObjectManager() 
       // call in the the controller
    
       public function __construct(ObjectManager $om)
       {
           $this->setObjectManager($om);
       }
    
       /** 
        * @ORM\Id  
        * @ORM\Column(type="integer")
        * @ORM\GeneratedValue(strategy="AUTO")
        */
       protected $id;
    
       /**
        * @ORM\Column(type="string", length=100)
        */
       protected $name;
    
       // ... more properties
    
    }
    

    示例控制器操作

    class YourController extends Controller
    {
        public function yourAction($name)
        {
            $em = $this->get('doctrine')->getManager('default');
    
            $entity = new YourEntity($em);   // __construct calls setObjectManager($em)
    
            $entity->setName($name);         // magic setter is used here
    
            // ... no need for $em->persist($entity);
    
            $em->flush();                    // $entity is being persisted.
        }
    
        // ...
    

    您可以使用...之一在 symfony 控制器中获取理论实体管理器

     $em = $this->get('doctrine')->getManager();          // gets default manager
     $em = $this->get('doctrine')->getManager('default'); // same as above
     $em = $this->getDoctrine()->getManager();            // using alias 
    

    【讨论】:

    • 感谢您提供详细但非常清晰的示例!这真是太棒了。更进一步,在控制器使用查询来获取对象的情况下(例如,通过$em = $this-&gt;getDoctrine()-&gt;getEntityManager(); $query = $em-&gt;createQuery($dql); 实体管理器如何传递给构造函数方法?
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多