1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ixianming-laravel-route-service-provider

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-zh.md 27 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 04:21 20bbefc

Laravel RouteServiceProvider

Документ подробно описывает функции расширения пакета, содержание большое, но не сложное.

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

[TOC]

О расширении пакета

Расширение пакета ServiceProvider наследует Laravel App\Providers\RouteServiceProvider. Поэтому после установки расширения пакета всё ещё можно определить явную привязку модели маршрута, фильтры и пользовательскую логику анализа в методе boot() App\Providers\RouteServiceProvider.

Следует отметить, что изменения методов map(), mapApiRoutes(), mapWebRoutes() неэффективны, поскольку расширение пакета перезаписывает метод map() и метод map() больше не ссылается на методы mapApiRoutes() и mapWebRoutes().

Функции расширения пакета

  • Можно настроить группу промежуточного программного обеспечения, которая позволяет сопоставлять файлы маршрутов.

    Расширение пакета будет использовать правила по умолчанию или пользовательские правила для назначения соответствующих файлов маршрутов этим группам промежуточного ПО и выполнения загрузки.

  • Для одной группы промежуточного ПО можно создать несколько файлов маршрутов, и эти файлы маршрутов можно разместить в любом месте каталога routes.

    Имя файла маршрута может использовать правила по умолчанию, или разработчик может настроить правила соответствия между файлом маршрута и группой промежуточного ПО.

  • Можно установить формат ответа на ошибку как глобальный формат вывода по умолчанию Json или установить его отдельно для каждой группы промежуточного ПО, которая разрешает сопоставление файлов маршрутов (настройки для отдельных групп имеют более высокий приоритет, чем глобальные настройки по умолчанию).

  • Проверяет, есть ли повторяющиеся URL (включая полные URL с ограничениями домена) во всех файлах маршрутов.

  • Может быть настроено, разрешать ли регистрацию маршрутов с замыканиями.

  • Может быть настроен, разрешать ли именам маршрутов иметь одинаковые имена.

  • Может быть настроен, разрешать ли повторное использование контроллеров.

  • Может быть настроен префикс пространства имён namespace для каждой группы промежуточного ПО, разрешающей сопоставление файлов маршрутов.

  • Может быть настроен префикс поддомена domain для каждой группы промежуточного ПО, разрешающего сопоставление файлов маршрутов.

  • Может быть настроен префикс маршрута prefix для каждой группы промежуточного ПО, разрешающей сопоставление файлов маршрутов.

  • Может быть настроен префикс имени маршрута name для каждой группы промежуточного ПО, разрешающей сопоставление файлов маршрутов.

  • Может быть настроен шаблон регулярного выражения ограничения параметров where для каждой группы промежуточного ПО, разрешающей сопоставление файлов маршрутов.

Установка

Условия установки

  • PHP >= 7.0

  • Laravel >= 5.3

    Laravel 6, Laravel 7, Laravel 8, Laravel 9 также могут быть установлены и использованы!

Установка

composer require ixianming/laravel-route-service-provider

Использование автоматического обнаружения пакетов

  • В Laravel 5.5+ используется автоматическое обнаружение пакетов, поэтому нет необходимости вручную добавлять ServiceProvider.

  • Нет необходимости комментировать маршрутизатор Laravel (за исключением случаев, когда пакет выдаёт подсказку).

Не использовать автоматическое обнаружение пакетов

Если версия Laravel меньше 5.5 или не используется автоматическое обнаружение:

  • Закомментируйте поставщика услуг Laravel в config/app.php providers массив App\Providers\RouteServiceProvider::class.

  • Добавьте поставщика услуг расширения пакета Ixianming\Routing\RouteServiceProvider::class в массив providers в config/app.php, под исходным поставщиком услуг App\Providers\RouteServiceProvider::class.

'providers' => [
    /*
     * Laravel Framework Service Providers...
     */

    /*
     * Package Service Providers...
     */

    /*
     * Application Service Providers...
     */

    // App\Providers\RouteServiceProvider::class,
    Ixianming\Routing\RouteServiceProvider::class,

 ]

