Symfony entity validation verify foreign key exists

Viewed 4080

I would like to be able to use entity validator constraints to verify if the foreign key book_id is valid, please see below:

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;
}

Loan.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;
}

Here is how I am currently validating the loan entity

    $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();
    }

I figured maybe I can add a custom validator like this to the loan entity:

/**
 * @Assert\IsTrue(message = "The book does not exist")
 * @return bool
 */
public function isBookLegal(BookRepository $bookRepository)
{
    return !$bookRepository->fetchById($this->book_id);
}

But I end up with the follow exception:

Type error: Too few arguments to function 
AppBundle\Entity\Loan::isBookLegal(), 0 passed and exactly 1 expected
1 Answers
Related