2 Stimmen

Werfen Sie etwas Licht auf diesen Kommentar aus Doctrine 2 Modul 'ObjectExists.php'

Ich bin gerade mit der Doctrine 2 Zeug arbeiten und landete auf der Doctrine Module für Validierungen wie ObjectExists.php y NoObjectExists.php .

Meine Frage ist, dass aus dem ursprünglichen Code, der gefunden werden kann aquí .

    /**
     * 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);
    }

Ich kann nicht verstehen, dass es hier erwähnt wird _" $options Die erforderlichen Schlüssel sind object_repository sein, die eine Instanz von Doctrine\Common\Persistence\ObjectRepository "_

Seit Doctrine\Common\Persistence\ObjectRepository eine Schnittstelle ist, wie soll ich diese Aussage entschlüsseln?

Oder anders gesagt, wie kann ich diesen Konstruktor von ObjectsExists Klasse und übergeben object_repository sein, die eine Instanz von Doctrine\Common\Persistence\ObjectRepository ?

Kann jemand etwas Licht auf diese, ich bin immer in dieses Zeug, so nicht hart sein auf meine Frage.

Gracias

1voto

Florent Punkte 12300

Seit Doctrine\Common\Persistence\ObjectRepository eine Schnittstelle ist, können Sie sie nicht instanziieren, aber Sie können sie implementieren.

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

Jetzt wird jede Instanz von MyObjectRepository erfüllt die object_repository Anforderung von ObjectsExists .

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

Mehr über instanceof :

instanceof wird verwendet, um festzustellen, ob eine PHP-Variable ein instanziiertes Objekt einer bestimmten Klasse ist.

instanceof kann auch verwendet werden, um festzustellen, ob eine Variable ein instanziiertes Objekt einer Klasse ist, die von einer übergeordneten Klasse erbt.

instanceof kann auch verwendet werden, um festzustellen, ob eine Variable ein instanziiertes Objekt einer Klasse ist, die eine Schnittstelle implementiert.

0voto

timdev Punkte 59971

Die häufigste Klasse, die Doctrine implementiert \Common\Persistence\ObjectRepository ist Doktrin \ORM\EntityRepository.

Wenn Sie also Doctrine ORM verwenden, sollte die object_repository-Option so etwas wie Ihr UserRepository sein (entweder explizit definiert, oder einfach das generische, das Sie von $em->getRepository('User') )

Der Grund dafür, dass er nicht explizit definiert ist, ist, dass die [No]ObjectExists-Validatoren nicht im DoctrineORMModul, sondern nur im DoctrineModul enthalten sind. Wenn Sie also pas ORM zu verwenden, müssen Sie nur Ihre eigene UserRepository-Klasse erstellen, die ObjectRepository implementiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X