Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 07.12.2013 21:36:55

Вопрос об использовании RESTful контроллера

Добрый день.

Просьба помочь в поиске решения:

Если прописать роутинг контроллера
Route::controller('backend', 'BackendController');
то урл функций вида getSecurityUser будет /backend/security-users.
Хочется чтобы урл был вида /backend/security/users.

Как этого добиться?

Уверен есть решения как с mod_rewrite, так и без него.

Не в сети

#2 08.12.2013 10:14:00

Re: Вопрос об использовании RESTful контроллера

PHP
Route::any('backend/security/users''BackendController@securityUser');

Не в сети

#3 08.12.2013 10:26:21

Re: Вопрос об использовании RESTful контроллера

Это понятно, но хотелось бы, чтобы не нужно было вверху определения роутинга контроллера писать всякий раз роутинг для таких случаев. А если их будет 200?

Изменено shulfei (08.12.2013 10:26:47)

Не в сети

#4 08.12.2013 10:32:02

Re: Вопрос об использовании RESTful контроллера

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

Лично я не вижу каких-то проблем с 200 контроллерами. Создайте свой класс или просто функцию, которая будет автоматически добавлять маршруты по вашему алгоритму. Можно сканировать методы объекта-контроллера, находя те, где есть две заглавных буквы. Для скорости можно кэшировать результат (массив маршрутов) и при новом запросе быстро добавлять их в систему без прохода по классам.

Не в сети

#5 09.12.2013 16:18:14

Re: Вопрос об использовании RESTful контроллера

Спасибо, сделал как Вы посоветовали.

Не в сети

#6 09.12.2013 20:28:35

Re: Вопрос об использовании RESTful контроллера

Если опубликуете куски кода решения — поможете своим сотруженникам ☺

Не в сети

#7 10.12.2013 10:22:32

Re: Вопрос об использовании RESTful контроллера

функция

static function dynamic_routings() {
    $array = array(array('classname' => 'BackendController', 'url' => 'backend'));
    foreach ($array as $r) {
        if (Cache::has('dynamic_route_'.$r['classname']) && Cache::has('dynamic_route_'.$r['classname'].'_size')
            && Cache::get('dynamic_route_'.$r['classname'].'_size') == filesize(__DIR__.'/controllers/'.$r['classname'].'.php')) { // -- роутеры из кэша --
            foreach (Cache::get('dynamic_route_'.$r['classname']) as $method) Route::any($r['url'].'/'.preg_replace('/_/', '/', $method), array('uses' => $r['classname'].'@____'.$method));
        } else {
            if (Cache::has('dynamic_route_'.$r['classname'])) Cache::forget('dynamic_route_'.$r['classname']);
            if (Cache::has('dynamic_route_'.$r['classname'].'_size')) Cache::forget('dynamic_route_'.$r['classname'].'_size');
            Cache::forever('dynamic_route_'.$r['classname'].'_size', filesize(__DIR__.'/controllers/'.$r['classname'].'.php'));
            $routers = null;
            foreach (get_class_methods($r['classname']) as $method) {
                if (mb_substr($method, 0, 4) == '____' && mb_strstr(mb_substr($method, 4), '_')) {
                    $routers[] = mb_substr($method, 4);
                    Route::any($r['url'].'/'.preg_replace('/_/', '/', mb_substr($method, 4)), array('uses' => $r['classname'].'@'.$method));
                }
            }
            if ($routers) Cache::forever('dynamic_route_'.$r['classname'], $routers); // -- запись роутеров в кэш --
        }
    }
}

вызов перед маршрутом restful контроллера

func::dynamic_routings();

Не в сети

Подвал раздела