Вот мои мысли и где я нахожусь. Пожалуйста, скажите мне, является ли это плохой практикой!В 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();
Спасибо!
В противном случае 'отзывы' вместо' review'? Попробуйте прочитать сообщение об ошибке. – ShiraNai7
Хмм, @ ShiraNai7, вы можете быть на что-то, но теперь я очень смущен тем, как все это работает. Я изменил его на -> add ('reviews'), и ошибка исчезла.Я получил ошибку в заголовке, поэтому я изменил это на заголовки ... не повезло. Есть ли кто-нибудь, кто может объяснить, что я здесь делаю неправильно? И правильно ли это или нет, чтобы создать форму обзора в контроллере статей? Спасибо за комментарий! – user2305673
О, я понимаю, почему «отзывы» работали ... У моей сущности есть отзывы об объекте недвижимости. Поэтому я все еще очень застрял. – user2305673