我需要你的建议。我需要在 Apigility 生成的 RPC 样式 API 控制器中创建多个操作。我需要如何进行路由,使其像在正常的 zend 应用程序中一样工作。
'application' => array(
'type' => 'Literal',
'options' => array(
'route' => '/application',
'defaults' => array(
'__NAMESPACE__' => 'Application'Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',/*I need flexible route like this one*/
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
),
),
),
),
),
Apigility生成的代码是:
<?php
namespace TestAPI'V1'Rpc'Test;
use Zend'Mvc'Controller'AbstractActionController;
use Zend'View'Model'JsonModel;
class TestController extends AbstractActionController
{
public function TestAction()
{
/*Added by myself*/
return new JsonModel(array(
'id' => 'test',
));
}
}
路由是这样生成的:
'controllers' => array(
'factories' => array(
'TestAPI''V1''Rpc''Test''Controller' => 'TestAPI''V1''Rpc''Test''TestControllerFactory',
),
),
'zf-rpc' => array(
'TestAPI''V1''Rpc''Test''Controller' => array(
'service_name' => 'test',
'http_methods' => array(
0 => 'GET',
),
'route_name' => 'test-api.rpc.test',
),
),
谢谢你的帮助!
Matthew Weier O'Phinney(Apigility的创建者)不鼓励每个控制器执行多个操作:
不。
Apigility的RPC功能假设一条路由 ->一个控制器 -> 一个操作(尽管我们允许多个 HTTP 方法)。这是 原因如下:
- 简化配置
- 简化查找给定路由的代码(正好一个查找位置)
- 有助于防止大型控制器
我要做的是创建一个可以处理各种 相关操作,然后每个离散操作的 RPC 服务 (除非可以使用不同的 HTTP 动词描述该操作 在同一条路线上,即)。然后注入每个控制器 服务对象,并调用相应的方法。
来源: https://groups.google.com/a/zend.com/d/msg/apigility-users/Or3xBLAd9Y0/RzQKIMpaV0cJ
解决方案 1
尝试在控制器密钥上注册别名,并在 zf-rpc 配置上注册每个别名。
像这样:
'controllers' => array(
'factories' => array(
'TestAPI''V1''Rpc''Test''Controller' => 'TestAPI''V1''Rpc''Test''TestControllerFactory',
),
'aliases' => array(
'TestAPI''V1''Rpc''Test2''Controller' => 'TestAPI''V1''Rpc''Test''Controller',
'TestAPI''V1''Rpc''Test3''Controller' => 'TestAPI''V1''Rpc''Test''Controller',
),
),
'zf-rpc' => array(
'TestAPI''V1''Rpc''Test''Controller' => array(
'service_name' => 'test',
'http_methods' => array(
0 => 'GET',
),
'route_name' => 'test-api.rpc.test',
),
'TestAPI''V1''Rpc''Test2''Controller' => array(
'service_name' => 'test2',
'http_methods' => array(
0 => 'GET',
),
'route_name' => 'test-api.rpc.test2',
),
'TestAPI''V1''Rpc''Test3''Controller' => array(
'service_name' => 'test3',
'http_methods' => array(
0 => 'GET',
),
'route_name' => 'test-api.rpc.test3',
),
),
可能您必须复制和更改 de route config 和另一个配置。
解决方案 2
您可以尝试生成另一个 rpc 服务并将工厂更改为别名,所有配置都会生成给您。
生成服务后,您将获得如下所示的内容:
'controllers' => array(
'factories' => array(
'TestAPI''V1''Rpc''Test''Controller' => 'TestAPI''V1''Rpc''Test''TestControllerFactory',
'TestAPI''V1''Rpc''Test2''Controller' => 'TestAPI''V1''Rpc''Test2''TestControllerFactory',
),
),
您必须更改为以下内容:
'controllers' => array(
'factories' => array(
'TestAPI''V1''Rpc''Test''Controller' => 'TestAPI''V1''Rpc''Test''TestControllerFactory',
),
'aliases' => array(
'TestAPI''V1''Rpc''Test2''Controller' => 'TestAPI''V1''Rpc''Test''Controller',
),
),
您可以尝试这样做进行路由:
'controllers' => array(
'factories' => array(
'TestAPI''V1''Rpc''Test''Controller' => 'TestAPI''V1''Rpc''Test''TestControllerFactory',
),
),
'zf-rpc' => array(
'TestAPI''V1''Rpc''Test''Controller' => array(
'service_name' => 'test',
'http_methods' => array(
0 => 'GET',
),
'route_name' => 'test-api.rpc.test',
),
),
'router' => array(
'routes' => array(
'test-api.rpc.test' => array(
'type' => 'Segment',
'options' => array(
'route' => '/api/test[/:action_name]',
'defaults' => array(
'controller' =>'TestAPI''V1''Rpc''Test''Controller',
'action' => 'test',
),
),
),))
'在您的控制器中:
<?php
namespace TestAPI'V1'Rpc'Test;
use Zend'Mvc'Controller'AbstractActionController;
class TestController extends AbstractActionController
{
public function testAction()
{
$action_name = $this->getEvent()->getRouteMatch()->getParam('action_name');
switch ($action_name) {
case 'test1':
return $this->test1Action();
default:
return array();
}
}
public function test1Action(){
//Your code here
return ...; //preferable to be array
}
}
网址是.../API/test/test1
我希望这对你有帮助。