Хобрук: Ваш путь к мастерству в программировании

Маршрут Zend Framework для подпапок с отдыхом

Для моей текущей настройки приложения я пытаюсь создать маршрутизацию для стандартных контроллеров и контроллеров отдыха.

Это моя структура.

/application
  /modules
    /module
      /controllers
        /Admin
        /Api

Чтобы вызвать контроллер из подпапки администратора:

/module/admin_controller/action

Я хочу изменить это на:

/admin/module/controller/action

В моей текущей настройке:

/* application.ini */
;Default route
resources.router.routes.defaultmodule.type = Zend_Controller_Router_Route_Module
resources.router.routes.defaultmodule.defaults.module = "default


; APi route
resources.router.routes.api.type = Zend_Controller_Router_Route
resources.router.routes.api.route = ":api" 
resources.router.routes.api.reqs.api = "api"
resources.router.routes.apichain.type = Zend_Controller_Router_Route_Chain
resources.router.routes.apichain.chain = "api, defaultmodule"

; Admin route
resources.router.routes.admin.type = Zend_Controller_Router_Route
resources.router.routes.admin.route = ":admin" 
resources.router.routes.admin.reqs.admin = "admin"
resources.router.routes.adminchain.type = Zend_Controller_Router_Route_Chain
resources.router.routes.adminchain.chain = "admin, defaultmodule"


/* Plugin */
class Pwb_Plugin_ControllerRoute
    extends Zend_Controller_Plugin_Abstract
{    
    public function routeShutdown(Zend_Controller_Request_Abstract $request)
    {
        if ($request->getParam('admin')) {
            $admin_controller = $request->getParam('admin') . '_' . $request->getControllerName();
            $request->setControllerName($admin_controller);
        }

        if ($request->getParam('api')) {
            $admin_controller = $request->getParam('api') . '_' . $request->getControllerName();
            $request->setControllerName($admin_controller);
        }
    }
}

/* Module Bootstrap */
class Acl_Bootstrap
    extends Zend_Application_Module_Bootstrap
{
    protected function _initRestRoute()
    {
        $this->bootstrap('frontController');
        $frontController = Zend_Controller_Front::getInstance();
        $restRoute = new Zend_Rest_Route(
                $frontController,
                array(),
                array(
                    'acl' => array(
                        'api_role'
                    ))
        );
        $frontController->getRouter()->addRoute('restAcl', $restRoute);
    }

}

Проблема здесь в том, что некоторые контроллеры в папке API являются остальными, но не все.

/ api / acl / role правильно маршрутизируется к indexAction, как и ожидалось.

/ api / acl / role / 1 ищет действие "1", где, как я ожидал, он направляется в getAction.

Как мне интегрировать Zend_Route_Rest из модуля Bootstrap в эти наборы правил.

Любая помощь будет принята с благодарностью.


  • api это модуль? а acl это контроллер? 15.12.2011
  • Извините, acl - это модуль, а Api - это подпапка контроллера. 15.12.2011
  • Я думаю, что обычно вы сначала указываете имя модуля, а затем имя контроллера. 16.12.2011
  • Это правда, поэтому я пытаюсь маршрутизировать запросы 16.12.2011
  • В предоставленном коде я не вижу кода, относящегося к этому маршруту. 16.12.2011
  • В application.ini есть код для установки admin / api в качестве переменной, затем код для изменения имени контроллера, а затем также есть код в начальной загрузке модуля, который должен маршрутизироваться на контроллер zend rest. Я не знаю, какой код можно было бы правильно идентифицировать как маршрут. 16.12.2011
  • вы слишком усложнили свою маршрутизацию. нет необходимости менять имя вашего контроллера 16.12.2011
  • Исходный запрос на вызов подпапки Controller: / acl / api_role / 1, как мне изменить это на: / api / acl / role / 1 без переименования имени контроллера? 16.12.2011
  • Добавьте новый маршрут для '/ api / acl / role / 1' и соответствующим образом установите модуль / контроллер / действие. В чем проблема? 16.12.2011
  • Проблема в том, что мне нужно создать правило для каждого контроллера, которого в настоящее время слишком много. 16.12.2011
  • извините, мне это кажется сложным. Я ничем не могу помочь. 16.12.2011

Ответы:


1

Для этого я создал подклассы нескольких классов и создал статические маршруты для admin / api.

Application Bootstrap
protected function _initRoute()
    {
        $front = Zend_Controller_Front::getInstance();
        $router = $front->getRouter();

        $dispatcher = $front->getDispatcher();
        $request = $front->getRequest();

        $defaultRoute = new Pwb_Controller_Router_Route_Module(array(), $dispatcher, $request);

        //Replace default route in our router with our own route
        $router->addRoute('default', $defaultRoute);


        $adminRoute = new Pwb_Controller_Router_Route(
                ':admin',
                array(),
                array(
                    'admin' => 'admin'
                )
        );

        $adminDefault = $adminRoute->chain($defaultRoute);

        $router->addRoute('admin', $adminRoute);
        $router->addRoute('admin', $adminDefault);

        $apiRoute = new Pwb_Controller_Router_Route(
                ':api',
                array(),
                array(
                    'api' => 'api'
                )
        );

        $apiDefault = $apiRoute->chain($defaultRoute);
        $router->addRoute('api', $apiDefault);
        $router->addRoute('api', $apiRoute);
    }


Rest Route