Вручную добавить функцию обработки информации об ошибках

В классе App\Exceptions\Handler добавьте код перед возвратом метода render:

if (method_exists(\Ixianming\Routing\ExceptionResponse::class, 'wantsJson')) {
    list($request, $exception) = \Ixianming\Routing\ExceptionResponse::wantsJson($request, $exception);
}

После модификации метод render должен выглядеть следующим образом:

public function render($request, Exception $exception)
{
    // Your code ...

    // Ваш код должен предшествовать этой функции.
    if (method_exists(\Ixianming\Routing\ExceptionResponse::class, 'wantsJson')) {
        list($request, $exception) = \Ixianming\Routing\ExceptionResponse::wantsJson($request, $exception);
    }
    // Между функцией и оператором return не должно быть кода.
    return parent::render($request, $exception);
}

Удалите пакет после использования

  • После удаления расширения пакета не забудьте удалить добавленный код обработки формата вывода информации об ошибке из метода render класса App\Exceptions\Handler.

  • После удаления расширения пакета не забудьте удалить код, который использует свойства и методы этого расширения в пакете App\Providers\RouteServiceProvider.

  • Если версия Laravel меньше 5.5 или автоматическое обнаружение не используется, после удаления расширения пакета не забудьте раскомментировать App\Providers\RouteServiceProvider::class и закомментировать Ixianming\Routing\RouteServiceProvider::class в массиве providers файла config/app.php.

Использование

Настройка групп промежуточного ПО, которые позволяют сопоставлять файлы маршрутов

Группы промежуточного ПО web и api по умолчанию могут сопоставлять файлы маршрутов.

Чтобы добавить новые группы промежуточного ПО, которым разрешено сопоставлять файлы маршрутов, добавьте атрибут $allowMatchRouteMiddlewareGroups в файл app/Providers/RouteServiceProvider.php:

protected $allowMatchRouteMiddlewareGroups = ['middlewareGroup_1', 'middlewareGroup_2'];
  • Значение атрибута $allowMatchRouteMiddlewareGroups представляет собой одномерный массив, значения которого представляют собой имена групп промежуточного ПО, которым разрешено сопоставление файлов маршрутов.

  • Определённое значение атрибута $allowMatchRouteMiddlewareGroups объединяется со значением по умолчанию, поэтому необходимо только определить новые группы промежуточного ПО, которым разрешено сопоставление файлов маршрутов.

  • При возникновении ошибки типа значения атрибута $allowMatchRouteMiddlewareGroups будет использоваться значение по умолчанию.

Установите, является ли формат ответа по умолчанию для информации об исключениях Json

Перед использованием этой функции необходимо вручную добавить функцию обработки формата вывода информации об ошибках в метод render класса App\Exceptions\Handler, иначе эта функция не будет работать.

Установите формат ответа по умолчанию для информации об исключении как Json, добавив атрибут $defaultExceptionJsonResponse в файл app/Providers/RouteServiceProvider.php и установив его значение в true:

protected $defaultExceptionJsonResponse = true;
  • Атрибут $defaultExceptionJsonResponse должен иметь значение логического типа (true или false).

  • По умолчанию атрибут $defaultExceptionJsonResponse имеет значение false. Свойства значения по умолчанию

Если значение свойства $defaultExceptionJsonResponse установлено в true, то при доступе к неизвестному маршруту или к маршруту с неустановленным форматом информации об исключениях, ответ на исключение будет иметь формат JSON.

Если свойство $defaultExceptionJsonResponse не существует, или его значение равно null или false, то формат ответа на исключение определяется заголовком запроса Accept.

При доступе к маршруту с настроенным форматом информации об исключении, формат ответа на исключение устанавливается в соответствии с настройками этого маршрута.

Настройка разрешения регистрации закрытых маршрутов

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

