Получить все параметры после действия в Zend?

#zend-framework

#zend-framework

Вопрос:

Когда я вызываю маршрутизатор, как показано ниже, в Zend:

coupon/index/search/cat/1/page/1/x/111/y/222

И внутри контроллера, когда я получаю $this->_params , я получаю массив:

 array(
    'module' => 'coupon',
    'controller' => 'index',
    'action' => 'search',
    'cat' => '1',
    'page' => '1',
    'x' => '111',
    'y' => '222'
)
  

Но я хочу получить только:

 array(
    'cat' => '1',
    'page' => '1',
    'x' => '111',
    'y' => '222'
)
  

Не могли бы вы рассказать мне, как получить все params сразу после action ?

Ответ №1:

ИМХО, это более элегантно и включает изменения в ключах действия, контроллера и метода.

 $request = $this->getRequest();
$diffArray = array(
    $request->getActionKey(),
    $request->getControllerKey(),
    $request->getModuleKey()
);
$params = array_diff_key(
    $request->getUserParams(),
    array_flip($diffArray)
);
  

Ответ №2:

Насколько я знаю, вы всегда получите контроллер, действие и модуль в списке параметров, поскольку он является частью значения по умолчанию. Вы могли бы сделать что-то вроде этого, чтобы удалить три из полученного массива:

     $url_params = $this->getRequest()->getUserParams();
    if(isset($url_params['controller']))
        unset($url_params['controller']);
    if(isset($url_params['action']))
        unset($url_params['action']);
    if (isset($url_params['module']))
        unset($url_params['module']);
  

В качестве альтернативы, поскольку вы не хотите делать это каждый раз, когда вам нужен список, создайте помощника, который сделает это за вас, что-то вроде этого:

 class Helper_Myparams extends Zend_Controller_Action_Helper_Abstract
{
    public $params;

    public function __construct()
    {
        $request = Zend_Controller_Front::getInstance()->getRequest();
        $this->params = $request->getParams();
    }

    public function myparams()
    {       
        if(isset($this->params['controller']))
            unset($this->params['controller']);
        if(isset($this->params['action']))
            unset($this->params['action']);
        if (isset($this->params['module']))
            unset($this->params['module']);
        return $this->params;
    }

    public function direct()
    {
        return $this->myparams();
    }
}
  

И вы можете просто вызвать это из своего контроллера, чтобы получить список:

 $this->_helper->myparams();
  

Так, например, используя URL:

 http://127.0.0.1/testing/urls/cat/1/page/1/x/111/y/222
  

И код:

 echo "<pre>";
print_r($this->_helper->myparams());
echo "</pre>";
  

Я получаю следующий напечатанный массив:

 Array
(
    [cat] => 1
    [page] => 1
    [x] => 111
    [y] => 222
)
  

Комментарии:

1. зачем нужно писать помощник, если $this->getRequest()->getParams() возвращает ожидаемое значение?

2.Поскольку, если вы читаете вопрос posters, он не возвращает ожидаемые значения, poster не хочет, чтобы контроллер, действие и модуль были в массиве. $this->getRequest()->getParams() Вернет их в свой массив. Следовательно, удаляя их с unset помощью — но если массив будет использоваться либо несколько раз, либо в разных контроллерах, проще использовать помощник и меньше кода в контроллере.

Ответ №3:

Как насчет этого?

В контроллере:

 $params = $this->getRequest()->getParams();
unset($params['module'];
unset($params['controller'];
unset($params['action'];
  

Довольно неуклюжий; может потребоваться несколько isset() проверок, чтобы избежать предупреждений; может застрять этот сегмент в собственном методе или помощнике. Но это сделало бы работу, верно?

Комментарии:

1. Смотрите Ответ @Scoobler, который прекрасно дополняет детали, на которые я ссылаюсь.