2017-02-20 28 views
0

Вот мои мысли и где я нахожусь. Пожалуйста, скажите мне, является ли это плохой практикой!В Symfony, как мне создать форму обзора (у меня есть Entity «Review») для отображения с контроллера статьи?

У меня есть 3 Entities: Статья, автор, отзывы:

Отношения:

  • Статья имеет один автор.
  • В статье много отзывов.
  • У автора много статей.
  • Обзор имеет один автор.
  • Обзор имеет один артикул.

Я создал контроллер под названием reviewAction, где я собираюсь создать форму обзора, передать его в обзорный обзор и вставить его в мое представление статьи.

Вот мой контроллер до сих пор (не работает)

public function reviewAction(Request $request, Article $article) 
{ 

    $reviewForm = $this->createFormBuilder($article); 
    $reviewForm->add('review')->add('title') 
     ->add('author', AuthorType::class, array("label" => FALSE)) 
     ->add('rating', ChoiceType::class, array(
      'choices' => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' =>'5'), 
      'expanded' => true, 
      'multiple' => false 
     )) 
     ->getForm(); 

    if ($reviewForm->isSubmitted() && $reviewForm->isValid()) { 
     $this->getDoctrine()->getManager()->flush(); 
     return $this->redirectToRoute('article_show', array('id' => $article->getId())); 
    } 

    return $this->render('article/review.html.twig', array(
     'form' => $reviewForm->createView(), 
    )); 
} 

Во-первых, это целесообразно, чтобы построить эту форму здесь? Похоже, я очень много работаю с типом обзора здесь, в контроллерах статей. Не знаю, где еще я его построил.

Я получаю эту ошибку:

Neither the property "review" nor one of the methods "getReview()", "review()", "isReview()", "hasReview()", "__get()" exist and have public access in class "AppBundle\Entity\Article".

Так что я действительно застрял и хотел бы что-нибудь, что кто-нибудь может обеспечить.

EDIT

Вот моя статья Entity

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
/** 
* Article 
* 
* @ORM\Table(name="article") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ArticleRepository") 
* @UniqueEntity(fields={"name"}, message="Note: That article already existed.") 
*/ 
class Article 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255, unique=true) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="description", type="text", nullable=true) 
    */ 
    private $description; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="thumbnail", type="string", length=255, nullable=true) 
    */ 
    private $thumbnail; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created_date", type="datetime") 
    */ 
    private $createdDate; 

    /** 
    * @ORM\ManyToOne(targetEntity="Author", inversedBy="articles", cascade={"persist"}) 
    * @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
    * @Assert\Valid() 
    */ 
    private $author; 


    /** 
    * @ORM\OneToMany(targetEntity="Review", mappedBy="article") 
    */ 
    private $reviews; 

    public function __construct() 
    { 
     $this->reviews = new ArrayCollection(); 
    } 

    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return Article 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Set description 
    * 
    * @param string $description 
    * 
    * @return Article 
    */ 
    public function setDescription($description) 
    { 
     $this->description = $description; 

     return $this; 
    } 

    /** 
    * Get description 
    * 
    * @return string 
    */ 
    public function getDescription() 
    { 
     return $this->description; 
    } 

    /** 
    * Set thumbnail 
    * 
    * @param string $thumbnail 
    * 
    * @return Article 
    */ 
    public function setThumbnail($thumbnail) 
    { 
     $this->thumbnail = $thumbnail; 

     return $this; 
    } 

    /** 
    * Get thumbnail 
    * 
    * @return string 
    */ 
    public function getThumbnail() 
    { 
     return $this->thumbnail; 
    } 

    /** 
    * Set createdDate 
    * 
    * @param \DateTime $createdDate 
    * 
    * @return Article 
    */ 
    public function setCreatedDate($createdDate) 
    { 
     $this->createdDate = $createdDate; 

     return $this; 
    } 

    /** 
    * Get createdDate 
    * 
    * @return \DateTime 
    */ 
    public function getCreatedDate() 
    { 
     return $this->createdDate; 
    } 

    /** 
    * Set authorId 
    * 
    * @param integer $authorId 
    * 
    * @return Article 
    */ 
    public function setAuthorId($authorId) 
    { 
     $this->authorId = $authorId; 

     return $this; 
    } 

    /** 
    * Get authorId 
    * 
    * @return int 
    */ 
    public function getAuthorId() 
    { 
     return $this->authorId; 
    } 

    /** 
    * Set author 
    * 
    * @param \AppBundle\Entity\Author $author 
    * 
    * @return Article 
    */ 
    public function setAuthor(\AppBundle\Entity\Author $author = null) 
    { 
     $this->author = $author; 

     return $this; 
    } 

    /** 
    * Get author 
    * 
    * @return \AppBundle\Entity\Author 
    */ 
    public function getAuthor() 
    { 
     return $this->author; 
    } 

    /** 
    * Add review 
    * 
    * @param \AppBundle\Entity\Review $review 
    * 
    * @return Article 
    */ 
    public function addReview(\AppBundle\Entity\Review $review) 
    { 
     $this->reviews[] = $review; 

     return $this; 
    } 

    /** 
    * Remove review 
    * 
    * @param \AppBundle\Entity\Review $review 
    */ 
    public function removeReview(\AppBundle\Entity\Review $review) 
    { 
     $this->reviews->removeElement($review); 
    } 

    /** 
    * Get reviews 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getReviews() 
    { 
     return $this->reviews; 
    } 

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

} 

Вот моя сущность Обзор

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Review 
* 
* @ORM\Table(name="review") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ReviewRepository") 
*/ 
class Review 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="rating", type="smallint") 
    */ 
    private $rating; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

    /** 
    * @ORM\ManyToOne(targetEntity="Author", inversedBy="reviews") 
    * @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
    */ 
    private $author; 

    /** 
    * @ORM\ManyToOne(targetEntity="Article", inversedBy="reviews") 
    * @ORM\JoinColumn(name="article_id", referencedColumnName="id") 
    */ 
    private $article; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="review", type="text", nullable=true) 
    */ 
    private $review; 


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set rating 
    * 
    * @param integer $rating 
    * 
    * @return Review 
    */ 
    public function setRating($rating) 
    { 
     $this->rating = $rating; 

     return $this; 
    } 

    /** 
    * Get rating 
    * 
    * @return int 
    */ 
    public function getRating() 
    { 
     return $this->rating; 
    } 

    /** 
    * Set title 
    * 
    * @param string $title 
    * 
    * @return Review 
    */ 
    public function setTitle($title) 
    { 
     $this->title = $title; 

     return $this; 
    } 

    /** 
    * Get title 
    * 
    * @return string 
    */ 
    public function getTitle() 
    { 
     return $this->title; 
    } 

    /** 
    * Set authorId 
    * 
    * @param integer $authorId 
    * 
    * @return Review 
    */ 
    public function setAuthorId($authorId) 
    { 
     $this->authorId = $authorId; 

     return $this; 
    } 

    /** 
    * Get authorId 
    * 
    * @return int 
    */ 
    public function getAuthorId() 
    { 
     return $this->authorId; 
    } 

    /** 
    * Set review 
    * 
    * @param string $review 
    * 
    * @return Review 
    */ 
    public function setReview($review) 
    { 
     $this->review = $review; 

     return $this; 
    } 

    /** 
    * Get review 
    * 
    * @return string 
    */ 
    public function getReview() 
    { 
     return $this->review; 
    } 

    /** 
    * Set author 
    * 
    * @param \AppBundle\Entity\Author $author 
    * 
    * @return Review 
    */ 
    public function setAuthor(\AppBundle\Entity\Author $author = null) 
    { 
     $this->author = $author; 

     return $this; 
    } 

    /** 
    * Get author 
    * 
    * @return \AppBundle\Entity\Author 
    */ 
    public function getAuthor() 
    { 
     return $this->author; 
    } 

    /** 
    * Set article 
    * 
    * @param \AppBundle\Entity\Author $article 
    * 
    * @return Review 
    */ 
    public function setArticle(\AppBundle\Entity\Author $article = null) 
    { 
     $this->article = $article; 

     return $this; 
    } 

    /** 
    * Get article 
    * 
    * @return \AppBundle\Entity\Author 
    */ 
    public function getArticle() 
    { 
     return $this->article; 
    } 
} 

