Если вы спрашиваете: «Что такое 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 Manager инструктирует Yii, какой контроллер и метод действия создавать и вызывать.
Во всем приложении необходимо создавать URL-адреса, которые могут быть правильно проанализированы по запросу пользователей. Использование createUrl()
для этого гарантирует, что входящие запросы могут быть успешно сопоставлены.
Вот пример:
1
2
3
|
use yii\helpers\Url;
// Url::to() calls UrlManager::createUrl() to create a URL
$url = Url::to([‘message/view’, ‘id’ => 100]);
|
Без инфраструктуры MVC любой PHP-файл в вашем приложении может отвечать непосредственно на запросы, что означает, что вам нужно управлять безопасностью для каждого файла. С помощью MVC и менеджера URL-адресов базовая безопасность обеспечивается на центральном уровне, а доступ к вашему приложению контролируется. Это одна из ключевых причин не беспокоиться о ванильном PHP — фреймворки качаются!
Давайте углубимся в несколько подробностей о сегодняшней теме.
Маршрутизация
Запросы от пользователей поступают через веб-браузер на ваш сервер в виде URL-адресов. Давайте посмотрим на одного из пользователей, запрашивающих страницу входа в мое приложение серии запуска , Meeting Planner:
1
|
https://meetingplanner.io/index.php/site/login
|
Мое приложение использует красивые URL в Yii (описано ниже); заметьте меньше переменных запроса. Без этого URL может выглядеть так:
1
|
https://meetingplanner.io/index.php?r=site/login
|
В любом случае parseRequest
обрабатывает URL-адрес, создает и вызывает SiteController.php с помощью actionLogin actionLogin()
.
С красивыми URL-адресами менеджер URL будет просматривать зарегистрированные правила. В Meeting Planner они находятся в общем файле конфигурации:
01
02
03
04
05
06
07
08
09
10
11
|
‘components’ => [
‘urlManager’ => [
‘class’ => ‘yii\web\UrlManager’,
…
‘rules’ => [
‘<controller:\w+>/<id:\d+>’ => ‘<controller>/view’,
‘<controller:\w+>/<action:\w+>/<id:\d+>’ => ‘<controller>/<action>’,
‘<controller:\w+>/<action:\w+>’ => ‘<controller>/<action>’,
‘defaultRoute’ => ‘/site/index’,
],
],
|
Если ни одно из правил не соответствует или имеется ошибка при достижении контроллера и действия, выдается ошибка 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 для оптимизации производительности . Написание правил может быть более подробным, но я не буду вдаваться сегодня.
Красивые URL
Как я упоминал выше, URL-адреса Pretty URL переключаются с маршрутизации на основе параметров Yii на маршрутизацию на основе пути. Например, этот URL запрашивает просмотр собрания с идентификатором 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.
Чтобы включить красивые URL, вам нужно активировать enablePrettyUrl
в urlManager
:
01
02
03
04
05
06
07
08
09
10
11
12
|
‘urlManager’ => [
‘class’ => ‘yii\web\UrlManager’,
// Disable index.php
‘showScriptName’ => false,
// Disable r= routes
‘enablePrettyUrl’ => true,
‘rules’ => array(
‘<controller:\w+>/<id:\d+>’ => ‘<controller>/view’,
‘<controller:\w+>/<action:\w+>/<id:\d+>’ => ‘<controller>/<action>’,
‘<controller:\w+>/<action:\w+>’ => ‘<controller>/<action>’,
),
],
|
Примечание. В настоящее время вы также можете отключить index.php в URL с помощью showScriptName
; Тем не менее, я все еще борюсь с созданием URL-адресов без index.php в моем текущем проекте приложения. Отслеживание этого в моем списке задач.
Вам также необходимо создать файл .htaccess и включить mod_rewrite
для Apache:
1
2
3
4
5
6
|
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule .
|
CatchAll Mode
Еще одна приятная особенность маршрутизации Yii — возможность легко перевести ваше приложение в режим обслуживания. Просто определите параметр catchAll
в конфигурации приложения, действии и представлении:
1
2
3
4
5
6
7
|
<?php
return [
‘vendorPath’ => dirname(dirname(__DIR__)) .
‘language’ => ‘en’, // english
‘catchAll’ => [‘site/offline’],
‘components’ => [
‘urlManager’ => [
|
Я также добавил actionOffline
в SiteController.php и представление offline.php.
Создание URL
Yii предоставляет вспомогательный метод yii \ helpers \ Url :: to () для создания ссылок в вашем приложении, которые будут должным образом соответствовать правилам синтаксического анализа. Создание программных связей с помощью инфраструктуры Yii поможет поддерживать управляемость и переносимость кода вашего приложения.
Вот несколько примеров создания URL-адресов из документации Yii:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
use yii\helpers\Url;
// creates a URL to a route: /index.php?r=post%2Findex
echo Url::to([‘post/index’]);
// creates a URL to a route with parameters: /index.php?r=post%2Fview&id=100
echo Url::to([‘post/view’, ‘id’ => 100]);
// creates an anchored URL: /index.php?r=post%2Fview&id=100#content
echo Url::to([‘post/view’, ‘id’ => 100, ‘#’ => ‘content’]);
// creates an absolute URL: http://www.example.com/index.php?r=post%2Findex
echo Url::to([‘post/index’], true);
// creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post%2Findex
echo Url::to([‘post/index’], ‘https’);
|
Конечно, если включен красивый формат URL, созданные 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).’
|
Я также включил множество ссылок в исходящие сообщения электронной почты для Meeting Planner, которые требуют ряда идентичных аргументов для проверки доступа пользователя. Я создал помощник для построения этих команд, который использует Url:to()
:
01
02
03
04
05
06
07
08
09
10
11
|
class MiscHelpers {
public static function buildCommand($meeting_id,$cmd=0,$obj_id=0,$actor_id=0,$auth_key=») {
return Url::to([‘meeting/command’,
‘id’=>$meeting_id,
‘cmd’=>$cmd,
‘actor_id’=>$actor_id,
‘k’=>$auth_key,
‘obj_id’=>$obj_id
],true);
}
|
Написание исходного кода PHP для ручного создания таких ссылок было бы трудоемким, подверженным ошибкам и менее переносимым. Url::to()
экономит много времени как при кодировании, так и при устранении неполадок.
Примечание: я буду писать о Yii Helpers в следующем эпизоде. Использование общедоступной функции в моем помощнике экономит мне много усилий и уменьшает общее кодирование.
В заключение
Начало работы с MVC может сбить с толку, и маршруты и URL-адреса могут сыграть в этом свою роль. Возможно, я должен был написать о маршрутах ранее в серии. В любом случае, я надеюсь, что вы узнали кое-что новое о Yii и его гибком дизайне приложений с маршрутами и URL-адресами.
Следите за будущими уроками в нашей серии «Программирование с Yii2», поскольку мы продолжаем изучать различные аспекты фреймворка. Например, дайте мне знать, если вы хотите узнать больше о продвинутой маршрутизации. Я приветствую тематические и тематические запросы. Вы можете опубликовать их в комментариях ниже или написать мне по электронной почте на моем сайте Lookahead Consulting .
Если вы хотите изучить более продвинутое приложение Yii2 сейчас, ознакомьтесь с нашей серией запуска и Meeting Planner . Приложение теперь в альфа-версии, и вы можете использовать его для планирования встреч с друзьями. Вы также можете скачать код; это с открытым исходным кодом.
Если вы хотите узнать, когда появится следующий учебник по Yii2, следуйте за мной @reifman в Твиттере или зайдите на страницу моего инструктора . Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.