Zend_Rest_Controller не вызывает действие - PullRequest
1 голос
/ 27 января 2011

Я нахожусь в процессе настройки веб-сайта с использованием Zend Framework, где его можно либо назвать API, либо использовать в надлежащей настройке MVC для создания веб-сайта на нем.

Я установил Zend_rest_route, который проверяет URI и определяет, какой маршрут использовать.

Для вызова API мы используем:

http://api.domain.com/controller/action/id/1

и для веб-сайта, который мы называем

http://domain.com/controller/action/id/1

Идея состоит в том, что вам нужно создать только один контроллер, содержащий все действия, которые можно использовать для веб-сайта и API, что сводит к минимуму необходимость переписывать код.

Я создал базовый контроллер, который расширяетZend_Rest_Controller, который затем расширяется всеми контроллерами для того, чтобы получить основную силу API.

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

Когда я var_dump объекта запроса, я получаю следующее:

Website - http://domain.com/guestbook/test/id/5 :

...
["_params":protected]=>
  array(4) {
    ["controller"]=>
    string(9) "guestbook"
    ["action"]=>
    string(4) "test"
    ["id"]=>
    string(1) "5"
    ["module"]=>
    string(7) "default"
  }
...

-

API - http://api.domain.com/guestbook/test/id/5 :
...
  ["_params":protected]=>
  array(4) {
    ["controller"]=>
    string(9) "guestbook"
    ["action"]=>
    string(3) "get"
    ["test"]=>
    string(2) "id"
    ["module"]=>
    string(7) "default"
  }
...

Веб-сайт вызывает правильное действие "test", но тAPI вызывает действие «get», а затем «test» становится первым параметром.

Как мне заставить его вызвать правильное действие?

PHP CODE TO FOLLOW:

Маршрутизатор в Bootlstrap:

$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);

Базовый контроллер:

abstract class My_Controller_Base extends Zend_Rest_Controller
{

    public function getAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(200);
    }

    public function postAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(201);
    }

    public function putAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(200);
    }

    public function deleteAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(204);
    }

}
* 1033И, наконец, мой Контроллер Гостевой Книги:
class GuestbookController extends My_Controller_Base
{
    private $mapper;
    private $model;

    public function init()
    {
       $this->mapper = new Application_Model_GuestbookMapper();
       $this->model = new Application_Model_Guestbook();
    }


    public function indexAction()
    {
        $this->view->entries = $this->mapper->fetchAll();
    }

    public function testAction()
    {
        $test = new Application_Model_Guestbook();
        $id = $this->getRequest()->getParam('id', 1);
        $this->view->entries = $this->mapper->find($id,$test);
        var_dump($this->view->entries);
        $this->_helper->viewRenderer->setNoRender(true);

    }

}

1 Ответ

0 голосов
/ 28 января 2011

Я не работал со службами RESTful, но не думаю, что вы можете установить действие.

Zend_Rest_Route Behavior Method     URI     Module_Controller::action
GET     /product/ratings/   Product_RatingsController::indexAction()
GET     /product/ratings/:id    Product_RatingsController::getAction()
POST    /product/ratings    Product_RatingsController::postAction()
PUT     /product/ratings/:id    Product_RatingsController::putAction()
DELETE  /product/ratings/:id    Product_RatingsController::deleteAction()
POST    /product/ratings/:id?_method=PUT    Product_RatingsController::putAction()
POST    /product/ratings/:id?_method=DELETE     Product_RatingsController::deleteAction()

После вашего Module_Controller в качестве пары ключ-значение будут использоваться только следующие два значения.а остальные отрезаны.Вот почему вы не видите параграф 5 на свалке.Для работы с сервисами RESTful необходимо использовать:

http://api.domain.com/guestbook/id/5

Если вам нужно сделать его глубже, вставьте модуль:

http://api.domain.com/module/controller/id/5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...