У меня есть эта ошибка «Попытка вызвать неопределенный метод с именем 'getDoctrine' класса« AppBundle \ Validator \ Constraints \ ContainsAlphanumericValidator '». когда я отправляю форму.
Я хочу получить данные таблицы задач при проверке, но это дает мне ошибку выше.
// src/AppBundle/Validator/Constraints/ContainsAlphanumericValidator.php
namespace AppBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use AppBundle\Entity\ToDo;
use Doctrine\ORM\EntityRepository;
class ContainsAlphanumericValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$todo = $this->getDoctrine()->
getRepository('AppBundle:ToDo')->
find('1');
echo '<pre>';
print_r($todo);
exit;
if (!preg_match('/^[a-zA-Z0-9]+$/', $value, $matches)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}', $value)
->addViolation();
}
}
}
Вы должны внедрить EntityManager в свою функцию. Но я рекомендую встроить функцию поиска в каталог репозитория и получать данные оттуда.
@ElaAle Спасибо за вашу помощь. Можете ли вы дать мне ссылку, например, на метод каталога репозитория? Потому что я новичок в Symfony.
Лучше обратиться к документации репозитория symfony.com/doc/3.3/doctrine/repository.html, чтобы вы могли создать свои собственные методы запроса внутри репозитория.
Это официальная документация для Symfony 3.4, Как создавать собственные классы репозитория: symfony.com/doc/3.4/doctrine/repository.html. Пожалуйста, обратитесь к документации по используемой вами версии Symfony.
@ElaAle Я проверил эту документацию, но проблема все еще не решена.






Ваша проблема связана с внедрением зависимостей. Чтобы обойти эту проблему, Symfony предоставляет движок сервисных контейнеров: https://symfony.com/doc/current/service_container.html
Потому что по умолчанию symfony будет делать:
$validator = new ContainsAlphanumericValidator();
А ты, ты хочешь научить его делать:
$validator = new ContainsAlphanumericValidator($entityManager);
Для этого вам нужно добавить на ваш services.yml:
AppBundle\Validator\Constraints\ContainsAlphanumericValidator:
attributes:
- "@doctrine.orm.entity_manager" #require EntityManager as first parameter of your construct
И обновите свой класс следующим образом:
class ContainsAlphanumericValidator extends ConstraintValidator
{
private $em;
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
public function validate($value, Constraint $constraint)
{
$todo = $this->em->getRepository('AppBundle:ToDo')->
find('1');
echo '<pre>';
print_r($todo);
exit;
if (!preg_match('/^[a-zA-Z0-9]+$/', $value, $matches)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}', $value)
->addViolation();
}
}
}
Когда я обновил ваш контент в файле services.yml, я получаю сообщение об ошибке -> Не удается выполнить автоматическое подключение службы «AppBundle \ Validator \ Constraints \ ContainsAlphanumericValidat или»: аргумент «$ em» метода «__construct ()» имеет тип «AppBundle \ Validator \ Constraints \ EntityManagerInterface ", но этот класс не найден.
вы забыли импортировать интерфейс EntityManager, добавив в начало файла: use Doctrine\ORM\EntityManagerInterface;
Спасибо за вашу помощь. Мне не нужно обновлять файл services.yml, а затем я обновил свой код ContainsAlphanumericValidator.php с добавлением использования Doctrine \ ORM \ EntityManagerInterface; метод и моя проблема решена. Большое спасибо.
Не уверен насчет symfony, просто хотел знать, содержит ли класс
ConstraintValidatorgetDoctrine()?