sgb004
sgb004

Reputation: 357

Symfony doesn't load my custom validator defined as service

I'm trying to inject EntityManagerInterface in my custom validator, but I have this error:

Attempted to load class "validator_check_client_id" from the global namespace.
Did you forget a "use" statement?

enter image description here

My code is:

CheckClientId.php

namespace App\Validator;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */

class CheckClientId extends Constraint{
    public $message = 'Test';
    
    public function validatedBy(){
        return 'validator_check_client_id';
    }
}

CheckClientIdValidator.php

namespace App\Validator;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class CheckClientIdValidator extends ConstraintValidator{
    private $entityManager;
    public function __construct(EntityManagerInterface $entityManager) {
        $this->entityManager = $entityManager;
    }
    
    public function validate($value, Constraint $constraint){
        //Todo
        return;
    }
}

services.yaml

    validator.check_client_id:
        class: App\Validator\CheckClientIdValidator
        autowire: false
        arguments:
            $entityManager: '@doctrine.orm.entity_manager'
        tags:
            - {
                  name: validator.constraint_validator,
                  alias: validator_check_client_id,
              }

Should I do an extra step to register my service? I think that symfony cannot find it because it is not properly registered.

I also tried to do what this answer says symfony validator as service not working, but I get a similar error:

Attempted to load class "app.validator.blog.slug_unique" from the global namespace.
Did you forget a "use" statement?

Do you have any idea what is happening?

Thank you for your help!

Upvotes: 0

Views: 774

Answers (1)

Cerad
Cerad

Reputation: 48865

Thanks to autowire and autoconfig, all you really have to do is to get your class names right. No changes to services.yaml. Here is a working example using a fresh 5.2 project.

# src/Validator/CheckClientId.php
namespace App\Validator;

use Symfony\Component\Validator\Constraint;

/** @Annotation */
class CheckClientId extends Constraint
{
    public $message = 'CheckClientId';
}
# =============================
# src/Validator/CheckClientIdValidator
namespace App\Validator;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

class CheckClientIdValidator extends ConstraintValidator
{
    public function __construct(private EntityManagerInterface $entityManager)
    {

    }
    public function validate($value, Constraint $constraint)
    {
        dump('validate ' . $value);
        throw new UnexpectedValueException($value, 'string');
    }
}
# ===============================
# Test Entity
# src/Entity/Client.php
namespace App\Entity;

use App\Validator as AcmeAssert;

class Client
{
    /** @AcmeAssert\CheckClientId */
    public $id = 42;
}
# ====================================
# Test Command
# src/Command/ValidateCommand
namespace App\Command;

use App\Entity\Client;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;

class ValidateCommand extends Command
{
    protected static $defaultName = 'test:validator';

    public function __construct(private ValidatorInterface $validator)
    {
        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $client = new Client();
        $errors = $this->validator->validate($client);
        echo $errors;

        return Command::SUCCESS;
    }
}

Get the test command working and move on from there.

Upvotes: 1

Related Questions