0

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

谢谢您的帮助!

4

3 回答 3

2

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

不。

Apigility 的 RPC 功能假设一个路由 -> 一个控制器 -> 一个动作(尽管我们允许多个 HTTP 方法)。这有几个原因:

  • 简化配置
  • 简化查找给定路线的代码(正好是一个地方查看)
  • 有助于防止大型控制器

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

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

于 2015-07-15T09:00:57.300 回答
1

解决方案 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',
    ),
),

可能您必须复制和更改路由配置和其他配置。

解决方案 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',
        ),
    ),
于 2014-11-19T10:59:32.983 回答
0

你可以试试这个路由:

'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

我希望这能帮到您。

于 2015-01-29T15:01:12.000 回答