Я пытаюсь получить валидатор UniqueEntity от Symfony, работающий для моих объектов Doctrine. Symfony валидатор уже подключен и работает, UniqueEntity от Symfony \ Bridge, однако, является более сложной задачей, показывая эту ошибку:Использование Symfony UniqueEntity с Doctrine
PHP Fatal error: Class 'doctrine.orm.validator.unique' not found in /app/vendor/symfony/validator/Symfony/Component/Validator/ConstraintValidatorFactory.php on line 46
Похоже, если ValidatorFactory запрашивает валидатор UniqueEntity из контейнера Symfony, которого у меня нет, потому что я не использую полный стек symfony.
Моя сущность выглядит следующим образом:
<?php
namespace App\Model;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints as AssertDoctrine;
/**
* User
*
* @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"}), @ORM\UniqueConstraint(name="username_UNIQUE", columns={"username"})})
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @AssertDoctrine\UniqueEntity("username")
*/
class User extends AbstractEntity
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=45, unique=true, nullable=false)
* @Assert\Length(min=3, max=45)
*/
protected $username;
/** ... */
}
где AbstractEntity является отображенная суперкласса, включая Trait, который обеспечивает функциональные возможности проверки для всех объектов:
<?php
namespace App\Model\Traits;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Validation;
use App\Utility\Exception\ConstraintViolationException;
/**
* A trait enabling validation of Doctrine entities to ensure invalid entities
* don't reach the persistence layer.
*/
trait ValidatorAwareTrait
{
public function validate()
{
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator();
$violations = $validator->validate($this);
// Count is used as this is not an array but a ConstraintViolationList
if (count($violations) !== 0) {
$message = $violations[0]->getPropertyPath() . ': ' . $violations[0]->getMessage();
throw new ConstraintViolationException($message);
}
return true;
}
}
Могли бы вы предоставить некоторые детали? Ваш ответ - в основном код – jhhoff02