Причины запрета регистрации и использования закрытых маршрутов:

  • При оптимизации приложения для Laravel обычно проводится оптимизация маршрутизации. В версиях Laravel ниже 8.0 маршрутизация на основе закрытых маршрутов не работает. Если закрытые маршруты используются в версии Laravel ниже 8.0, при генерации кэша будут возникать ошибки. Чтобы избежать проблем с использованием кэширования маршрутов, лучше всегда запрещать использование закрытых маршрутов.
  • В командной разработке эта настройка помогает обеспечить соблюдение правил при регистрации маршрутов и снижает риск ошибок.

Чтобы запретить регистрацию закрытых маршрутов, добавьте свойство $closureRoute со значением false в файл app/Providers/RouteServiceProvider.php:

protected $closureRoute = false;

Значение свойства $closureRoute должно быть булевым (true или false). По умолчанию это свойство имеет значение true. Если значение свойства $closureRoute задано неправильно, будет использоваться значение по умолчанию. Значение true разрешает регистрацию закрытых маршрутов, а значение false запрещает их регистрацию.

Настройка уникальности имён именованных маршрутов

По умолчанию расширение запрещает дублирование имён именованных маршрутов.

Почему важно, чтобы имена именованных маршрутов были уникальными:

  • В некоторых случаях, когда именованные маршруты используются для управления доступом или создания URL-адресов, дублирование имён может привести к путанице.
  • Некоторые требования могут требовать уникальности имён маршрутов. Без проверки на дублирование разработчики могут не заметить проблему.
  • Если имена маршрутов могут повторяться, URL-адреса, созданные с помощью метода route(), могут быть не такими, как ожидалось.

Для разрешения дублирования имён именованных маршрутов добавьте свойство $uniqueRouteName со значением false в файле app/Providers/RouteServiceProvider.php:

protected $uniqueRouteName = false;

Значение свойства $uniqueRouteName должно быть булевым (true или false). По умолчанию оно имеет значение true. Если значение свойства $uniqueRouteName задано неправильно, используется значение по умолчанию. Значение true требует уникальности имён, а значение false разрешает дублирование.

После запрета дублирования имён именованных маршрутов, если в маршрутах есть повторяющиеся имена, будет выдана ошибка. Расширение также укажет расположение повторяющихся маршрутов, их файлы и группы, что поможет быстро найти проблему.

Настройка повторного использования контроллеров

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

Зачем запрещать повторное использование контроллеров:

  • Обычно каждый метод контроллера соответствует определённой бизнес-логике. Повторное использование контроллера означает, что одна и та же функция может быть доступна через разные URL, что усложняет управление и поддержку URL. Кроме того, в системах, где доступ управляется на основе URL, повторное использование может привести к ошибкам.
  • Повторное использование контроллеров может привести к созданию неправильных URL с помощью метода action().

Чтобы запретить повторное использование контроллеров, добавьте свойство $allowReuseAction со значением false в файле app/Providers/RouteServiceProvider.php:

protected $allowReuseAction = false;

Значение свойства $allowReuseAction должно быть булевым (true или false). По умолчанию оно имеет значение true. Если значение свойства $allowReuseAction задано неправильно, используется значение по умолчанию. Значение true позволяет повторное использование контроллеров, а значение false запрещает его.

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

Проверка повторяющихся URL

Эта функция является обязательной и не имеет переключателей.

В Laravel, если определены одинаковые URL, более поздний маршрут будет перекрывать предыдущий. Повторяющиеся URL нежелательны, так как они могут привести к хаосу, сложности в обслуживании и управлении.

После установки расширения оно проверит все маршруты на наличие дублирующихся URL и выдаст ошибку. Расширение также укажет местоположение дублирующихся URL, их файлы и группы для быстрого поиска проблемы.

URL включает полное доменное имя с ограничениями.

Правила по умолчанию

Правила по умолчанию определяют, как расширение обрабатывает маршрутизацию.

  • Правила соответствия файлов маршрутов:
    • Файлы маршрутов должны иметь имена в формате {имя группы}.php, {имя группы}_ или _{имя группы}.php.
    • Эти файлы будут назначены соответствующим группам.
    • Путь и имена файлов не чувствительны к регистру.
    • Один и тот же файл маршрута не может быть загружен более чем тремя группами.

