Advertisement
  1. Code
  2. PHP
  3. Yii

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

Scroll to top
Read Time: 7 min
This post is part of a series called How to Program With Yii2.
Programming With Yii2: Using Amazon S3
Programming With Yii2: Helpers

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

Yii2 Routing and URL CreationYii2 Routing and URL CreationYii2 Routing and URL Creation

Если вы спрашиваете «Что такое 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

Programming Yii Maintenance Mode ViewProgramming Yii Maintenance Mode ViewProgramming Yii Maintenance Mode View

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

Ссылки по теме

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.