Вот мой файл статьи/review.html.twig

{% extends 'base.html.twig' %} 

{% block body %} 
    <h1>Review Article</h1> 

    {{ form_start(form) }} 
     {{ form_widget(form) }} 
     <input type="submit" value="Create" /> 
    {{ form_end(form) }} 

    <ul> 
     <li> 
      <a href="{{ path('article_index') }}">Back to the list</a> 
     </li> 
    </ul> 
{% endblock %} 

Update: Этот код работал

$reviewForm = $this->createFormBuilder($review) 
    ->add('review', ReviewType::class, array("label" => FALSE)) 
    ->setAction($this->generateUrl('fundraiser_review', array('id' =>$fundraiser->getId()))) 
    ->getForm(); 

Спасибо!

+0

В противном случае 'отзывы' вместо' review'? Попробуйте прочитать сообщение об ошибке. – ShiraNai7

+0

Хмм, @ ShiraNai7, вы можете быть на что-то, но теперь я очень смущен тем, как все это работает. Я изменил его на -> add ('reviews'), и ошибка исчезла.Я получил ошибку в заголовке, поэтому я изменил это на заголовки ... не повезло. Есть ли кто-нибудь, кто может объяснить, что я здесь делаю неправильно? И правильно ли это или нет, чтобы создать форму обзора в контроллере статей? Спасибо за комментарий! – user2305673

+0

О, я понимаю, почему «отзывы» работали ... У моей сущности есть отзывы об объекте недвижимости. Поэтому я все еще очень застрял. – user2305673

ответ

0

Поскольку вы создаете форму статьи, и если вы посмотрите в вашей статье Сущности, у вас есть коллекция в reviews массив, так что, таким образом, вы должны изменить код следующим образом:

$reviewForm = $this->createFormBuilder($article); 
$reviewForm->add('reviews') 
    ->add('title') 
    ->add('author', AuthorType::class, array("label" => FALSE)) 
    ->add('rating', ChoiceType::class, array(
     'choices' => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' =>'5'), 
     'expanded' => true, 
     'multiple' => false 
    )) 
    ->getForm(); 

Я думаю, что должно реши это. Не 100% уверены, но, пожалуйста, попробуйте и сообщите нам об этом.

+0

Спасибо, что ответили. Вы на правильном пути, указав, что мы составляем форму статьи. Я получаю сообщение об ошибке с предоставленным кодом («Во время рендеринга шаблона было выбрано исключение (« Примечание: неопределенная переменная: reviewForm »).»). Это может быть исправлено, но я уже использовал какой-то другой код. Я обновляю свой ответ с помощью нового кода. Благодаря! – user2305673

+0

Это сообщение об ошибке, ссылающееся на файл Twig 'article/review.html.twig'? –

+0

Я не уверен (извините, я действительно новичок в Symfony и отлаживаю его !!!). Вы знаете, как я мог сказать? – user2305673