Je voudrais être en mesure d'utiliser des contraintes de validateur entité afin de vérifier si la book_id clé étrangère est valide, s'il vous plaît voir ci-dessous:validation de l'entité Symfony vérifier la clé étrangère existe
Book.php
/**
* Book
*
* @ORM\Table("book")
* @ORM\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repository\BookRepository")
*/
class Book
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="name", type="string")
* @Assert\Length(
* max = 250,
* maxMessage = "Name cannot be longer than {{ limit }} characters",
* groups={"create","update"}
*)
*/
private $name;
/**
* @ORM\OneToOne(targetEntity="Loan", mappedBy="book", fetch="LAZY")
*/
protected $loan;
}
prêt .php
/**
* Loan
*
* @ORM\Table("loan")
* @ORM\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repository\LoanRepository")
*/
class Loan
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
* @ORM\Column(name="book_id", type="integer")
*/
protected $book_id;
/**
* @var string
* @ORM\Column(name="name", type="string")
* @Assert\Length(
* max = 500,
* maxMessage = "Person cannot be longer than {{ limit }} characters",
* groups={"create","update"}
*)
*/
private $person;
/**
* @ORM\OneToOne(targetEntity="Book", inversedBy="loan")
* @ORM\JoinColumn(name="book_id", referencedColumnName="id")
*/
protected $book;
}
Voici comment je valide actuellement l'entité de prêt
$loan = new Loan();
$loan->setPerson($person);
$loan->setBookId($id);
/** @var ConstraintViolation $error */
foreach ($this->get('validator')->validate($loan,null,['create'])->getIterator() as $index => $error) {
$errorMessages[] = $error->getMessage();
}
j'ai pensé peut-être que je peux ajouter un validateur personnalisé comme celui-ci à l'entité de prêt:
/**
* @Assert\IsTrue(message = "The book does not exist")
* @return bool
*/
public function isBookLegal(BookRepository $bookRepository)
{
return !$bookRepository->fetchById($this->book_id);
}
Mais je finis à l'exception de suivi:
Type error: Too few arguments to function
AppBundle\Entity\Loan::isBookLegal(), 0 passed and exactly 1 expected
d'abord affecter le 1er paramètre de la variable foreach à une variable, puis l'utiliser dans foreach, ce qui est tout simplement désagréable. Deuxièmement, lorsque vous appelez votre 'isBookLegal', vous l'appelez sans paramètre - c'est pourquoi vous obtenez ce message. – Edwin
Mais comment puis-je appeler isBookLegal quand il est déclenché via validation? En d'autres termes comment puis-je valider pour passer le paramètre dans cette fonction? – Freid001