Отключение системы маршрутизации по умолчанию с помощью Ubiquity-framework - PullRequest
0 голосов
/ 08 июля 2019

Я настраиваю небольшое приложение с Ubiquity Framework в PHP и пытаюсь отключить систему маршрутизации по умолчанию (controller/action/parameters).

Система маршрутизации основана на аннотациях (задокументировано здесь ).

У меня есть контроллер с несколькими маршрутами, который работает (не забудьте сбросить кэш маршрутизатора).

namespace controllers;

class FooController extends ControllerBase 
{
    /**
     * @get("foo")
     */
    public function index()
    {
        echo "I'm on /foo";
    }

    /**
     * @get("bar/{p}")
     */
    public function bar($p='default p')
    {
        echo "I'm on bar/".$p;
    }

}

адреса / foo , / bar и / bar / xxx доступны, но я хотел бы отключить систему маршрутизации по умолчанию, которая разрешает доступ к действие существующего контроллера (без маршрута).

Я хочу отключить следующие URL:

  • / FooController
  • / FooController / индекс
  • / FooController / бар
  • / FooController / бар / ххх

Я не нашел своего ответа в документе.

Я знаю, что фреймворк неизвестен (я обнаружил его через phpbenchmarks веб-сайт), но система маршрутизации довольно классическая, и она все еще php.

Если у вас есть идеи ....

Версия:

  • php 7.3
  • Ubiquity 2.2.0

1 Ответ

0 голосов
/ 09 июля 2019

Я нашел решение косвенно в документе.

Атрибут priority маршрута позволяет вам назначить порядок, в котором он будет определяться (и, следовательно, запрашиваться).

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

namespace controllers;

use Ubiquity\utils\http\UResponse;

class FooController extends ControllerBase 
{
    ...

    /**
     * @route("{url}","priority"=>-1000)
     */
    public function route404($url)
    {
        UResponse::setResponseCode(404);
        echo "Page {$url} not found!";
    }
}

Если мы все еще хотим активировать некоторые контроллеры (часть Adminнапример), мы должны добавить атрибут requirements, который позволяет указать регулярное выражение.

namespace controllers;

use Ubiquity\utils\http\UResponse;

class FooController extends ControllerBase 
{
    ...

    /**
     * @route("{url}","priority"=>-1000,"requirements"=>["url"=>"(?!(a|A)dmin).*?"])
     */
    public function route404($url)
    {
        UResponse::setResponseCode(404);
        echo "Page {$url} not found!";
    }
}

В этом случае доступны только те маршруты, которые определены с аннотациями + те, которые соответствуют действиямAdmin контроллер

С проблемами маршрутизации, решение по маршрутизации.

...