phpsymfonyentity

Symfony2 flash messages from Entity Repository


Is there a way to write flash messages from entity repository. I have a Tag and Category entity. I am adding tags via Category form, where i added a custom input field that receives tags separated with ", ". Every time i submit a form i check if the tags in the input already exist, if not i add them to the database and then i add them to the Category entity.

Here is my tag repository where im trying to write the 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;
    }
}

The error i get:

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

Solution

  • I don't think you should handle the request from the EntityManager ; their purposes are different. The EntityManager manages the communication between the DB and your application, it's not its purpose to handle session management, neither is it to add flashes messages.

    This job should go to a dedicated service, which will handle that.

    Now, your error comes from the way you get your request. You are actually creating a brand new object, which is not properly instanciated, by using the static method createFromGlobals. Instead, you should handle the flash messages in your controller.

    This would translate as something like that:

    //Controller
    
    public function mypageAction()
    {
        // Your logic
        if (count($args) > 0) {
            $this->getRequest()->get('session')->getFlashBag()->add('info', implode(',', $args));
        }
        // ...
    }