Как реализовать такой текучий интерфейс в php?

Мне очень понравилась идея текучего интерфейса, который используется в Laravel 4 и Yii2. Но, к сожалению, я не могу до конца понять как реализованы такие вещи.

Вот пример:
Route::get('/page/{id}', 'Admin@page')->where(['id' => $id]);

Как реализовать подобное? Самое главное:
- как реализовать с помощью статического метода(Route::get)?
- как сделать так, чтобы несмотря на то, что параметр передаётся последним (where), он был доступен для метода get?
- и наконец, как в таком примере сделать так, чтобы все необходимые действия проходили в методе get, и он был не просто методом, который возвращает какой-то класс.

---
UPD: вот смотрите, в чём у меня большая затычка:

Route::set('11', '22')->where('33');

class Route 
{
    public static function set($uri, $action)
    {
        return new Router($uri, $action);
    }
}

class Router
{
    private $params;
    private $uri;
    private $action;

    public function __construct($uri, $action)
    {
        $this->uri    = $uri;
        $this->action = $action;

        $this->master();
    }

    public function where($params)
    {
        $this->params = $params;
    }

    public function master()
    {
        echo $this->uri . ' | ' . $this->action . ' | ' . $this->params;
    }

    // ... ниже геттеры-сеттеры


Ну и мне выдаёт только такую строку "11 | 22 |". Я понимаю, что вызываю $this-master() из констуктора, когда ещё не сработал метод where. Но как по другому? Что я упускаю?
  • Вопрос задан
  • 2971 просмотр
Пригласить эксперта
Ответы на вопрос 2
keltanas
@keltanas
Software Developer
Как реализовать подобное?

Да как любой текучий интерфейс.

Самое главное:

- php.net/manual/en/function.forward-static-call.php подойдет?
- для метода get(), или чтобы интерфейс объекта, который возвращает get() имел метод where()?
- метод не может возвращать класс ни при каких обстоятельствах. А какие еще действия должны происходить в методе get() кроме return new Controller() и зачем?
Ответ написан
Комментировать
@tuxx
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы