如何在 Apigilities RPC 生成的控制器中添加和使用多个操作


How to add and use multiple actions into Apigilities RPC Generated Controller

我需要你的建议。我需要在 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

我希望这对你有帮助。