как разбираются вот такие запросы

chukey

Новичок
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 - ид записи из бортавика

во втором варианте чуть меньше параметров, отсутствует поколение, только марка и модель

но как управлять стольким параметрами в контроллере?
 

chukey

Новичок
такой код будет пусть для первых параметров
PHP:
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 {
            //выводим список марок авто
    }
 
   
}
 

AmdY

Пью пиво
Команда форума
неужели так сложно, експлойдите по /, первый array_unshift - контроллер, второй - экшин. с оставшимся массивом гоняете цикл только через один $i += 2;
$params[ $request[$i] ] = $request[$i+1]
 

chukey

Новичок
ото я это не знаю, я не это спрашиваю... я выложил код котроллера, как можно облеегчить работу с таким множеством параметров в запросе??
 

A1x

Новичок
PHP:
public function IndexAction()
{
    $action = $this->router->GetAction(); // в нашем случае пришло bmw
так action index или bmw?
 
  • Like
Реакции: AmdY

chukey

Новичок
bmw это динамический параметр!!! а метод статический!! по умолчанию это просто просмотр списка моделей, (index или view)
 

chukey

Новичок
как тебе еще объяснить..... bmw это не метод, а параметр, теперь понятно?
 

AmdY

Пью пиво
Команда форума
я я понял
PHP:
 if (preg_math('~^cars/(\w+)/(\w+)/(\w+)/(\w+)/(\w+)/(\w+)/~', 'cars/bmw/m3_coupe/m3_coupe_e92/antonflai/journal/288230376152133235/', $result)) {
$url = "cars/index/{$result[1]}/{$result[2]}/{$result[3]}/{$result[4]}/{$result[5]}/{$result[6]}/";
}
 

AmdY

Пью пиво
Команда форума
Вурдалак
у него $this->router->GetAction(); берёт второй сегмент урла, который на самом деле без реврайта должен быть первым
cars/index/bmw/m3_coupe/m3_coupe_e92/antonflai/journal/288230376152133235/
 

Вурдалак

Продвинутый новичок
Значит плохой роутинг. Ну или можно сказать, что автор отошёл от принятого соглашения по роутингу.

В чём состоит конкретный вопрос автора я, кстати, не понял.
 

chukey

Новичок
вот написал роутер под свои нужды

так добаляется маршрут
PHP:
$router->addRoute( 'cars',
 ':module/:marka/:model/:submodel/:user/:controller/:action',
 array('controller'=>'index',
 'action'=>'index')
 );
первый параметр название маршрута
шаблон маршрута
третий параметры по умолчанию


метод добавления маршрута
PHP:
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;
}
парсинг запроса и разбивка на параметры

PHP:
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']);
		}
	}
}

на выходе в переменной $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 )
 
Сверху