Обеспечение роутинга нашего приложения, проектирование шаблонов роутинга

Для того чтобы приложение могло обрабатывать запросы, нам необходимо разработать схему роутинга. Для постоение шаблона маршрута будем использовать методы ядра.

Вообще, Prologue-framework можно роутить как угодно, есть десятки паттернов роутера которые использовались и тестировались на практике, но сейчас будет продемострирована оптимальная схема роутинга для веб-приложения.

Пишем маршрутизатор


<?php
defined('PROLOGUE__FRAMEWORK') or die ;

final Class BooksController extends PrController {
    public function index() {

        $this -> component('basic');

        $this -> init(['router']);
    }

    protected function router() {

        # Ограничеваем вложенность роута до 3 уровней (Классика) #
        if ($this -> url(4)) {
            $this -> error(404);
        }

        # построение шаблона роута #
        $this -> rout -> set('/controller/method/value/');

    }

}

Метод router()

В этом методе происходит постоение шаблона маршрута. Тут мы задаем правила, все что после первого / будет храниться в роутере с ключем controller, со вторым / ключ будет method ну и у url который идет после третьего слеш, ключ будет value


    protected function router() {

        # Ограничеваем вложенность роута до 3 уровней (Классика) #
        if ($this -> url(4)) {
            $this -> error(404);
        }

        # построение шаблона роута #
        $this -> rout -> set('/controller/method/value/');

    }

Инициализация метода

С помощью метода init() происходит инициализация других методов. Для того чтобы проинициализировать другие методы, необходимо в init() в качестве первого аргумента вставить массив с именами protected методов, и тогда все методы будут проинициализированны в том порядке, в котором вставленны в массив.


        $this -> init(['router']);

Пример использования шаблона роутинга для сохранения книги

Ниже приведенный код отобразит на экране saveBook, если в браузере вбить url вашсайт.ру/books/save/


<?php
defined('PROLOGUE__FRAMEWORK') or die ;

final Class BooksController extends PrController {
    public function index() {

        $this -> component('basic');

        $this -> init([
        'router',
        'saveBook']);
    }

    protected function router() {

        # Ограничеваем вложенность роута до 3 уровней (Классика) #
        if ($this -> url(4)) {
            $this -> error(404);
        }

        # построение шаблона роута #
        $this -> rout -> set('/controller/method/value/');

    }

    protected function saveBook() {

        # если текущий url /books/save/ #
        if ($this -> rout -> get('method') == 'save') {
            echo 'saveBook';
        }

    }

}

Доработка saveBook()

Использование последнего ключа нашего шаблона. Работаем с ключем value. В примере это выглядет так - если существует $this -> rout -> get('value'), то мы будем сохранять уже существующую запись с переданным id. Если перейти по ссылке  вашсайт.ру/books/save/1 ,то приложение выведет saveBook where id = 1 - это значит что мы готовимся изменить существующую запись. Если перейти по ссылке вашсайт.ру/books/save/ , то приложенее выведет saveBook new book - это значит что мы готовимся сохранять совершенно новую запись.


    protected function saveBook() {

        # если текущий url /books/save/ #
        if ($this -> rout -> get('method') == 'save') {
            # проверка на значение #
            if ($this -> rout -> get('value')) {
                # если value существует, то выполнится текущий блок кода #
                echo 'saveBook where id = ' . $this -> rout -> get('value');
            } else {
                # если url по прежнему  /books/save/ #
                echo 'saveBook new book';
            }

        }

    }

© 2015 - 2018