Статьи

Программирование с Yii2: маршрутизация и создание URL

Маршрутизация Yii2 и создание URL

Если вы спрашиваете: «Что такое 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-адреса 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 .
Программирование Yii Режим обслуживания View

Еще одна приятная особенность маршрутизации 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.

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 в Твиттере или зайдите на страницу моего инструктора . Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.