A free and open-source book on ZF3 for beginners


5.4. Конфигурация маршрутизации

Как правило, вы не создаете описанные выше классы сами. Вместо этого вы сообщаете ZF3, как это сделать.

Конфигурация маршрутизации для модуля хранится в файле конфигурации module.config.php:

<?php
use Zend\Router\Http\TreeRouteStack;

return [
    //...
    'router' => [
        'router_class' => TreeRouteStack::class,
        'routes' => [	
            // Зарегистрируйте правила маршрутизации ...	
        ],
        'default_params' => [	
            // Укажите параметры по умолчанию для всех маршрутов ...	
        ]
    ],
];

В строке 6 у нас есть ключ router, под которым находится подключ routes (строка 8), содержащий правила маршрутизации.

Вы можете указать, какой класс маршрутов верхнего уровня использовать (TreeRouteStack или SimpleRouteStack) через параметр router_class (строка 7). Если такого параметра нет, используется TreeRouteStack.

Вы также можете использовать опциональный ключ default_params (строка 11) , чтобы определить значения по умолчанию для параметров всех маршрутов сразу. Однако, как правило, этот ключ не используется, и умолчания определяются на основе каждого маршрута.

Мы покажем, как извлекать параметры из маршрута позже в этой главе.

5.4.1. Конфигурация для простых маршрутов

Типичный маршрут имеет имя, тип и опции:

Конфигурация для каждого маршрута под ключом routes может иметь следующий формат:

'<route_name>' => [
    'type' => '<route_type_class>',
    'priority' => <priority>,
    'options' => [
        'route' => '<route>',
        'defaults' => ]
            //...
        ],
    ],  
]

В плейсхолдер <route_name> выше следует вписать имя маршрута. Имя маршрута должно быть в нижнем регистре, например, "home" или "about". Ключ type устанавливает полностью определенное имя класса маршрута.

Опциональный ключ priority позволяет установить приоритет (должен быть значением типа integer) маршрута в списке по степени важности (маршруты с более высоким приоритетом обрабатываются первыми). Если вы не будете его включать, маршруты будут проходиться в порядке LIFO 4.

Маршруты с одинаковым приоритетом также будут проходиться в порядке LIFO. Поэтому для наибольшей эффективности следует регистрировать маршруты, которые чаще будут совпадать, в конец, а наименее распространенные - в начало.

4) LIFO (расшифровывается как Last In, First Out, «последним пришёл — первым ушёл») - способ организации элементов в стек, при котором самый верхний элемент, добавленный последним, выбирается в первую очередь.

Ключ options определяет массив опций маршрута. Мы обсудим опции в последующих разделах этой главы.

5.4.2. Конфигурация для вложенных маршрутов

Для организации маршрутов в поддерево, нужно добавить ключ child_routes к определению маршрута и добавить дочерние маршруты под этот ключ, как показано ниже:

'<route_name>' => [
    'type' => '<route_type_class>',
    'priority' => <priority>,
    'options' => [
        //...
    ],
    'child_routes' => [
        // Добавьте дочерние маршруты.
        // ...
    ]	
],

Для организации маршрутов в цепь (вырожденное поддерево), нужно добавить ключ chain_routes к конфигурации маршрутов:

'<route_name>' => [
    'type' => '<route_type_class>',
    'priority' => <priority>,
    'options' => [
        //...
    ],
    'chain_routes' => [
        // Добавьте цепные маршруты.
        // ...
    ]	
],

Посмотрев на оба примера выше, вы не увидите явного использования типов Part и Chain, потому что они (для вашего удобства) используются ZF3 автоматически при встрече с ключами child_routes и chain_routes в конфигурации маршрутизации.

5.4.3. Конфигурация маршрутизации по умолчанию в Zend Skeleton Application

Теперь, когда вы знаете, как настраивать маршруты и организовывать их в составные структуры, давайте рассмотрим реальный пример. В чистом Zend Skeleton Application, конфигурация маршрутизации выглядит таким образом:

<?php
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'application' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/application[/:action]',
                    'defaults' => [
                        'controller'    => Controller\IndexController::class,
                        'action'        => 'index',
                    ],
                ],
            ],
        ],
    ],
    
    //...
];

В представленной конфигурации у нас есть два правила маршрутизации: сначала маршрут "home" (строка 8), а затем маршрут "application" (строка 18).

Маршрут "home" устанавливает соответствие между пустым путем URL и действием "index" контроллера IndexController. Например, введите "http://localhost/" в браузере и вы увидите домашнюю страницу вашего сайта. Этот маршрут - типа "Literal".

Маршрут "application" (типа "Segment") устанавливает соответствие между URL вида "http://localhost/application", "http://localhost/application/about", "http://localhost/application/news", и т.д. и соответствующим действием контроллера IndexController. Имя действия определяется параметром "action", значение этого параметра по умолчанию - "index". То есть, если вы не уточните действие, запрос будет послан действию "index".

Эта конфигурация соответствует TreeRouteStack (см. рисунок 5.5):

Figure 5.5. Стек маршрутов в скелетном приложении Figure 5.5. Стек маршрутов в скелетном приложении

В следующих разделах мы приведем несколько примеров использования различных типов маршрутов.


Top