0

現在、イベント コントローラー (/event) に対して機能する REST ルートがあります。EventSignUp コントローラーでイベント サインアップを処理し、このコントローラーを /event/signups ルートにマップしたいと考えています。

Zend Frameworkのドキュメントには、URL /event/signup/:id を Event_SignupController にマップする必要があると記載されています。しかし、これは私にはうまくいきません。

Bootstrap クラスのすべてのコントローラーにデフォルトの REST ルートを設定します。

$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();

// Specifying all controllers as RESTful:
$restRoute = new Zend_Rest_Route($front);
$router->addRoute('default', $restRoute);

何か不足していますか、それともドキュメントが間違っていますか? ドキュメントが間違っている場合、目的の目標を達成するためにどのようなアプローチを取る必要がありますか?

余談ですが、既存のコントローラーの多くはデフォルトの REST ルートに依存しているため、既存のすべてのコントローラーに新しいルートを実装する必要がないソリューションがあれば便利です。

編集: ドキュメントには、 /product/ratings が Product_RatingsController に変換されると記載されています。これは Products モジュールの RatingsController を意味します。すべてのコントローラがデフォルト モジュールに配置されているため、必要な動作が Rest Route でサポートされていません。

したがって、これは私の質問を変更します.デフォルトのRestルートへの既存のコントローラーの依存関係に影響を与えることなく、私の望ましい動作を達成することは可能ですか? もしそうなら、どのように?そうでない場合、私にとって最善のアプローチは何ですか?

4

1 に答える 1

1

Haim Evgi のコメントに基づいて、リクエスト メソッドに基づいて Zend_Controller_Router_Route ルートを追加するコントローラー プラグインを作成しました。これは、そのコントローラー プラグインのコードです。

class TW_Webservice_Controller_Plugin_RestRoutes extends Zend_Controller_Plugin_Abstract
{

    /**
     *
     * @var Zend_Controller_Router_Interface
     */
    public $router;

    /**
     * Setup Rest routes that are not handled by the default Zend_Rest_Route object.
     *
     * @param Zend_Controller_Request_Abstract $request
     */
    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();
        $this->router = $front->getRouter();

        $method = strtolower($request->getMethod());
        $restRoutes = array(
            '/event/signup' => 'event-signup'
        );

        $this->addRoutes($method, $restRoutes);
    }

    /**
     *
     * @param string $method The request method
     * @param array $restRoutes Router pattern => Controller name pairs
     */
    public function addRoutes($method, $restRoutes)
    {
        foreach ($restRoutes as $routePattern => $controllerName) {
            switch ($method) {
                case "get":
                    $this->addGetRoutes($routePattern, $controllerName);
                    break;
                case "post":
                    $this->addPostRoute($routePattern, $controllerName);
                    break;
                case "put":
                    $this->addPutRoute($routePattern, $controllerName);
                    break;
                case "delete";
                    $this->addDeleteRoute($routePattern, $controllerName);
                    break;
            }
        }
    }

    /**
     *
     * @param string $routePattern
     * @param string $controllerName 
     */
    public function addGetRoutes($routePattern, $controllerName)
    {
        $this->addRestRoute($routePattern, $controllerName, 'index');

        $routePattern = $routePattern . '/:id';
        $this->addRestRoute($routePattern, $controllerName, 'get');
    }

    /**
     *
     * @param string $routePattern
     * @param string $controllerName 
     */
    public function addPostRoute($routePattern, $controllerName)
    {
        $this->addRestRoute($routePattern, $controllerName, 'post');
    }

    /**
     *
     * @param string $routePattern
     * @param string $controllerName 
     */
    public function addPutRoute($routePattern, $controllerName)
    {
        $routePattern = $routePattern . '/:id';
        $this->addRestRoute($routePattern, $controllerName, 'put');
    }

    /**
     *
     * @param string $routePattern
     * @param string $controllerName 
     */
    public function addDeleteRoute($routePattern, $controllerName)
    {
        $routePattern = $routePattern . '/:id';
        $this->addRestRoute($routePattern, $controllerName, 'delete');
    }

    /**
     *
     * @param string $routePattern
     * @param string $controllerName
     * @param string $action
     */
    public function addRestRoute($routePattern, $controllerName, $action)
    {
        $route = new Zend_Controller_Router_Route($routePattern, array(
            'controller' => $controllerName,
            'action' => $action
        ));

        $this->router->addRoute($controllerName . '-' . $action, $route);
    }

}

$restRoutes 配列が構成ファイルから取得された方が良いでしょうが、今のところこれで動作します。

于 2011-09-05T21:08:31.013 に答える