Doctrine orm 向ZF2中的帖子添加标记

Doctrine orm 向ZF2中的帖子添加标记,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我正在尝试在我的帖子中实现标签。用户将在用逗号分隔的文本框中输入标记 public function addAction() { $entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); $article = new Article; $form = new ArticleForm(); $form->setH

我正在尝试在我的帖子中实现标签。用户将在用逗号分隔的文本框中输入标记

        public function addAction() {
    $entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    $article = new Article;

    $form = new ArticleForm(); 
    $form->setHydrator(new DoctrineHydrator($entityManager,'CsnCms\Entity\Article'));
    $form->bind($article);

    $request = $this->getRequest();
    if ($request->isPost()) {
        $post = $request->getPost();
        $form->setData($post);
        if ($form->isValid()) {
            $this->createTags($article, $post["Tags"]);
            $this->prepareData($article);
            $entityManager->persist($article);
            $entityManager->flush();

            return $this->redirect()->toRoute('csn-cms/default', array('controller' => 'article', 'action' => 'index'));
        }
    }

    return new ViewModel(array('form' => $form));
}

在上面的代码中,我添加了一个名为createTags的类,我计划将输入的标记拆分为一个数组,并为每个数组创建一个新的标记实体,然后将新的标记实体存储在article对象的数组中。这是我应该使用的正确方法吗?

不,如果将页面存储在数组中,则无法根据标记搜索页面。您需要有一个单独的db表,其中包含id、tag、pageId等列,以便您可以正确搜索带有标记名的页面。

如果问题需要详细说明,很抱歉,我只是想知道我是否应该使用过滤器(我想这会起作用,但不知道这是否是一个好的做法)

最后,我只使用processData函数

   public function prepareData($article, $post) {

    $separator = ",";

    if($post['tagsString'] != "")
    {
        //Link Tags
        $array = array_unique(explode($separator, $post['tagsString']));
        foreach ($array as $tagString) {

            $tag = $this->getEntityManager()->getRepository('Cms\Entity\Tag')->findOneBy(array('tag' => $tagString));

            $link = new \Cms\Entity\LinkTagToArticle($article, $tagString, $tag); 
            $this->getEntityManager()->persist($link);
        }
    }
}

你做事的方式当然是你需要的方式。我个人不使用ZF2的原则,但如果我记得Symfony 2,我会说,没关系。当我编写代码时,我问自己的唯一问题是:我是否正在做我想要实现的事情,我的代码是否足够可测试以确保它是预期的行为。编写测试是确保代码按您希望的方式运行的最佳方式,并确保整个应用程序不会因为变量在处理过程中没有正确初始化而执行奇怪的操作。他没有告诉任何关于doctrine db schema的信息,我假设模式是正确的,并且他的
Post
实体通过一个或多个关系包含
标记。他当然没有说标记将使用序列化作为“数组”持久化