A free and open-source book on ZF3 for beginners


5.7. Тип маршрута Regex

Тип маршрута Regex (от REGular EXpressions - регулярные выражения) полезен, если у вас есть URL, которые могут быть сопоставлены с регулярным выражением.

Документация будет состоять из "статических страниц", сопоставленных с URL подобно /doc/<page_name>.html.

Термином "статическая страница" мы обозначаем страницу, которая содержит, в основном, статический HTML-код плюс несколько встроенных фрагментов PHP-кода. Для таких простых страниц не нужно создавать отдельные действия контроллера. Все "статические" страницы могут обслуживаться одним единственным действием контроллера.

Давайте реализуем маршрут, который будет обслуживать "статические" страницы сайта. Поскольку такие страницы весьма просты, вам, как правило, не придется добавлять для каждой страницы свой метод действия. Все страницы будут управляться одним действием IndexController::docAction().

Сперва добавим маршрут Regex с именем "doc" в файл module.config.php:

'doc' => [
    'type' => Regex::class,
    'options' => [
        'regex'    => '/doc(?<page>\/[a-zA-Z0-9_\-]+)\.html',
        'defaults' => [
            'controller' => Controller\IndexController::class,
            'action'     => 'doc',
        ],
        'spec'=>'/doc/%page%.html'
    ],
],

Строка 2 определяет тип Regex для маршрута. В строке 4 имеется регулярное выражение /doc(?<page>\/[a-zA-Z0-9_\-]+)\.html. Оно будет сопоставлять URL подобно "/doc/contents.html", "/docs/introduction.html" и так далее. Выражение содержит именованный захват 6 "page", который при установлении соответствия будет возвращен маршрутизатором вместе с параметрами по умолчанию.

Строка 9 содержит опцию spec, которая используется для генерации маршрутом URL (мы обсудим генерацию маршрутом URL позже в этой главе).

6) В регулярных выражениях PCRE возможно дать имя подшаблону, используя синтаксис (?P<name>pattern). Этот подшаблон затем будет индексирован в массиве matches по имени.

Не забудьте добавить следующую строчку в начало файла module.config.php:

use Zend\Router\Http\Regex;

Затем добавьте такое действие в класс IndexController:

public function docAction() 
{
    $pageTemplate = 'application/index/doc'.
          $this->params()->fromRoute('page', 'documentation.phtml');        
  
    $filePath = __DIR__.'/../../view/'.$pageTemplate.'.phtml';
    if(!file_exists($filePath) || !is_readable($filePath)) {
        $this->getResponse()->setStatusCode(404);
        return;
    }
	
    $viewModel = new ViewModel([
            'page'=>$pageTemplate
        ]);
    $viewModel->setTemplate($pageTemplate);
	
    return $viewModel;
}

В строках 3-4, мы извлекаем из маршрута параметр page (помните именованный захват "page" из нашего регулярного выражения?) и сохраняем его как переменную $pageTemplate. Мы будем использовать эту переменную для определения имени шаблона представления, чтобы передать его разрешателю представлений. Затем, в строках 6-10, мы проверяем, есть ли такой файл, и, если его нет, возвращаем код состояния 404 "Not Found", который принуждает ZF3 отобразить страницу ошибки. В строке 12 мы создаем контейнер для переменных ViewModel, а в строке 15 мы явно задаем имя шаблона представления для визуализации.

Чтобы увидеть систему документации в действии, создайте пару "статических" файлов шаблона представления: страницу Table of Contents (Оглавление) (contents.phtml) и страницу Introduction (Введение) (introduction.phtml). Создайте подкаталог doc под каталогом view/application/index модуля Application и поместите туда шаблон представления contents.phtml:

<h1>Table of Contents</h1>

<ul>
    <li>
        <a href="<?= $this->url('doc', ['page'=>'introduction']); ?>">
	        Introduction
        </a>
    </li>  
</ul>

Выше представлен HTML-код для заголовка страницы "Table of Contents" и список, содержащий единственный элемент "Introduction", ведущий к "статической" странице Introduction. URL генерируется с помощью помощника видов Url (подробнее о помощнике Url смотрите в следующих разделах этой главы).

Затем добавьте страницу introduction.phtml в тот же каталог doc:

<h1>Introduction</h1>

<p>Some introductory materials.</p>

В этих строках мы определяем HTML-разметку для простой страницы Introduction.

Теперь при открытии в браузере URL "http://localhost/doc/contents.html", вы увидите простую и удобную систему документации, которую вы можете расширить и использовать для своего сайта (рисунок 5.8):

Рисунок 5.8. "Статическая" страница Рисунок 5.8. "Статическая" страница

Нажатие на ссылку Introduction направит вас на статическую страницу "Introduction". Вы также можете добавить другие страницы в директорию doc, чтобы сделать их автоматически доступными для пользователей сайта через наш маршрут типа Regex.

Недостаток такой системы документации в том, что она будет работать не очень хорошо, если вы поместите вложенные страницы в подкаталоги под каталогом doc. Причина такой ограниченности в том, что маршрут Regex собирает URL. Вы не можете сгенерировать URL, содержащий слеши, так как эти "небезопасные" символы будут автоматически закодированы. Мы обойдем эту проблему с помощью нашего собственного типа маршрута, который мы создадим в конце этой главы.


Top