首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Apigilities RPC生成的控制器中添加和使用多个操作

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

Stack Overflow用户
提问于 2014-11-18 22:16:50
回答 3查看 984关注 0票数 0

我需要你的建议。我需要在Apigility生成的RPC样式API控制器中创建多个操作。我需要如何进行路由,才能让它像在普通zend应用程序中一样工作。

代码语言:javascript
复制
'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生成的代码是:

代码语言:javascript
复制
<?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',
        ));
    }

}

路由是这样生成的:

代码语言:javascript
复制
'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',
    ),
),

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

发布于 2015-07-15 17:00:57

Matthew Weier‘’Phinney(Apigility的创建者)不鼓励每个控制器执行多个操作:

Apigility的远程过程调用功能假设一个路由,一个控制器,一个动作(尽管我们允许多个->方法)。这有以下几个原因:

  • 简化了配置
  • 简化了查找给定路由的代码(只需在一个地方查找)
  • 有助于防止大型控制器

我要做的是创建一个可以处理各种相关操作的服务对象,然后为每个离散操作创建一个RPC服务(除非该操作可以在同一路由上使用不同的HTTP动词来描述,也就是说)。然后向每个控制器注入该服务对象,并调用适当的方法。

来源:https://groups.google.com/a/zend.com/d/msg/apigility-users/Or3xBLAd9Y0/RzQKIMpaV0cJ

票数 2
EN

Stack Overflow用户

发布于 2014-11-19 18:59:33

解决方案1

尝试在控制器密钥上注册别名,并在zf-rpc配置上注册每个别名。

大概是这样的:

代码语言:javascript
复制
'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配置和其他配置。

解决方案2

您可以尝试生成另一个rpc服务,并将工厂更改为别名,所有配置都将为您生成。

在你生成服务之后,你会得到类似这样的东西:

代码语言:javascript
复制
'controllers' => array(
        'factories' => array(
            'TestAPI\\V1\\Rpc\\Test\\Controller' => 'TestAPI\\V1\\Rpc\\Test\\TestControllerFactory',
            'TestAPI\\V1\\Rpc\\Test2\\Controller' => 'TestAPI\\V1\\Rpc\\Test2\\TestControllerFactory',
        ),
    ),

您必须更改为如下所示:

代码语言:javascript
复制
'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',
        ),
    ),
票数 1
EN

Stack Overflow用户

发布于 2015-01-29 23:01:12

您可以尝试以下路由:

代码语言:javascript
复制
'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',
                ),
            ),
        ),))

`并且在你的控制器中:

代码语言:javascript
复制
<?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
    }
}

url是.../api/test/test1

我希望这能对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26996457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档