Laravel по-русски

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

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

#1 04.03.2015 20:39:21

Роман

Логика в роуте или перенаправление в контроллере

Переношу сайт на Laravel 4.2, имею похожие URLы:
url_1: site/category/category.html  //это подкатегория
uri_2: site/category/product.html    //это продукт в категории (без подкатегории)
адреса похожи, в них по 2 секции,
(кстати category и product - это не буквальные названия, естественно они разные, т.е. пример:
site.ru/computer/lenovo.html - категория/подкатегория
или
site.ru/hdd/harddisc_n_350_us.html - категория/товар
это значит, что нельзя сделать роут типа Route::get('category/{cat}.html'....
)
пробуем:
ВАРИАНТ 1
1) определить относится ли адрес к подкатегории
2) если да, то отправить в Контроллер Category
3) если нет, то отправить в Kонтроллер Product

//routes.php
Route::get('{cats}/{cat}.html', function ($cats, $cat) {
                                                //проверяем категория ли это
                                                $result = Category::where('slug', '=', $cats.'/'.$cat)->first();
                                                //если категория, то отправляем в Контроллер Категории
                                                if($result){
                                                       return //отправить в Контроллер Category, включая переменные $cats, $cat
                                                }
                                                return //отправить в Kонтроллер Product, включая переменные $cats, $cat
                                           }         
               );

ВАРИАНТ 2
1) отправить в Контроллер Category
2) в Контроллере определить - категория ли это
3) если да, то обрабатываем
4) если нет, то перенаправляем в Kонтроллер Product, включая переменные $cats, $cat

//routes.php
Route::get('{cats}/{cat}.html',  array(
                'as' => 'category', 
                'uses' => 'CategoryController@Category'
    ));
//controllers/CategoryController.php
public function Category($cats = NULL, $cat = NULL){

        $content = Category::where('slug', '=', $cats.'/'.$cat)->first();

        if($content){
             //обрабатываем
        }else{
            //перенаправляем в controllers/ProductController.php, включая переменные $cats, $cat
        }

Вопросы:
1) если вариант 1, то как сделать перенаправление к нужному Контроллеру из Роута
2) если вариант 2, то как сделать перенаправление к нужному Контроллеру из Контроллера

на данный момент всё обрабатывается в одном общем контроллере и вызывается нужный Вид. Но хотелось бы разделить логику
и желательно делить её в Роуте, а не в Контроллере.

#2 05.03.2015 10:36:14

Re: Логика в роуте или перенаправление в контроллере

вариант 2 конечно же, держать логику в маршрутах — плохая идея.

собственно в чём проблема, контроллер — это просто класс, экшен — это просто метод. надо инстанцировать один и вызвать другой. скорее всего у ларовского роутера даже готовый метод есть чтобы это сделать. если нет, то там по-моему элементарно это делается через IoC (чем-то типа PHP$this->app->make'MyController' )), а если DI не используеся, то вообще обычным PHPnew.

альтернатива — использовать для «расшифровки» запросов и выдачи результатов команды. они из коробки есть в л5, но никто не мешает сделать свой собственный command bus и в л4. тогда контроллер будет очень простым, а вся логика будет вынесена в набор классов — их и юнит-тестами можно будет легко покрыть тогда.

подробнее можно подсмотреть в Commands and Domain Events на ларакастах, там денег хотят, но вообще курс не проблема найти в торрентах. хорошо раскрывает чакры и готовит к применению команд при работе с л5. =)

Изменено constb (05.03.2015 10:37:54)

Не в сети

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