Создаем свой Фреймворк на компонентах symfony2. Часть 3

Пока что, наше приложение довольно простое и содержит всего одну страничку. Давайте немного посумасбродствуем, и добавим еще одну, чтобы сказать “Пока”.

Как видите, bye.php и index.php содержат много общего кода. Давайте выделим код, который мы можем разделить между обеими страничками. Общий код — звучит как хороший план, для создания нашего первого настоящего фреймворка..

В PHP для такого рефакторинга обычно используется подключаемый файл:

Посмотрим что получилось:

И для странички с прощанием:

Мы вынесли общий код в отдельный файл, но… Это не похоже на хорошую абстракцию, не так ли? Во-первых, мы все еще имеем метод Send() на обеих страничках. Во-вторых, наши странички не похожи на шаблоны, и мы все еще не можем правильно тестировать код.

Более того, добавление новой странички, означает, что нам нужно создавать новый PHP скрипт, имя которого конечный юзер видит в URL (http://example.com/bye.php). Т.е. мы имеем прямую связь между PHP скриптом и URL. Это потому, что доставкой запроса напрямую занимается web-сервер. Неплохо было бы взять доставку запроса под свой контроль, ради обеспечения большей гибкости. Этого легко добиться, если производить роутинг всех клиентских запросов в одном PHP скрипте.

Использование одного PHP скрипта для всех пользовательских запросов — это шаблон проектирования “Front controller

Такой скрипт может выглядеть вот так:

А вот, например, новый hello.php

В скрипте front.php, массив $map сопоставляет URL с соответствующими PHP скриптами.

Как бонус, если клиент запрашивает путь, не определенный в массиве $map, мы возвращаем ему нашу кастомизированную страничку 404.

Для доступа к страничкам теперь можно использовать front.php:
http://example.com/front.php/hello?name=Fabien
http://example.com/front.php/bye
/hello и /bye — пути страничек.

Большинство web серверов(в т.ч. Apache и Nginx) могут переписать входящий URL, и удалить из него скрипт front controller, так что ваши пользователи, будут использовать url вида:

http://example.com/hello?name=Fabien.

Вся соль в том, чтобы использовать метод Request::getPathInfo(), который возвращает путь запроса, удалив название скрипта фронт контроллера (включая его поддиректории).

Теперь, когда web сервер всегда запрашивает один и тот же скрипт (front.php) для всех ваших страничек, мы можем немного повысить безопасность приложения, если перенесем все остальные PHP файлы из корневой директории сервера.

Настройте web сервер так, что бы корневой директорией была директория web/, и все остальные файлы отныне клиенту не доступны.

Что бы заставить работать приложение с новой структурой файлов, вам придется в некоторых местах поменять пути, оставлю эти изменения в качестве вашего домашнего задания. (Если возникнут трудности, можете посмотреть в моем репозитории 🙂 прим.пер.)

Последняя штука, которая повторяется на каждой страничке — вызов метода

setContent()

. Мы можем конвертировать все странички в шаблоны, если будем выводить содержимое и вызывать метод

setContent()

прямо из фронт контроллера:

Теперь hello.php стал настоящим шаблоном:

В итоге, сейчас мы имеем фреймворк:

Добавление новой странички происходит в два шага:

  1. добавить записи в массив $map,
  2. создать PHP шаблон в /src/pages/.

В шаблоне, мы можем получать данные запроса с помощью переменной $request, и настраивать заголовки ответа с помощью переменной $response.

Если вы решили остановиться здесь, я бы еще посоветовал улучшить ваш фреймворк, вынеся массив $map в файл конфигурации.

К содержанию >>
Оригинал статьи на английском языке >>
Исходный код из статьи >>

Не забудьте поделиться статьей с друзьями

Подписывайтесь на меня в соц. сетях

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *