传递给 App\Entity\Rating::seatPost() 的参数 1 必须是 App\Entity\Post 的实例或 null - Symfony 4
Argument 1 passed to App\Entity\Rating::setPost() must be an instance of App\Entity\Post or null - Symfony4
我是 Symfony4 的新手。我有一个与 table 中的设置值相关的问题,点击按钮。我想通过单击“赞”按钮将用户 ID 和 post ID 存储在 table 中,但它给了我一个错误。
我正在通过路由传递 post id,它应该存储在数据库中,但它没有。请帮我解决我的问题。我在这里给出我所有的代码是我的实体:
App/Entity/Rating.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\RatingRepository")
*/
class Rating
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\user", inversedBy="ratings")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\post", inversedBy="ratings")
*/
private $post;
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?user
{
return $this->user;
}
public function setUser(?user $user): self
{
$this->user = $user;
return $this;
}
public function getPost(): ?post
{
return $this->post;
}
public function setPost(?post $post): self
{
$this->post = $post;
return $this;
}
}
App/Entity/Post.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
*/
class Post
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\File(
* maxSize = "30M"
* )
*/
private $attachment;
/**
* @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
* @ORM\OrderBy({"published"="DESC"})
*/
private $published;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="posts")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Rating", mappedBy="post")
*/
private $ratings;
public function __construct()
{
$this->ratings = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
public function getAttachment(): ?string
{
return $this->attachment;
}
public function setAttachment(?string $attachment): self
{
$this->attachment = $attachment;
return $this;
}
public function getPublished(): ?\DateTimeInterface
{
return $this->published;
}
public function setPublished(\DateTimeInterface $published): self
{
$this->published = $published;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
/**
* @return Collection|Rating[]
*/
public function getRatings(): Collection
{
return $this->ratings;
}
public function addRating(Rating $rating): self
{
if (!$this->ratings->contains($rating)) {
$this->ratings[] = $rating;
$rating->setPost($this);
}
return $this;
}
public function removeRating(Rating $rating): self
{
if ($this->ratings->contains($rating)) {
$this->ratings->removeElement($rating);
// set the owning side to null (unless already changed)
if ($rating->getPost() === $this) {
$rating->setPost(null);
}
}
return $this;
}
}
App/Entity/User.php
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\OrderBy;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields={"username"}, message="There is already an account with this username")
* @UniqueEntity(fields={"email"}, message="There is already an account with this email")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=191, unique=true)
*/
private $username;
/**
* @ORM\Column(type="string", length=255)
*/
private $password;
/**
* @ORM\Column(type="string", length=191, unique=true)
*/
private $email;
/**
* @ORM\Column(type="string", length=50)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Post", mappedBy="user", orphanRemoval=true)
* @ORM\OrderBy({"published"="DESC"})
*/
private $posts;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Follower", mappedBy="user", orphanRemoval=true)
*/
private $followers;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Rating", mappedBy="user")
*/
private $ratings;
public function __construct()
{
$this->posts = new ArrayCollection();
$this->followers = new ArrayCollection();
$this->ratings = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function serialize()
{
return serialize([
$this->id,
$this->username,
$this->password,
]);
}
public function unserialize($serialized)
{
list (
$this->id,
$this->username,
$this->password
) = unserialize($serialized);
}
public function getRoles()
{
return [
'ROLE_USER'
];
}
public function getSalt() {
return null;
}
public function eraseCredentials() {
$this->plainPassword = null;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
/**
* @return Collection|Post[]
*/
public function getPosts(): Collection
{
return $this->posts;
}
public function addPost(Post $post): self
{
if (!$this->posts->contains($post)) {
$this->posts[] = $post;
$post->setUser($this);
}
return $this;
}
public function removePost(Post $post): self
{
if ($this->posts->contains($post)) {
$this->posts->removeElement($post);
// set the owning side to null (unless already changed)
if ($post->getUser() === $this) {
$post->setUser(null);
}
}
return $this;
}
/**
* @return Collection|Follower[]
*/
public function getFollowers(): Collection
{
return $this->followers;
}
public function addFollower(Follower $follower): self
{
if (!$this->followers->contains($follower)) {
$this->followers[] = $follower;
$follower->setUser($this);
}
return $this;
}
public function removeFollower(Follower $follower): self
{
if ($this->followers->contains($follower)) {
$this->followers->removeElement($follower);
// set the owning side to null (unless already changed)
if ($follower->getUser() === $this) {
$follower->setUser(null);
}
}
return $this;
}
/**
* @return Collection|Rating[]
*/
public function getRatings(): Collection
{
return $this->ratings;
}
public function addRating(Rating $rating): self
{
if (!$this->ratings->contains($rating)) {
$this->ratings[] = $rating;
$rating->setUser($this);
}
return $this;
}
public function removeRating(Rating $rating): self
{
if ($this->ratings->contains($rating)) {
$this->ratings->removeElement($rating);
// set the owning side to null (unless already changed)
if ($rating->getUser() === $this) {
$rating->setUser(null);
}
}
return $this;
}
}
路由传递post id
<?php
namespace App\Controller;
use App\Entity\Post;
use App\Entity\User;
use App\Entity\Follower;
use App\Entity\Rating;
use App\Form\PostType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class PostController extends AbstractController
{
/**
* @Route("user/like/{id}")
*/
public function like(Request $request, $id){
$like = new Rating();
$like->setPost($id);
$like->setUser($this->getUser());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($like);
$entityManager->flush();
return $this->redirectToRoute('twitter');
}
}
在浏览器中发现错误消息
传递给 App\Entity\Rating::setPost() 的参数 1 必须是 App\Entity\Post 的实例或 null,给定的字符串,在第 25 行的 C:\xampp\htdocs\spractice-backup\src\Controller\PostController.php 中调用
提前致谢
你不能只将 id 设置为 Doctrine 的关系。您需要从存储库中获取整个 Post
实体。尝试这样的事情:
/**
* @Route("user/like/{id}")
*/
public function like(Request $request, $id){
$post = $this->getDoctrine()->getRepository(Post::class)->find($id);
if (!$post) {
throw $this->createNotFoundException('The post does not exist');
}
$like = new Rating();
$like->setPost($post);
$like->setUser($this->getUser());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($like);
$entityManager->flush();
return $this->redirectToRoute('twitter');
}
我是 Symfony4 的新手。我有一个与 table 中的设置值相关的问题,点击按钮。我想通过单击“赞”按钮将用户 ID 和 post ID 存储在 table 中,但它给了我一个错误。
我正在通过路由传递 post id,它应该存储在数据库中,但它没有。请帮我解决我的问题。我在这里给出我所有的代码是我的实体:
App/Entity/Rating.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\RatingRepository")
*/
class Rating
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\user", inversedBy="ratings")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\post", inversedBy="ratings")
*/
private $post;
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?user
{
return $this->user;
}
public function setUser(?user $user): self
{
$this->user = $user;
return $this;
}
public function getPost(): ?post
{
return $this->post;
}
public function setPost(?post $post): self
{
$this->post = $post;
return $this;
}
}
App/Entity/Post.php
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\PostRepository")
*/
class Post
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\File(
* maxSize = "30M"
* )
*/
private $attachment;
/**
* @ORM\Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
* @ORM\OrderBy({"published"="DESC"})
*/
private $published;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="posts")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Rating", mappedBy="post")
*/
private $ratings;
public function __construct()
{
$this->ratings = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
public function getAttachment(): ?string
{
return $this->attachment;
}
public function setAttachment(?string $attachment): self
{
$this->attachment = $attachment;
return $this;
}
public function getPublished(): ?\DateTimeInterface
{
return $this->published;
}
public function setPublished(\DateTimeInterface $published): self
{
$this->published = $published;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
/**
* @return Collection|Rating[]
*/
public function getRatings(): Collection
{
return $this->ratings;
}
public function addRating(Rating $rating): self
{
if (!$this->ratings->contains($rating)) {
$this->ratings[] = $rating;
$rating->setPost($this);
}
return $this;
}
public function removeRating(Rating $rating): self
{
if ($this->ratings->contains($rating)) {
$this->ratings->removeElement($rating);
// set the owning side to null (unless already changed)
if ($rating->getPost() === $this) {
$rating->setPost(null);
}
}
return $this;
}
}
App/Entity/User.php
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping\OrderBy;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields={"username"}, message="There is already an account with this username")
* @UniqueEntity(fields={"email"}, message="There is already an account with this email")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=191, unique=true)
*/
private $username;
/**
* @ORM\Column(type="string", length=255)
*/
private $password;
/**
* @ORM\Column(type="string", length=191, unique=true)
*/
private $email;
/**
* @ORM\Column(type="string", length=50)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Post", mappedBy="user", orphanRemoval=true)
* @ORM\OrderBy({"published"="DESC"})
*/
private $posts;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Follower", mappedBy="user", orphanRemoval=true)
*/
private $followers;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Rating", mappedBy="user")
*/
private $ratings;
public function __construct()
{
$this->posts = new ArrayCollection();
$this->followers = new ArrayCollection();
$this->ratings = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(string $email): self
{
$this->email = $email;
return $this;
}
public function serialize()
{
return serialize([
$this->id,
$this->username,
$this->password,
]);
}
public function unserialize($serialized)
{
list (
$this->id,
$this->username,
$this->password
) = unserialize($serialized);
}
public function getRoles()
{
return [
'ROLE_USER'
];
}
public function getSalt() {
return null;
}
public function eraseCredentials() {
$this->plainPassword = null;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
/**
* @return Collection|Post[]
*/
public function getPosts(): Collection
{
return $this->posts;
}
public function addPost(Post $post): self
{
if (!$this->posts->contains($post)) {
$this->posts[] = $post;
$post->setUser($this);
}
return $this;
}
public function removePost(Post $post): self
{
if ($this->posts->contains($post)) {
$this->posts->removeElement($post);
// set the owning side to null (unless already changed)
if ($post->getUser() === $this) {
$post->setUser(null);
}
}
return $this;
}
/**
* @return Collection|Follower[]
*/
public function getFollowers(): Collection
{
return $this->followers;
}
public function addFollower(Follower $follower): self
{
if (!$this->followers->contains($follower)) {
$this->followers[] = $follower;
$follower->setUser($this);
}
return $this;
}
public function removeFollower(Follower $follower): self
{
if ($this->followers->contains($follower)) {
$this->followers->removeElement($follower);
// set the owning side to null (unless already changed)
if ($follower->getUser() === $this) {
$follower->setUser(null);
}
}
return $this;
}
/**
* @return Collection|Rating[]
*/
public function getRatings(): Collection
{
return $this->ratings;
}
public function addRating(Rating $rating): self
{
if (!$this->ratings->contains($rating)) {
$this->ratings[] = $rating;
$rating->setUser($this);
}
return $this;
}
public function removeRating(Rating $rating): self
{
if ($this->ratings->contains($rating)) {
$this->ratings->removeElement($rating);
// set the owning side to null (unless already changed)
if ($rating->getUser() === $this) {
$rating->setUser(null);
}
}
return $this;
}
}
路由传递post id
<?php
namespace App\Controller;
use App\Entity\Post;
use App\Entity\User;
use App\Entity\Follower;
use App\Entity\Rating;
use App\Form\PostType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class PostController extends AbstractController
{
/**
* @Route("user/like/{id}")
*/
public function like(Request $request, $id){
$like = new Rating();
$like->setPost($id);
$like->setUser($this->getUser());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($like);
$entityManager->flush();
return $this->redirectToRoute('twitter');
}
}
在浏览器中发现错误消息 传递给 App\Entity\Rating::setPost() 的参数 1 必须是 App\Entity\Post 的实例或 null,给定的字符串,在第 25 行的 C:\xampp\htdocs\spractice-backup\src\Controller\PostController.php 中调用
提前致谢
你不能只将 id 设置为 Doctrine 的关系。您需要从存储库中获取整个 Post
实体。尝试这样的事情:
/**
* @Route("user/like/{id}")
*/
public function like(Request $request, $id){
$post = $this->getDoctrine()->getRepository(Post::class)->find($id);
if (!$post) {
throw $this->createNotFoundException('The post does not exist');
}
$like = new Rating();
$like->setPost($post);
$like->setUser($this->getUser());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($like);
$entityManager->flush();
return $this->redirectToRoute('twitter');
}