() translation by (you can also view the original English article)



Если вы спрашиваете «Что такое Yii?», ознакомьтесь с Введением в Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор Yii 2.0.
Введение в маршрутизацию
В этом курсе Программирование с Yii2 я направляю читателей на использование Yii2 Framework для PHP.
В сегодняшнем уроке я расскажу о маршрутизации и создании URL-адресов в Yii. Когда запрос браузера поступает в файл index.php вашего приложения Yii, он должен быть проанализирован, чтобы определить, какой контроллер и метод нужно вызвать. Это маршрутизация. Обратный процесс привязки к частям вашего приложения - это создание URL-адреса, которое лучше всего делать программно.
Yii обеспечивает большую гибкость в управлении маршрутизацией и генерации ссылок. Следуйте за мной, в то время как я рассматриваю основы.
Прежде чем мы начнем, пожалуйста, помните, я стараюсь участвовать в обсуждениях ниже. Если у вас есть вопрос или предложение по теме, пожалуйста, напишите комментарий ниже или свяжитесь со мной в Twitter @reifman.
Примечание. Если вы заметили пробел между уроками курса Программирование Yii, это связано с тем, что мне пришлось провести операцию на головном мозге в прошлом году. Благодарю вас за терпение и поддержку. Приятно регулярно писать, и я с нетерпением жду продолжения освещения Yii2.
Основа
Менеджер URL Yii - это компонент приложения, который используется для анализа входящих запросов, parseRequest(), а также для создания новых URL-адресов программным способом createUrl().
Запросы разбираются на маршруты, которые принимают такую форму:
1 |
ControllerID/ActionID |
По сути, менеджер URL-адресов говорит Yii, какой контроллер и метод действий создавать и вызывать.
Во многих местах приложения вам нужно будет генерировать URL-адреса, которые будут правильно проанализированы по запросу пользователей. Использование для этого createUrl()
гарантирует, что входящие запросы могут быть успешно отображены.
Вот пример:
1 |
use yii\helpers\Url; |
2 |
// Url::to() calls UrlManager::createUrl() to create a URL
|
3 |
$url = Url::to(['message/view', 'id' => 100]); |
Без MVC фреймворка любой PHP-файл в вашем приложении может напрямую отвечать на запросы, а это значит, что вам нужно управлять безопасностью для каждого файла. С MVC и менеджером URL базовая безопасность предоставляется на центральном уровне, и доступ к вашему приложению контролируется. Это одна из главных причин не беспокоиться о ванильном PHP - фреймворки рулят!
Давайте перейдем к еще нескольким особенностям сегодняшней темы.
Маршрутизация
Запросы от пользователей проходят через браузер через Интернет на ваш сервер в виде URL-адресов. Давайте посмотрим на одного из пользователей, запрашивающих страницу входа в мое приложение серии стартапа, Планировщик встреч:
1 |
https://meetingplanner.io/index.php/site/login |
Мое приложение использует человекопонятные адреса (ЧПУ или pretty URL) в Yii (описано ниже); обратите внимание на меньшее количество переменных в запросе. Без этого URL-адрес будет выглядеть так:
1 |
https://meetingplanner.io/index.php?r=site/login |
В любом случае, parseRequest
обрабатывает URL-адрес и создает и вызывает SiteController.php с помощью actionLogin()
.
При использовании ЧПУ адресов менеджер URL-адресов рассмотрит зарегистрированные правила. В Планировщике встреч они находятся в общем файле конфигурации:
1 |
'components' => [ |
2 |
'urlManager' => [ |
3 |
'class' => 'yii\web\UrlManager', |
4 |
...
|
5 |
'rules' => [ |
6 |
'<controller:\w+>/<id:\d+>' => '<controller>/view', |
7 |
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', |
8 |
'<controller:\w+>/<action:\w+>' => '<controller>/<action>', |
9 |
'defaultRoute' => '/site/index', |
10 |
],
|
11 |
],
|
Если ни одно правило не совпадает, или если ошибка достигает контроллера и действия, будет выдана ошибка 404, исключение yii\web\NotFoundHttpException.
Однако, выше установлено значение defaultRoute
для перехода на главную страницу SiteController actionIndex, которая будет перехватывать не совпадающие URL-запросы.
Давайте рассмотрим одно из приведенных выше правил:
1 |
'<controller:\w+>/<id:\d+>' => '<controller>/view', |
В нем говорится, что если вы получите запрос для контроллера, за которым следует слово (\w+
), за которым следует слеш и число (\d+
), отправьте этот запрос в файл контроллера с соответствующим именем и вызовите actionView($id)
с числом в качестве аргумента, т.е. meeting/view/130
вызывает MeetingController.php actionView(130)
.
Определение ваших правил важно и может увеличить или уменьшить общую производительность вашего сайта или время отклика. Вы можете больше узнать о расширенной параметризации маршрутов Yii для оптимизации производительности. Написание правил может быть более подробным, но сегодня я не буду говорить об этом.
ЧПУ адреса
Как я уже упоминал выше, ЧПУ адрес представляет собой дополнительный путь с описанием маршрута, вместо использования Yii маршрутизации на основе параметров. Например, этот URL-адрес запрашивает вывод встречи с ID 130.
1 |
https://meetingplanner.io/meeting/130 |
Или этот URL-адрес требует вывод места под названием El Diablo Coffee:
1 |
https://meetingplanner.io/place/el-diablo-coffee-co |
Вы можете прочитать Как программировать с Yii2: Sluggable Behavior (Envato Tuts+), чтобы узнать больше о внедрении слагов для управления этими именованными URL-адресами.
Чтобы включить ЧПУ (Pretty URLs), вам нужно активировать enablePrettyUrl
в urlManager
:
1 |
'urlManager' => [ |
2 |
'class' => 'yii\web\UrlManager', |
3 |
// Disable index.php
|
4 |
'showScriptName' => false, |
5 |
// Disable r= routes
|
6 |
'enablePrettyUrl' => true, |
7 |
'rules' => array( |
8 |
'<controller:\w+>/<id:\d+>' => '<controller>/view', |
9 |
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', |
10 |
'<controller:\w+>/<action:\w+>' => '<controller>/<action>', |
11 |
),
|
12 |
],
|
Примечание: Вы также можете отключить index.php в URL с помощью showScriptName
; однако я все еще боюсь создавать URL-адреса без index.php в моем текущем проекте приложения. Отслеживание этого - в моем списке задач.
Вам также необходимо создать файл .htaccess и включить mod_rewrite
для Apache:
1 |
RewriteEngine on |
2 |
# If a directory or a file exists, use it directly
|
3 |
RewriteCond %{REQUEST_FILENAME} !-f |
4 |
RewriteCond %{REQUEST_FILENAME} !-d |
5 |
# Otherwise forward it to index.php
|
6 |
RewriteRule . index.php
|
Маршрут CatchAll



Еще одна приятная функция маршрутизации Yii - это возможность легко перевести ваше приложение в режим обслуживания. Просто определите свойство catchAll
в конфигурации приложения, действие и представление:
1 |
<?php
|
2 |
return [ |
3 |
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', |
4 |
'language' => 'en', // english |
5 |
'catchAll' => ['site/offline'], |
6 |
'components' => [ |
7 |
'urlManager' => [ |
8 |
Я также добавил actionOffline
в SiteController.php и представление offline.php.
Создание URL-адресов
Yii предоставляет вспомогательный метод yii\helpers\Url::to() для создания ссылок в вашем приложении, которые будут точно соответствовать правилам. Создание ссылок программно с инфраструктурой Yii поможет поддерживать управляемость и переносимость вашего кода приложения.
Вот несколько примеров создания URL-адресов из документации Yii:
1 |
use yii\helpers\Url; |
2 |
|
3 |
// creates a URL to a route: /index.php?r=post%2Findex
|
4 |
echo Url::to(['post/index']); |
5 |
|
6 |
// creates a URL to a route with parameters: /index.php?r=post%2Fview&id=100
|
7 |
echo Url::to(['post/view', 'id' => 100]); |
8 |
|
9 |
// creates an anchored URL: /index.php?r=post%2Fview&id=100#content
|
10 |
echo Url::to(['post/view', 'id' => 100, '#' => 'content']); |
11 |
|
12 |
// creates an absolute URL: http://www.example.com/index.php?r=post%2Findex
|
13 |
echo Url::to(['post/index'], true); |
14 |
|
15 |
// creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post%2Findex
|
16 |
echo Url::to(['post/index'], 'https'); |
Конечно, если включены ЧПУ адреса, созданные URL-адреса будут другими.
Вот пример того, как я создаю ссылку в списке встреч для Планировщика встреч:
1 |
return '<div><a href="'.Url::to(['meeting/view', 'id' => $model->id]).'">'.$model->subject.'</a><br /><span class="index-participant">'.$model->getMeetingParticipants($model->id).'</span></div>'; |
Я также включаю много ссылок в исходящие письма для Планировщика встреч, для которых требуется несколько идентичных аргументов для проверки доступа пользователей. Я создал помощника для создания этих команд, который использует Url::to()
:
1 |
class MiscHelpers { |
2 |
|
3 |
public static function buildCommand($meeting_id,$cmd=0,$obj_id=0,$actor_id=0,$auth_key='') { |
4 |
return Url::to(['meeting/command', |
5 |
'id'=>$meeting_id, |
6 |
'cmd'=>$cmd, |
7 |
'actor_id'=>$actor_id, |
8 |
'k'=>$auth_key, |
9 |
'obj_id'=>$obj_id |
10 |
],true); |
11 |
}
|
Написание исходного PHP-кода для ручного создания таких ссылок будет трудоемким, подверженным ошибкам и менее переносимым. Url::to()
экономит много времени как при кодировании, так и при поиске неисправностей.
Примечание: Я расскажу о помощниках Yii в следующем эпизоде. Использование общедоступной функции внутри моего помощника экономит мне много усилий и сокращает кодирование в целом.
В заключение
Начало работы с MVC может сбивать с толку, и маршруты и URL-адреса могут играть определенную роль в этом. Возможно, я должен был написать о маршрутах ранее в этом курсе. В любом случае, надеюсь, вы узнали кое-что о Yii и его гибком дизайне приложений с маршрутами и URL-адресами.
Следите за предстоящими уроками в нашем курсе Программирование с Yii2, поскольку мы продолжаем изучать разные части фреймворка. Например, дайте мне знать, если вы хотите больше узнать о расширенной маршрутизации. Я приветствую пожелания по функциям и темам. Вы можете опубликовать их в комментариях ниже или отправить мне по электронной почте на моем веб-сайте Lookahead Consulting.
Если вы хотите изучить более продвинутое приложение Yii2, ознакомьтесь с нашим курсом запуска стартапа и Планировщиком встреч. Приложение теперь находится в альфа-версии, и вы можете использовать его для планирования встреч с друзьями. Вы также можете загрузить код; это приложение с открытым исходным кодом.
Если вы хотите узнать, когда выйдет следующий урок Yii2, следуйте за мной @reifman в Twitter или проверьте мою страницу инструктора. Моя страница инструктора включает все опубликованные статьи из этого курса.