ФорумПрограммированиеPHP для идиотов → как разбираются вот такие запросы

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

  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 30 июня 2011 г. 18:03

    как разбираются вот такие запросы
    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 - ид записи из бортавика

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

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

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 30 июня 2011 г. 18:19, спустя 15 минут 52 секунды

    в смысле ты не знаешь, как регуляркой разбить строку на части?
  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 30 июня 2011 г. 18:33, спустя 14 минут 18 секунд

    да неее, допустим нужно котроллере cars вывести контент по всем этим параметрам, ну вначале всё легко..
    /cars/bmw/ - выводим список любых моделей бмв
    /cars/bmw/m3_coupe/ выводим список моделей м3
    а дальше всё сложнее и сложнее
    получится очень тяжелый контроллер, может кто нибудь знает как это можно сделать проще и удобнее???

  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 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 {
    //выводим список марок авто
    }


    }
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 30 июня 2011 г. 20:39, спустя 1 час 53 минуты 38 секунд

    по идее екшн твоего контроллера должен выглядеть так :
    public function carsAction()
    {
    $params = $this->getRequest->getParams();
    $cars = NRG::getCollection('cars')->setParams($params);
    /**
    * Here goes render
    */
    }


    т.е. суть контроллера в том, чтобы передать данные в модель, а модель в свою очередь обеспечит вьюху необходимыми данными.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 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

    это лично мое мнение, на самом деле реализация может быть другая
  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 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 это не экшн, это контроллер
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 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 полезло
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 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)
    }
    }
  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 1 июля 2011 г. 10:56, спустя 58 минут 16 секунд

    а как такой роутрер можно реализовать в собственном фреймворке?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 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 , но он не поддерживает несколько доменов/субдоменов
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 1 июля 2011 г. 14:30, спустя 1 час 57 минут 54 секунды

    я когда то юзал такое, что контроллер получал параметры урла, базовы определял экшен, исключае его из параметро а детишки сами рулили, базовый роутинг определял только контроллер и делегировал ему полномочия по оставшемуся роутингу. Тогда можно было юзать и command и controller action. Т.к. выбор пути внутреннего направления решал контроллер, то приходилось писать соответсвующие помощники ветвления для выбора экшенов. В любом случае это ты будешь писать - либо базово, описывая карту в роутере например, либо как я описывал, т.е. типа более гибко но больше писанины… точно так же с вариантом, описанным NRG - все равно ты будешь это писать, но уже в модели…
  • chukey

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz 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 )

Пожалуйста, авторизуйтесь, чтобы написать комментарий!