Например, файлы маршрутов в каталоге routes могут выглядеть следующим образом:

routes
   |-- web.php
   |-- api.php
   |-- web_errorTest_api.php
   |-- channels.php
   |-- console.php
   |-- welcome_web.PHP
   |-- welcome_api.PHP
   |-- web_User.php
   |-- api_User.php
   |-- Role
        |-- role_WEB.php
        |-- role_API.php

Файлы web.php, welcome_web.php, web_User.php и Role/role_WEB.php будут назначены группе web. Файлы api.php, welcome_api.php, api_User.php и Role/role_API.php будут назначены группе api. Загрузка файла web_errorTest_api.php приведёт к ошибке, поскольку он назначен двум группам одновременно.

  • Корневое пространство имён по умолчанию для групп:

    • Корневое пространство имён для всех групп по умолчанию — App\Providers\RouteServiceProvider, где свойство $namespace имеет значение.
  • Доменное имя по умолчанию для групп:

    • Доменное имя для всех групп по умолчанию не ограничено.
  • Префикс маршрута по умолчанию для групп:

    • Префикс маршрута для группы web по умолчанию пуст.
    • Для других групп префикс маршрута по умолчанию совпадает с именем группы. Для данного запроса был выполнен перевод на русский язык.

Использование промежуточных групп и настройка их параметров

Промежуточные группы используются для настройки маршрутов в приложении. Промежуточная группа — это набор маршрутов, которые обрабатываются определённым образом. По умолчанию все маршруты обрабатываются одной промежуточной группой, но можно создать несколько промежуточных групп с разными настройками.

По умолчанию для всех промежуточных групп:

  • префикс имени маршрута (name) не задан;
  • регулярное выражение для параметров маршрута (where) не задано.

Для всех промежуточных групп по умолчанию используется формат ответа JSON при возникновении исключения. Однако перед использованием этой функции необходимо вручную добавить функцию обработки исключений в метод render класса App\Exceptions\Handler. В противном случае эта функция будет недоступна.

Если исключение возникает в промежуточной группе, то формат ответа определяется правилами этой группы. Если же правила не заданы, то используется глобальное правило.

Пользовательские правила могут переопределять стандартные, но если пользовательское правило задано неверно, то будет выброшено исключение, и формат ответа будет определяться стандартными правилами.

Чтобы задать пользовательские правила, нужно добавить метод customMiddlewareGroupsConfig в класс RouteServiceProvider. Этот метод должен возвращать массив, где каждый элемент массива представляет собой промежуточную группу. Элемент массива может иметь следующие ключи:

  • namespace — пространство имён;
  • domain — ограничение домена;
  • prefix — префикс маршрута;
  • name — префикс имени маршрута;
  • where — регулярное выражение для параметров маршрута;
  • eJsonResponse — формат ответа при исключении;
  • matchRule — правило соответствия маршрута.

Ключ matchRule имеет особое значение. Он определяет правило, по которому маршрут будет соответствовать данной промежуточной группе. Значение этого ключа должно быть анонимной функцией, которая принимает один аргумент — путь к файлу маршрута относительно каталога routes. Функция должна возвращать true, если маршрут соответствует группе, и false в противном случае.

Обратите внимание, что путь к файлу чувствителен к регистру.

Также стоит отметить, что если промежуточная группа имеет заданное пространство имён, то при использовании методов action() или redirectToAction() для передачи параметров контроллеру, который принадлежит этой группе, необходимо передавать полное имя пространства имён контроллера, начинающееся с символа . Это относится как к случаям, когда пространство имён задано явно, так и к случаям, когда оно не задано, но используется по умолчанию.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/ixianming-laravel-route-service-provider.git
git@api.gitlife.ru:oschina-mirror/ixianming-laravel-route-service-provider.git
oschina-mirror
ixianming-laravel-route-service-provider
ixianming-laravel-route-service-provider
master