Sirius Sirius - 1 month ago 10
PHP Question

Exception "Some mandatory parameters are missing" [symfony2]

I would like a

user
to be able to leave a review(comment) about a
user
on it public profile.

Once I refresh the public profile page I have this error:


An exception has been thrown during the rendering of a template
("Controller
"FLY\BookingsBundle\Controller\PostController::commentAction()"
requires that you provide a value for the "$entity" argument (because
there is no default value or because there is a non optional argument
after this one).") in
ApplicationSonataUserBundle:Profile:UserShow.html.twig at line 108.


The url of the public profile look like this :

http://127.0.0.1/symfony/web/app_dev.php/user/show/john/26


Routing.yml

userShow:
pattern: /user/show/{entity}/{slug}
defaults: { _controller: FLYBookingsBundle:Post:userShow }


comment:
pattern: /user/show/{entity}/{slug}
defaults: { _controller: FLYBookingsBundle:Post:comment }
requirements:
_method: POST


PostController.php

public function userShowAction($entity)
{

$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));

$user = $em->getRepository('ApplicationSonataUserBundle:Avatar')->findBy(array('user' => $entity));

return $this->render('ApplicationSonataUserBundle:Profile:UserShow.html.twig', array('user' => $user,'entity' => $entity));
}


.

public function commentAction(Request $request,$entity)
{
$em = $this->getDoctrine()->getManager();
$user = $this->container->get('security.token_storage')->getToken()->getUser();
$comment = new Comment();
$entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));
$form = $this->createForm( new CommentType(),$comment);
dump($form);
if ($this->get('request')->getMethod() == 'POST') {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$comment->setCreatedAt(new \DateTime());
$comment->setApproved(true);

$comment->setRecipient();

$comment->setAuthor($this->container->get('security.token_storage')->getToken()->getUser());
$em->persist($comment);
$em->flush();
$this->get('session')->getFlashBag()->add(
'success',
'Your comment was succesfully added'
);
}
return $this->redirect($this->generateUrl('userShow', array(
'entity' => $entity,
//'slug' => $slug,
)));

}

return $this->render('ApplicationSonataUserBundle:Profile:commentForm.html.twig', array( 'entity' => $entity,'user' => $user,'comment' => $comment,
'form' => $form->createView()));
}


UserShow.html.twig

{% for entity in entity %}

<div class="row">
<div class="col-sm-9">

{{ render(controller('FLYBookingsBundle:Post:comment')) }}

</div>
</div>
{% endfor %}


CommentForm.html.twig

<form action="{{ path('comment', {'entity': entity, 'slug':entity.user.id}) }}" method="POST">
{{ form_start(form) }}
{{ form_errors(form) }}
<div class="form-group">
<label>Review Text</label>
{{ form_widget(form.body, { 'attr': {'class': 'form-control','style': 'width: 100%', } }) }}
{{ form_errors(form.body) }}
</div>
<button style="float: right;font-size: 14px; height: 40px; width: 180px;" type="submit">Leave a Review</button>
{{ form_rest(form) }}
</form>


ADD:

public function userShowAction(Request $request,$entity,$slug)
{

$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));
$useravatar = $em->getRepository('ApplicationSonataUserBundle:Avatar')->findBy(array('user' => $entity));
$recipient = $em->getRepository('ApplicationSonataUserBundle:User')->findOneBy(array('id' => $slug));
$comment = new Comment();
$user = new User();
$form = $this->createForm( new CommentType(),$comment);
if ($this->get('request')->getMethod() == 'POST') {
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$comment->setCreatedAt(new \DateTime());
$comment->setApproved(true);
$comment->setRecipient($recipient);
dump($entity);
$comment->setAuthor($this->container->get('security.token_storage')->getToken()->getUser());
$em->persist($comment);
$em->flush();
$this->get('session')->getFlashBag()->add(
'success',
'Your comment was succesfully added'
);
}

return $this->redirect($this->generateUrl('userShow', array(
'entity' => $comment->getRecipient(),
'slug' => $slug
)));


}

return $this->render('ApplicationSonataUserBundle:Profile:UserShow.html.twig', array('useravatar' => $useravatar,'user' => $user,'entity' => $entity,'form' => $form->createView()));
}


.

Comment.php

<?php

namespace Application\Sonata\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
* @ORM\Entity(repositoryClass="Application\Sonata\UserBundle\Entity\UserRepository")
* @ORM\Table(name="comment")
*
*/

class Comment
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @var User
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commentrecipient")
* @ORM\JoinColumn(onDelete="CASCADE")
*
*/
protected $recipient;

/**
* @var User
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="comment")
*/
protected $author;

/**
* @ORM\Column(name="approved",type="boolean", nullable=true)
*/
protected $approved;

/**
* @var string
*
* @ORM\Column(name="body", type="text")
* @Assert\NotBlank
*/
private $body;

/**
* @ORM\Column(name="createdAt", type="datetime", nullable=false)
*/
protected $createdAt;
/**
* @ORM\Column(name="updatedAt", type="datetime", nullable=false)
*/
protected $updatedAt;

public function __toString()
{
return (string) $this->getRecipient();
}

public function __construct()
{
$this->setCreatedAt(new \DateTime());
$this->setUpdatedAt(new \DateTime());
$this->setApproved(true);

}
}


User.php

/**
* @ORM\OneToMany(targetEntity="Application\Sonata\UserBundle\Entity\Comment", mappedBy="recipient", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
*/
protected $commentrecipient;

Answer

FLYBookingsBundle:Post:comment require parameter.

Change {{ render(controller('FLYBookingsBundle:Post:comment')) }} to

{{ render(controller('FLYBookingsBundle:Post:comment', {'entity' : entity )) }}

in UserShow.html.twig