2.8. Płynny interfejs (Fluent Interface)¶
2.8.1. Przeznaczenie¶
Ideą tego wzorca jest tworzenie kodu, który jest łatwy do przeczytania, jak zdanie w języku naturalnym (np. angielskim).
2.8.2. Przykłady¶
- Doctrine2’s QueryBuilder działa podobnie jak klasa
Sql
poniżej. - PHPUnit wykorzystuje płynne interfejsy do budowy obiektów zastępczych (ang. mock object).
2.8.3. Diagram UML¶

2.8.4. Kod¶
Ten kod znajdziesz również na GitHub.
Sql.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\FluentInterface;
class Sql implements \Stringable
{
private array $fields = [];
private array $from = [];
private array $where = [];
public function select(array $fields): Sql
{
$this->fields = $fields;
return $this;
}
public function from(string $table, string $alias): Sql
{
$this->from[] = $table . ' AS ' . $alias;
return $this;
}
public function where(string $condition): Sql
{
$this->where[] = $condition;
return $this;
}
public function __toString(): string
{
return sprintf(
'SELECT %s FROM %s WHERE %s',
join(', ', $this->fields),
join(', ', $this->from),
join(' AND ', $this->where)
);
}
}
|
2.8.5. Testy¶
Tests/FluentInterfaceTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\FluentInterface\Tests;
use DesignPatterns\Structural\FluentInterface\Sql;
use PHPUnit\Framework\TestCase;
class FluentInterfaceTest extends TestCase
{
public function testBuildSQL()
{
$query = (new Sql())
->select(['foo', 'bar'])
->from('foobar', 'f')
->where('f.bar = ?');
$this->assertSame('SELECT foo, bar FROM foobar AS f WHERE f.bar = ?', (string) $query);
}
}
|