实体中具有查询的Symfony2方法



我有实体:Menu和TypeMenu。菜单中的方法是

public function setTypeId(CmsAdminBundleEntityTypMenu $typeId = null)
    {
        $this->type_id = $typeId;
        return $this;
    }

当我添加新记录时,我必须在参数中给出方法setTypeId,结构。

$Menu = new Menu();
...
$TypMenu=$em->getRepository('CmsAdminBundle:TypMenu')->findOneById($form->get('typmenu_id')->getData());
$Menu->setTypeId($TypMenu);

这很累。在类菜单中,我想创建功能,它会做到这一点。

public function setTypeMenu($id){
         $TypMenu=$em->getRepository('CmsAdminBundle:TypMenu')->findOneById($id);
         return $this->setTypeId($TypeMenu);
     }

我读到实体主义不是最优的。

我怎样才能做到这一点?

对不起我的英语。

让自己成为一个MenuFactory,注入必要的存储库,然后将创建代码移动到其中。

// In a controller
$menuFactory = $this->get('menu.factory');
$menu = $menuFactory->createForTyp($typId);
// The factory
class MenuFactory
{
    $typMenuRepository;
    public function __construct($typMenuRepository)
    {
        $this->typMenuRepository = $typMenuRepository;
    }
    public createFromTypMenu($typId)
    {
        $menu = new Menu();
        $typMenu = $this->typMenuRepository->findOneById($typId);
        $menu->setTyp($typMenu);
        return $menu;
    }
}
// Wire it up in services.yml
services:
  typmenu.repository
    class BundleEntityTypMenuRepository
    factory_service: 'doctrine.orm.entity_manager'
    factory_method:  'getRepository'
    arguments:  
        - 'BundleEntityTypMenu'
  menu.factory:
    class: BundleMenuFactory
    arguments: ['@typmenu.repository]

一旦你掌握了窍门,这些东西就成了第二天性。http://symfony.com/doc/current/book/service_container.html

我对你在问题中使用$form和typ_id感到有点困惑。使用条令2,您主要处理对象。您很少需要控制器级别的id。可能还想回顾一下文件中关于原则和形式的章节。

不建议像这样从存储库中请求整个实体,如果你不使用TypMenu实体的任何字段,它会无故占用资源,你最好使用:

 $Menu->setTypeId($em->getReference('CmsAdminBundle:TypMenu', $id));

这已经是最佳的了,我不知道有什么更好的方法,再次,如果你没有使用TypMenu中的任何数据,不要使用存储库,使用引用。

相关内容

  • 没有找到相关文章

最新更新