#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, который прекрасно дополняет детали, на которые я ссылаюсь.