Отключить маршруты по умолчанию в Kohana 3? - PullRequest
2 голосов
/ 22 марта 2011

Я верю, что знаю, как это сделать, но хотел проверить это с помощью моих замечательных писателей сообщества. =) * * Тысяча одна

Вот пример:

У меня есть класс Controller, называемый tami, с действием index.

Я знаю, что если я хочу, чтобы кто-то получил доступ к этой комбинации контроллера / действия через URL-адрес, отличный от "/ tami /" или "/ tami / index", то я должен добавить маршрут через что-то вроде этого:

Route::set('pretty_tami', 'these-are-my-initials(/<action>)')
    ->defaults(array(
        'controller' => 'tami',
        'action' => 'index',
    ));

Но пользователи по-прежнему могут получить доступ к этой странице через /tami/.

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

Я предполагаю, что могу просто удалить маршрут по умолчанию, найденный в kohana/application/bootstrap.php. Это верно? Или это сломало бы что-то еще?

Ответы [ 3 ]

3 голосов
/ 22 марта 2011

Я бы сказал, точно так же, как @simshaun - либо удалите маршрут по умолчанию (оставив недоступными другие контроллеры), либо отметьте функцию before() в Controller_Tami, чтобы Uri мог увидеть, что вы ищете.

Если вы используете Kohana 3.1, , теперь вы можете использовать лямбда-логику / анонимные функции для определения ваших маршрутов .

Что-то вроде этого вывело бы дополнительную логику маршрутизации из контроллера (что хорошо, поскольку мы храним ее в одном месте):

Route::set('default', function($uri)
    {
        if ($uri == 'tami' OR $uri == 'tami/index')
        {
            // Route not allowed by the default methods
            throw new Kohana_404_Exception("Route not permitted");
        }
    },
    '(<controller>(/<action>(/<id>)))'
);

Что-то, что я еще не использовал, но выглядит удивительно мощно.

3 голосов
/ 22 марта 2011

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

Я бы создал класс, например Controller_Derouter, который расширяет Controller_Tami.Используйте метод before() в Controller_Derouter, чтобы проверить, был ли доступ к контроллеру по маршруту по умолчанию, и, если это так, сгенерируйте 404. Я думаю, что вы сможете сделать это, сравнив $this->request->controller с первым сегментом URI.

Редактировать: Решение, упомянутое выше, не нужно, если вы планируете отключить маршрут по умолчанию только для контроллера Tami.Если это так, вы можете просто реализовать метод before () непосредственно в контроллере Tami.

1 голос
/ 22 марта 2011

Может, вот так?

Route::set('pretty_tami', 'these-are-my-initials/<action>')
    ->defaults(array(
        'controller' => 'tami',
    ));

Так что по умолчанию не будет action. И вы, вероятно, захотите обновить маршрут default (если он у вас есть) регулярным выражением, исключив tami.

Route::set('default', '(<controller>(/<action>(/<id>)))', array('controller' => '/^(?!tami)/'))
    ->defaults(array(
        'controller' => 'welcome',
        'action'     => 'index',
    ));
...