DBAL in Doctrine has implementation of Visitor pattern. There are an interface with a few accept-methods.
interface Visitor
{
/**
* @return void
*/
public function acceptSchema(Schema $schema);
/**
* @return void
*/
public function acceptTable(Table $table);
public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint)
{
}
}
And some classes like
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);
}
}
}
Why method Schema::visit has parameter named $visitor ? All definitions of Visitor tells that exactly Visitor should have method visit. So accept method should be inside of Visitable So is there are some naming issues with Schema::visit($visitor)? Is DBAL\Visitor in fact Visitable? If this is true, why Visitor::accept does not call $schema->visit($this) ?
Some implementation of Dbal\Visitor looks like
/**
* {@inheritdoc}
*/
public function acceptSequence(Sequence $sequence)
{
$this->sequences->attach($sequence);
}
Is it not necessary to call $visitor->visit($this) inside of Visitable::accept()?
Aucun commentaire:
Enregistrer un commentaire