계층 적 Zend Rest 경로를 설정하는 방법은 무엇입니까?
-
18-09-2019 - |
문제
Zend 프레임 워크를 사용하면 다음 패턴으로 구성된 리소스에 대한 REST API의 경로를 구축하려고합니다.
- http://example.org/users/
- http://example.org/users/234
- http://example.org/users/234/items
- http://example.org/users/234/items/34
zend_rest_route로 이것을 어떻게 설정합니까?
다음은 bootstrap.php 파일에서 사용자 리소스 (user/: id)의 경로를 설정하는 방법입니다.
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);
내가 이해하는 한, 이것은 모든 경로이므로 사용자/324/항목/34는 id = 324 및 항목 = 34로 설정되며 모든 것이 사용자 (전면 모듈) 모델에 매핑됩니다. 거기에서 나는 항목 매개 변수를 테스트하고 GET 요청에서 사용자 #324의 항목 #34를 검색 할 수 있다고 생각합니다.] <=== 방금 확인했는데 다음과 같은 작동하지 않는 것 같습니다.
Acessing/Users/234/Items/43 및
var_dump($this->_getAllParams());
REST 컨트롤러의 동작에서 다음은 다음과 같은 출력을 초래합니다.
array(4) {
["controller"]=> string(5) "users"
["action"]=> string(3) "get"
[2]=> string(5) "items" ["module"]=> string(7) "default"]
}
어떻게 든 두 ID가 모두 길을 잃었습니다 ...
누구나?
해결책
afaik, zend_rest_route에는 기능이 없어서 이와 같은 일을 할 수 있습니다. 제안이 있지만 언제 구현 될지 확실하지 않습니다. 부트 스트랩에 이것을 추가 하여이 사용자 지정 경로를 설정할 수 있습니다.
$front = $this->getResource('FrontController');
$testRoute = new Zend_Controller_Router_Route(
'users/:user_id/items/:item_id',
array(
'controller' => 'users',
'action' => 'item',
'module' => 'default'
)
);
$front->getRouter()->addRoute('test', $testRoute);
user_id 또는 item_id 사용자 controller에서 itemAction에서 매개 변수로 사용할 수 있습니다.
$user_id = $this->_request->getParam('user_id');
다른 팁
솔루션을 Github 및 작곡가 패키지로 공개했습니다. 보다 https://github.com/aporat/application_rest_controller_route.
zend_controller_router_route를 확장하는 새로운 클래스를 추가하고 Abiliy를 추가하여 다음과 같은 사용자 정의 편안한 경로를 추가합니다.
$frontController = Zend_Controller_Front::getInstance();
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages']));
zend_rest_route 컨트롤러 이름의 첫 번째 매개 변수는 1 개의 매개 변수가있을 때만 'ID'로 맵핑됩니다.
내가 생각해 낸 가장 좋은 솔루션은 Zend_rest_route를 서브 클래스하고 match () 함수를 무시하는 것입니다. zend_rest_route의 일치 함수를 복사하지만 "Digest Uri Params"주석 (약 60 줄) 직전에 다음을 추가하십시오.
if($pathElementCount > 1 && $path[0] != 'id') {
$params['id'] = urldecode($path[0]);
array_shift($path);
}
그것은 당신이 찾고있는 기능을 제공해야합니다.