Zend - получить все после базового URL (Controller, Action и любые параметры) - PullRequest
5 голосов
/ 04 января 2010

Я пытаюсь создать систему входа в систему с Zend, что, когда пользователь пытается получить доступ к закрытой странице, он будет перенаправлен на страницу входа, если он не вошел в систему. У меня проблема с получением URL-адреса, которую он пытались получить доступ перед рукой. Есть ли функция Zend, которая будет возвращать все после базового URL? Например, мне нужно, чтобы «moduleName / controllerName / ActionName / param1 / value1 / param2 / value2» и т. Д. Отправлялось в качестве параметра строки запроса на страницу входа (например, login /? Redirect = controllerName / actionName / param1 / value1 /) param2 / значение)

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

$controllerName = Zend_Controller_Front::getInstance()->getRequest()->getControllerName();
$actionName = Zend_Controller_Front::getInstance()->getRequest()->getActionName();
$paramArray = Zend_Controller_Front::getInstance()->getRequest()->getParams();
$params = '';

foreach($paramArray as $key => $value)
    $params .= $key . "/" . $value;

$this->_redirect('/admin/login/?redirect=' . $controllerName . "/" . $actionName . "/" . $params);

но даже тогда я получаю такие параметры, как module / admin / controller / index / etc, которые мне не нужны. Итак, как я могу получить все в виде строки, как в URL, или, по крайней мере, только параметры в строке без контроллера и действия в качестве значений параметров?

** РЕДАКТИРОВАТЬ: Вот мое текущее решение, но должен быть более элегантный способ сделать это **

            $moduleName = $this->getRequest()->getModuleName();
            $controllerName = $this->getRequest()->getControllerName();
            $actionName = $this->getRequest()->getActionName();
            $paramArray = $this->getRequest()->getParams();
            $params = '';

            foreach($paramArray as $key => $value)
                if($key <> "module" && $key <> "controller" && $key <> "action")
                    $params .= $key . "/" . $value . "/";

            $this->_redirect('/admin/login/?redirect=' . $moduleName . "/" . $controllerName . "/" . $actionName . "/" . $params);

Ответы [ 5 ]

3 голосов
/ 04 января 2010

Я думаю, что вы можете передать URI последнего запроса следующим образом:

$this->_redirect('/admin/login/?redirect='.urlencode($this->getRequest()->REQUEST_URI));
2 голосов
/ 02 октября 2012

Понятия не имею, почему у Zend нет этой функции, но именно так я ее выполнил. Мой вариант использования состоял в том, что я хотел перенаправить старые URL-адреса, которые направлялись напрямую в контроллеры, используя маршрутизацию по умолчанию, в новую структуру URL-адреса API, которая использовала маршруты.

$filtered_params = array_diff_key(
  $this->_request->getParams(), 
  array_fill_keys( array('controller', 'module', 'action' ), 1) 
);

$this->_redirect('/api/1.0/?' . http_build_query($filtered_params));
2 голосов
/ 26 мая 2011

Я знаю, это старый вопрос, но для будущих ссылок:

$this->getRequest()->getRequestUri();

это должно дать вам то, что вы хотите ..

1 голос
/ 24 марта 2012

Старый вопрос, но вот решение, которое сработало для меня. Отсюда вы можете захотеть URL кодировать его и т. Д.

$currentRoute = substr($this->getRequest()->getRequestUri(),strlen($this->getRequest()->getBaseUrl()));
0 голосов
/ 04 января 2010

Вы можете попробовать использовать urlencode() и urldecode() для кодирования / декодирования отдельных строк параметров. Примером может быть:

// outputs %2Fpath%2Fto%2Ffile.php
$path = '/path/to/file.php';
echo urlencode($path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...