Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Переношу сайт на 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 конечно же, держать логику в маршрутах — плохая идея.
собственно в чём проблема, контроллер — это просто класс, экшен — это просто метод. надо инстанцировать один и вызвать другой. скорее всего у ларовского роутера даже готовый метод есть чтобы это сделать. если нет, то там по-моему элементарно это делается через IoC (чем-то типа PHP$this->app->make( 'MyController' )
), а если DI не используеся, то вообще обычным PHPnew
.
альтернатива — использовать для «расшифровки» запросов и выдачи результатов команды. они из коробки есть в л5, но никто не мешает сделать свой собственный command bus и в л4. тогда контроллер будет очень простым, а вся логика будет вынесена в набор классов — их и юнит-тестами можно будет легко покрыть тогда.
подробнее можно подсмотреть в Commands and Domain Events на ларакастах, там денег хотят, но вообще курс не проблема найти в торрентах. хорошо раскрывает чакры и готовит к применению команд при работе с л5.
Изменено constb (05.03.2015 10:37:54)
Не в сети
Страницы 1