class Pwb_Controller_Router_Rest extends Zend_Rest_Route
{ 
    public function match($request, $partial = false)
    {
        if (!$request instanceof Zend_Controller_Request_Http) {
            $request = $this->_front->getRequest();
        }
        $this->_request = $request;
        $this->_setRequestKeys();

        $path   = $request->getPathInfo();
        $params = $request->getParams();
        $values = array();
        $path   = trim($path, self::URI_DELIMITER);

        if ($path != '') {

            $path = explode(self::URI_DELIMITER, $path);
            //Determine Environment
            if($path[0] != 'api') {
                return false;
            } else {
                array_shift($path);
            }

            // Determine Module
            $moduleName = $this->_defaults[$this->_moduleKey];
            $dispatcher = $this->_front->getDispatcher();
            if ($dispatcher && $dispatcher->isValidModule($path[0])) {
                $moduleName = $path[0];
                if ($this->_checkRestfulModule($moduleName)) {
                    $values[$this->_moduleKey] = array_shift($path);
                    $this->_moduleValid = true;
                }
            }

            // Determine Controller
            $controllerName = $this->_defaults[$this->_controllerKey];
            if (count($path) && !empty($path[0])) {
                if ($this->_checkRestfulController($moduleName, 'api_' . $path[0])) {
                    $controllerName = 'api_' . $path[0];
                    $values[$this->_controllerKey] = 'api_' . array_shift($path);
                    $values[$this->_actionKey] = 'get';
                } else {
                    // If Controller in URI is not found to be a RESTful
                    // Controller, return false to fall back to other routes
                    return false;
                }
            } elseif ($this->_checkRestfulController($moduleName, $controllerName)) {
                $values[$this->_controllerKey] = $controllerName;
                $values[$this->_actionKey] = 'get';
            } else {
                return false;
            }

            //Store path count for method mapping
            $pathElementCount = count($path);

            // Check for "special get" URI's
            $specialGetTarget = false;
            if ($pathElementCount && array_search($path[0], array('index', 'new')) > -1) {
                $specialGetTarget = array_shift($path);
            } elseif ($pathElementCount && $path[$pathElementCount-1] == 'edit') {
                $specialGetTarget = 'edit';
                $params['id'] = urldecode($path[$pathElementCount-2]);
            } elseif ($pathElementCount == 1) {
                $params['id'] = urldecode(array_shift($path));
            } elseif ($pathElementCount == 0 && !isset($params['id'])) {
                $specialGetTarget = 'index';
            }

            // Digest URI params
            if ($numSegs = count($path)) {
                for ($i = 0; $i < $numSegs; $i = $i + 2) {
                    $key = urldecode($path[$i]);
                    $val = isset($path[$i + 1]) ? $path[$i + 1] : null;
                    $params[$key] = urldecode($val);
                }
            }

            // Determine Action
            $requestMethod = strtolower($request->getMethod());
            if ($requestMethod != 'get') {
                if ($request->getParam('_method')) {
                    $values[$this->_actionKey] = strtolower($request->getParam('_method'));
                } elseif ( $request->getHeader('X-HTTP-Method-Override') ) {
                    $values[$this->_actionKey] = strtolower($request->getHeader('X-HTTP-Method-Override'));
                } else {
                    $values[$this->_actionKey] = $requestMethod;
                }

                // Map PUT and POST to actual create/update actions
                // based on parameter count (posting to resource or collection)
                switch( $values[$this->_actionKey] ){
                    case 'post':
                        if ($pathElementCount > 0) {
                            $values[$this->_actionKey] = 'put';
                        } else {
                            $values[$this->_actionKey] = 'post';
                        }
                        break;
                    case 'put':
                        $values[$this->_actionKey] = 'put';
                        break;
                }

            } elseif ($specialGetTarget) {
                $values[$this->_actionKey] = $specialGetTarget;
            }

        }
        $this->_values = $values + $params;

        $result = $this->_values + $this->_defaults;

        if ($partial && $result)
            $this->setMatchedPath($request->getPathInfo());

        return $result;
    }
}

Module Bootstrap;
class Acl_Bootstrap
    extends Zend_Application_Module_Bootstrap
{
    protected function _initRestRoute()
    {
        $this->bootstrap('frontController');
        $frontController = Zend_Controller_Front::getInstance();

        $restRoute = new Pwb_Controller_Router_Rest(
                $frontController,
                array(),
                array(
                    'acl' => array(
                        'api_role'
                    ))
        );
        $frontController->getRouter()->addRoute('restAcl', $restRoute);
    }

}


class Pwb_Controller_Router_Route_Module extends Zend_Controller_Router_Route_Module
{
    public function match($path, $partial = false)
    {
        $return =  parent::match($path, $partial);
        $front = Zend_Controller_Front::getInstance();
        $request = $front->getRequest();
        $is_admin_env = $request->getParam('is_admin_env');
        if($is_admin_env) {
            $return['controller'] = $is_admin_env . '_' .  $return['controller'];
        }
        return $return;
    }
}

class Pwb_Controller_Router_Route extends Zend_Controller_Router_Route
{
    public function match($path, $partial = false) {

        $return = parent::match($path, $partial);
        if(isset($return['admin'])) {
            $front = Zend_Controller_Front::getInstance();
            $request = $front->getRequest();
            $request->setParam('is_admin_env', $return['admin']);
            $front->setRequest($request);
        }
        return $return;
    }
}
19.12.2011
Новые материалы

Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

«Очень простой» эволюционный подход к обучению с подкреплением
В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..