Doctrine DBAL Шаблон посетителя - PullRequest
1 голос
/ 10 марта 2019

DBAL в Doctrine имеет реализацию шаблона Visitor. Есть интерфейс с несколькими методами accept.

interface Visitor
{
    /**
     * @return void
     */
    public function acceptSchema(Schema $schema);

    /**
     * @return void
     */
    public function acceptTable(Table $table);

    public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint)
    {
    }
}

И некоторые классы, такие как

class Schema
{
    /**
     * @return void
     */
    public function visit(Visitor $visitor)
    {
        $visitor->acceptSchema($this);

        if ($visitor instanceof NamespaceVisitor) {
            foreach ($this->namespaces as $namespace) {
                $visitor->acceptNamespace($namespace);
            }
        }

        foreach ($this->_tables as $table) {
            $table->visit($visitor);
        }

        foreach ($this->_sequences as $sequence) {
            $sequence->visit($visitor);
        }
    } 
}

Почему метод Schema::visit имеет параметр с именем $visitor? Во всех определениях Visitor говорится, что именно Visitor должен иметь метод visit. Так что accept метод должен быть внутри Visitable Так есть ли некоторые проблемы с именами Schema::visit($visitor)? DBAL\Visitor на самом деле Visitable? Если это так, почему Visitor::accept не вызывает $ schema-> visit ($ this)?

Некоторая реализация Dbal\Visitor выглядит как

  /**
     * {@inheritdoc}
     */
    public function acceptSequence(Sequence $sequence)
    {
        $this->sequences->attach($sequence);
    }

Не обязательно ли звонить $visitor->visit($this) внутри Visitable::accept()?

...