Ich möchte in der Lage sein Entity Validator Einschränkungen zu verwenden, um zu überprüfen, ob der Fremdschlüssel book_id gültig ist, finden Sie unter:Symfony Einheit Validierung Fremdschlüssel überprüfen existiert
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;
}
Hier ist, wie ich zur Zeit das Darlehen Unternehmen am Validieren
$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();
}
Ich dachte, vielleicht kann ich einen benutzerdefinierten Validator wie dies für das Darlehen Unternehmen hinzufügen:
/**
* @Assert\IsTrue(message = "The book does not exist")
* @return bool
*/
public function isBookLegal(BookRepository $bookRepository)
{
return !$bookRepository->fetchById($this->book_id);
}
Aber ich mit der Folge Ausnahme am Ende:
Type error: Too few arguments to function
AppBundle\Entity\Loan::isBookLegal(), 0 passed and exactly 1 expected
übergeben zuerst den ersten Parameter von der Foreach zu einer Variablen zuweisen und dann in foreach verwenden, das ist nur böse. Zweitens, wenn Sie Ihr 'iBookLegal' anrufen, rufen Sie es ohne Parameter auf - deshalb erhalten Sie diese Nachricht. – Edwin
Aber wie kann ich isBookLegal aufrufen, wenn es über validate ausgelöst wird? Mit anderen Worten, wie kann ich validieren, um den Parameter in diese Funktion zu übergeben? – Freid001