2

バリデーター サービスがバリデーターに提供されていません。「警告: My\Bundle\Validator\Constraints\MyCustomValidator::__construct() の引数 1 がありません...」というエラーが表示されます。

ここに私のservices.ymlがあります

// My\Bundle\Resources\config\services.yml
services:
    my.validator.service:
        class: My\Bundle\Validator\Constraints\MyCustomValidator
        arguments: [ @doctrine.orm.entity_manager ]

ここに私のバリデータークラスがあります:

// My\Bundle\Validator\Constraints\MyCustomValidator
namespace My\Bundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use Doctrine\ORM\EntityManager;

class MyCustomValidator extends ConstraintValidator
{
    private $em;

    public function __construct($em)
    {
        $this->em = $em;
    }

    public function validate($value, Constraint $constraint)
    {
        // Do something
    }
}

ここに私のvalidation.ymlがあります

// My\Bundle\Resources\config\validation.yml
My\Bundle\Entity\Page:
    properties:
        name:
            - NotBlank: ~
            - My\Bundle\Validator\Constraints\MyCustom: ~

ここに私の制約クラスがあります

namespace My\Bundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

class MyCustom extends Constraint
{
    public $message = 'Something is wrong with "%string%".';

    public function validatedBy()
    {
        return get_class($this) . 'Validator';
    }
}

誰かがこれで私を助けることができれば、私は非常に感謝しています.

引数名も「@doctrine.orm.default_entity_manager」に変更しようとしましたが、うまくいきませんでした。

4

2 に答える 2

5

問題は私のservices.ymlでした。このサービスはバリデーターとして使用されているため、validator.constraint_validator タグを使用する必要があります。これはドキュメントにあります。おっと!

services:
    my.validator.service:
        class: My\Bundle\Validator\Constraints\MyCustomValidator
        arguments: [ @doctrine.orm.entity_manager ]
        tags:
            - { name: validator.constraint_validator, alias: my_custom_alias}

上記のエイリアスを返すように、Constraint クラスの validatedBy() メソッドをオーバーライドする必要もあります。

// My\Bundle\Validator\Constrains\MyCustom.php
public function validatedBy()
{
    return 'my_custom_alias';
}
于 2013-04-30T11:19:41.970 に答える
0

ドクトリン レジストリをサービスに渡し、それを使用してエンティティ マネージャ インスタンスを取得する必要があります。

コンストラクターを次のように変更します。

public function __construct(RegistryInterface $registry)
{
    $this->registry = $registry;
}

次に、サービス構成を次のように修正します。

// My\Bundle\Resources\config\services.yml
services:
    my.validator.service:
        class: My\Bundle\Validator\Constraints\MyCustomValidator
        arguments: [ @doctrine ]

エンティティマネージャを取得する必要があるときはいつでもMyCustomValidatorこれを行うことができます

$em = $this->registry->getManager()
于 2013-04-29T15:20:41.787 に答える