Форум → Программирование → PHP для идиотов → как разбираются вот такие запросы
как разбираются вот такие запросы
-
как разбираются вот такие запросы
http://www.drive2.ru/cars/bmw/m3_coupe/m3_coupe_e92/antonflai/journal/288230376152133235/
или такой
http://smotra.ru/autos/bmw/gran_turismo/28211/blog/117605/
допустим в первом варианте
controller - cars/
action - index(view) - первый параметр - марка машины (bmw)
параметр 2 - модель(m3_coupe)
параметр 3 - поколение(m3_coupe_e92)
параметр 4 - пользователь чья машина (antonflai)
парамтер 5 - новый экшн(journal) бортовик
параметр 6 - ид записи из бортавика
во втором варианте чуть меньше параметров, отсутствует поколение, только марка и модель
но как управлять стольким параметрами в контроллере? -
30 июня 2011 г. 18:19, спустя 15 минут 52 секунды
в смысле ты не знаешь, как регуляркой разбить строку на части? -
30 июня 2011 г. 18:33, спустя 14 минут 18 секунд
да неее, допустим нужно котроллере cars вывести контент по всем этим параметрам, ну вначале всё легко..
/cars/bmw/ - выводим список любых моделей бмв
/cars/bmw/m3_coupe/ выводим список моделей м3
а дальше всё сложнее и сложнее
получится очень тяжелый контроллер, может кто нибудь знает как это можно сделать проще и удобнее??? -
30 июня 2011 г. 18:45, спустя 12 минут 9 секунд
такой код будет пусть для первых параметров
public function IndexAction()
{
$action = $this->router->GetAction(); // в нашем случае пришло bmw
$param1 = $this->router->GetParams(); // m3 купе
$args =(array) $this->router->GetArgs();
if($action){
if($param1)
{
//выводим машины всех пользователей относящиеся к модели m3 и марке bmw
//….. и тут еще куча критериев, получается черти что
} else {
//выводим машины всех пользователей относящиеся к марке bmw
}
} else {
//выводим список марок авто
}
} -
30 июня 2011 г. 20:39, спустя 1 час 53 минуты 38 секунд
по идее екшн твоего контроллера должен выглядеть так :public function carsAction()
{
$params = $this->getRequest->getParams();
$cars = NRG::getCollection('cars')->setParams($params);
/**
* Here goes render
*/
}
т.е. суть контроллера в том, чтобы передать данные в модель, а модель в свою очередь обеспечит вьюху необходимыми данными. -
30 июня 2011 г. 20:44, спустя 5 минут 35 секунд
а по поводу как разбирается, то мне кажется, ссылки которые ты привел являются алиасами. т.е.
http://www.drive2.ru/cars/bmw/m3_coupe/m3_coupe_e92/
==
http://www.drive2.ru/cars/brand/bmw/model/m3_coupe/body/m3_coupe_e92/
и контроллер работет в обычном режиме.
т.е. в екшн cars приходят параметры
brand=bmw
model=m3_coupe
body=m3_coupe_e92
это лично мое мнение, на самом деле реализация может быть другая -
30 июня 2011 г. 22:03, спустя 1 час 19 минут 8 секунд
видишь у тебя всё кей - валу
а мне нужно без ключа, просто по порядку чтобы шли параметры, как их вытищить я знаю
основное это, контоллер, действие, параметр а остальное идут аргементы getArgs(номер аргумента -параметра);
я просто привел пример пока которым я могу всё реализовать, но я хочу как то облегчить работу со столькими параметрами, чтобы контроллер не весил многоСпустя 240 сек.
по идее екшн твоего контроллера должен выглядеть так :public function carsAction()
{
$params = $this->getRequest->getParams();
$cars = NRG::getCollection('cars')->setParams($params);
/**
* Here goes render
*/
}
т.е. суть контроллера в том, чтобы передать данные в модель, а модель в свою очередь обеспечит вьюху необходимыми данными.
cars это не экшн, это контроллер -
1 июля 2011 г. 1:07, спустя 3 часа 3 минуты 14 секунд
роутинг
':controller/:wendor/:model/:submodel/:author/:mediatype/:record_id/' => array('action' => 'foo')
тогда роут /cars/bmw/m3_coupe/m3_coupe_e92/antonflai/journal/288230376152133235/ отработает так
class CarsController extends Controller {
function foo() {
// тут имеем массив, допустим $this->params, и он будет таким
// array('wendor'=>'bmw', 'model'=>'m3_coupe', 'submodel'=>'m3_coupe_e92', 'author'=>'antonflai', 'mediatype' => 'journal', 'record_id' => 288230376152133235)
…
}
}
т.е. всё зависит от того как роутинг работаетне всё полезно, что в swap полезло -
1 июля 2011 г. 9:57, спустя 8 часов 50 минут 46 секунд
+1 к мастеру, в Yii это будет так'cars/<wendor>/<model>/<submodel>/<author>/<mediatype>/<record_id>' => 'cars/view',
<?php
class CarsController extends CController {
public function actionView() {
print_r($_GET); // array('wendor'=>'bmw', 'model'=>'m3_coupe', 'submodel'=>'m3_coupe_e92', 'author'=>'antonflai', 'mediatype' => 'journal', 'record_id' => 288230376152133235)
}
} -
1 июля 2011 г. 10:56, спустя 58 минут 16 секунд
а как такой роутрер можно реализовать в собственном фреймворке? -
1 июля 2011 г. 12:32, спустя 1 час 36 минут 19 секунд
Pyha\RoutingСпустя 87 сек.http://pyha.ru/forum/topic/5466.0Спустя 59 сек.или как вариант Symfony\Routing https://github.com/symfony/Routing , но он не поддерживает несколько доменов/субдоменов -
1 июля 2011 г. 14:30, спустя 1 час 57 минут 54 секунды
я когда то юзал такое, что контроллер получал параметры урла, базовы определял экшен, исключае его из параметро а детишки сами рулили, базовый роутинг определял только контроллер и делегировал ему полномочия по оставшемуся роутингу. Тогда можно было юзать и command и controller action. Т.к. выбор пути внутреннего направления решал контроллер, то приходилось писать соответсвующие помощники ветвления для выбора экшенов. В любом случае это ты будешь писать - либо базово, описывая карту в роутере например, либо как я описывал, т.е. типа более гибко но больше писанины… точно так же с вариантом, описанным NRG - все равно ты будешь это писать, но уже в модели… -
1 июля 2011 г. 23:06, спустя 8 часов 36 минут 14 секунд
вот написал роутер под свои нужды
так добаляется маршрут$router->addRoute( 'cars',
':module/:marka/:model/:submodel/:user/:controller/:action',
array('controller'=>'index',
'action'=>'index')
);
первый параметр название маршрута
шаблон маршрута
третий параметры по умолчанию
метод добавления маршрута
public function addRoute($routename = 'index', $route = ':module/:controller/:action', $defaults = array('module'=>'index','controller'=>'index','action'=>'index'))
{
foreach (explode($this->Delimiter, $route) as $pos => $part) {
$routes[] = str_replace( ':' , '' , $part );
}
$this->routes[$routename]['route'] = $routes;
$this->routes[$routename]['routestr'] = $route;
$this->routes[$routename]['defaults'] = $defaults;
}
парсинг запроса и разбивка на параметры
public function Dispatcher($request)
{
$parts = trim($request , "/\\");
$parts = explode("/", $parts);
$first = strtolower($parts['0']);
if(array_key_exists($first, $this->routes))
{
foreach($parts as $pos => $part)
{
$var = $this->routes[$first]['route'][$pos];
$this->params[$var] = $part;
}
if(!array_key_exists('module', $this->params) && array_search('module', $this->routes[$first]['route'])) $this->params['module'] = $first;
if(!array_key_exists('controller', $this->params)) $this->params['controller'] = $this->routes[$first]['defaults']['controller'];
if(!array_key_exists('action', $this->params)) $this->params['action'] = $this->routes[$first]['defaults']['action'];
} else {
$this->params = array_merge($this->params, $this->routes['index']['defaults']);
}
}
}Спустя 265 сек.тупой форум даже редактировать нельзя сообщение,
на выходе в переменной $this->params будут содержаться все нужные параметры
запрос
/cars/bmw/m3_coupe/m3_coupe_e92/antonflai/journal/288230376152133235/
результат
Array ( [module] => cars [marka] => bmw [model] => m3_coupe [submodel] => m3_coupe_e92 [user] => antonflai [controller] => journal [action] => 288230376152133235 )
Пожалуйста, авторизуйтесь, чтобы написать комментарий!