0

有没有办法从实体存储库写入闪存消息。我有一个标签和类别实体。我正在通过类别表单添加标签,我在其中添加了一个自定义输入字段,该字段接收用“,”分隔的标签。每次我提交表单时,我都会检查输入中的标签是否已经存在,如果不存在,我会将它们添加到数据库中,然后将它们添加到 Category 实体中。

这是我的标签存储库,我试图在其中编写 flashmessage:

namespace Kpr\CentarZdravljaBundle\Entity;

use Doctrine\ORM\EntityRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Kpr\CentarZdravljaBundle\Entity\Tags;
use Symfony\Component\HttpFoundation\Request;

class TagsRepository extends EntityRepository
{
    public function findByTagInput($arg)
    {
        $request = Request::createFromGlobals();
        $args = explode(", ", $arg);

        $em = $this->getEntityManager();
        $tagArray = array();
        $addaedTags = "";
        foreach($args as $name){
            $tag = $this->findByName($name);
            if(!$tag){
                $addaedTags .= $name.", ";
                $newTag = new Tags();
                $newTag->setName($name);
                $newTag->setApproved(1);
                $em->persist($newTag);
                $tagArray[] = $newTag;
            }
        }
        if($addaedTags!="") $request->get('session')->getFlashBag()->add('info', substr($addaedTags,0,strlen($addaedTags)-2));
        $qb = $em->createQueryBuilder();

        $qb->add('select', 'tag')
           ->add('from', 'KprCentarZdravljaBundle:Tags tag')
           ->add('where', $qb->expr()->in('tag.name', $args));
        // $qb instanceof QueryBuilder
        $query = $qb->getQuery();
        // Set additional Query options
        $query->useResultCache('my_cache_id');
        $results = $query->getResult();
        /*
        $sql = "SELECT * FROM categories WHERE $whereS";
        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
        $results = $stmt->execute();
        */

        $totalResults = array_merge($tagArray, $results);
        $tags = new ArrayCollection($totalResults);
        return $tags;
    }

    public function findByName($name)
    {
        $qb = $this->getEntityManager()->createQueryBuilder();

        $qb->add('select', 'tag')
           ->add('from', 'KprCentarZdravljaBundle:Tags tag')
           ->add('where', 'tag.name = :namearg')
           ->setParameter('namearg', $name);
        // $qb instanceof QueryBuilder
        $query = $qb->getQuery();
        $result = $query->getResult();
        return $result;
    }
}

我得到的错误:

FatalErrorException: Error: Call to a member function getFlashBag() 
on a non-object in /home/kprhr/public_html/CZ_Symfony/src/Kpr/CentarZdravljaBundle/Entity/TagsRepository.php line 31
4

1 回答 1

1

我认为您不应该处理来自 EntityManager 的请求;他们的目的不同。EntityManager 管理数据库和应用程序之间的通信,它的目的不是处理会话管理,也不是添加闪烁消息。

这项工作应该交给专门的服务机构来处理。

现在,您的错误来自您获取请求的方式。您实际上是在使用静态方法 createFromGlobals 创建一个未正确实例化的全新对象。相反,您应该在控制器中处理闪存消息。

这将转化为类似的东西:

//Controller

public function mypageAction()
{
    // Your logic
    if (count($args) > 0) {
        $this->getRequest()->get('session')->getFlashBag()->add('info', implode(',', $args));
    }
    // ...
}
于 2013-04-26T13:49:53.573 回答