2

我现在正在使用 Doctrine 2 的东西,并使用 Doctrine 模块进行验证,例如ObjectExists.phpNoObjectExists.php.

我的问题是从原始代码中可以找到here

    /**
     * Constructor
     *
     * @param array $options required keys are `object_repository`, which must be an instance of
     * Doctrine\Common\Persistence\ObjectRepository, and `fields`, with either
     * a string or an array of strings representing the fields to be matched by the validator.
     * @throws \Zend\Validator\Exception\InvalidArgumentException
     */
    public function __construct(array $options)
    {
        if (!isset($options['object_repository']) || !$options['object_repository'] instanceof ObjectRepository) {
            if (!array_key_exists('object_repository', $options)) {
                $provided = 'nothing';
            } else {
                if (is_object($options['object_repository'])) {
                    $provided = get_class($options['object_repository']);
                } else {
                    $provided = getType($options['object_repository']);
                }
            }

            throw new Exception\InvalidArgumentException(sprintf(
                'Option "object_repository" is required and must be an instance of'
                    . ' Doctrine\Common\Persistence\ObjectRepository, %s given',
                $provided
            ));
        }

        $this->objectRepository = $options['object_repository'];

        if (!isset($options['fields'])) {
            throw new Exception\InvalidArgumentException(
                'Key `fields` must be provided and be a field or a list of fields to be used when searching for'
                    . ' existing instances'
            );
        }

        $this->fields = $options['fields'];
        $this->validateFields();

        parent::__construct($options);
    }

我无法理解这里提到的$options必需的键是object_repository,它必须是Doctrine\Common\Persistence\ObjectRepository”的一个实例

既然Doctrine\Common\Persistence\ObjectRepository是接口,我应该如何解码该语句?

或者换句话说,我怎样才能调用这个ObjectsExists类的构造函数并传递object_repository,它必须是一个实例Doctrine\Common\Persistence\ObjectRepository

有人可以对此有所了解吗,我正在研究这些东西,所以不要对我的问题苛刻。

谢谢

4

2 回答 2

1

由于Doctrine\Common\Persistence\ObjectRepository是一个接口,您无法实例化它,但您可以实现它。

class MyObjectRepository implements Doctrine\Common\Persistence\ObjectRepository
{
    // ...
}

现在 will的每个实例MyObjectRepository都满足.object_repositoryObjectsExists

new ObjectsExists(array(
    'object_repository' => new MyObjectRepository(),
    // ...
));

更多关于instanceof

instanceof用于判断一个PHP变量是否是某个类的实例化对象。

instanceof也可以用来判断一个变量是否是继承自父类的类的实例化对象。

instanceof也可以用来判断一个变量是否是一个实现了接口的类的实例化对象。

于 2012-09-07T15:10:14.743 回答
0

实现 Doctrine\Common\Persistence\ObjectRepository 的最常见的类是 Doctrine\ORM\EntityRepository。

因此,如果您使用 Doctrine ORM,则 object_repository 选项应该类似于您的 UserRepository (明确定义,或者只是您从中返回的通用选项$em->getRepository('User')

它没有明确定义的原因是因为 [No]ObjectExists 验证器不在 DoctrineORMModule 中,而只是在 DoctrineModule 中。所以如果你使用 ORM,你只需要创建你自己的实现 ObjectRepository 的 UserRepository 类。

于 2012-09-09T21:29:43.193 回答