0

というモジュールで RESTful API を公開するアプリケーションを作成していますapiZend_Controller_Router_Rewrite他のモジュールについては、カスタム定義されたルートを持つオブジェクトを返す小さなクラスを作成しました。

$router = new Zend_Controller_Router_Rewrite();
foreach ($this->_modules as $module) {
    if ($module === 'api') continue;
    foreach ($this->_getConfigFiles($module) as $filename) {
        $config = new Zend_Config_Ini($filename, 'routes');
        $router->addConfig($config, 'routes');
    }
}
return $router;

デフォルトのモジュールには、次のルートがあります。

[routes]
routes.default_index_index.type = Zend_Controller_Router_Route
routes.default_index_index.route = /
routes.default_index_index.defaults.module = default
routes.default_index_index.defaults.controller = index
routes.default_index_index.defaults.action = index

今、私のBootstrapファイル file には次のものがあります。

$router = Shark_Module_Loader::getInstance()->getRouter();
$frontController->setRouter($router);
$frontController->getRouter()->removeDefaultRoutes();
$apiRoute = new Zend_Rest_Route($frontController, array(), array('api'));
$router->addRoute('rest', $apiRoute);

もちろん、残りのルートの追加をスキップすると、デフォルトのモジュールですべてが正常に機能します。しかし、RESTful ルートを追加すると、ルーターで定義されたルートがオーバーライドされる (?) ため、モジュールのコントローラーのindexアクションの現在のルート ( ) は Zend_Rest_Route のインスタンスになります。したがって、ルート設定ファイルで定義されたカスタム ルートにアクセスしようとすると、次のようになります。indexdefault$this->getFrontController()->getRouter()->getCurrentRoute();

...
routes.default_pages_view.type = Zend_Controller_Router_Route
routes.default_pages_view.route = /view/:page
routes.default_pages_view.defaults.module = default
routes.default_pages_view.defaults.controller = pages
routes.default_pages_view.defaults.action = view
...

get要求アクション ( ) が存在しないという 404 エラーが表示されます。

私はすでにドキュメントを調べましたが、この動作を示唆するヒントは見当たりませんでした。

ヘルプとガイダンスをいただければ幸いです。

4

1 に答える 1

1

箱から出してこれを行う方法はありません。(この質問をチェックしてください)

Zend_Controller_Router_Routeクラスを拡張する必要があります。私はこのようにしました:

class Mauro_Controller_Router_Route_Method extends Zend_Controller_Router_Route {

    protected $_method;

    public function __construct($route, $defaults = array(), $reqs = array(), Zend_Translate $translator = null, $locale = null) {
        list($this->_method, $route) = explode(' ', $route, 2);
        parent::__construct($route, $defaults, $reqs, $translator, $locale);
    }

    public function match($path, $partial = false) {
        $requestMethod = $this->getRequest()->getMethod();
        $requestMethod = $this->getRequest()->getParam('method')
            ? strtoupper($this->getRequest()->getParam('method'))
            : $requestMethod;
        return $requestMethod == strtoupper($this->_method)
            ? parent::match($path, $partial)
            : false;
    }

    protected function getRequest() {
        return Zend_Controller_Front::getInstance()->getRequest();
    }

}

その後、次のように使用できます。

$router->addRoute( new Mauro_Controller_Router_Route_Method( 'GET /view/:page', array( 'controller' => 'pages', 'action' => 'view' ), array( 'page' => '/d+', ) ) );
于 2012-10-01T02:28:20.550 に答える