Как добавить и использовать несколько действий в Apigilities RPC Generated Controller

0

мне нужен твой совет. Мне нужно создать несколько действий в контроллере API стиля RPC, сгенерированном Apigility. Как мне нужно сделать маршрутизацию, чтобы она работала, как в обычном приложении 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',
    ),
),

Спасибо за помощь!

Теги:
zend-framework2
rpc
apigility

3 ответа

1

Множество действий на одного контроллера не приветствуется Мэтью Вейером О'Финни (создателем Apigility):

Нет.

Функция Apigility RPC устанавливает один маршрут → один контроллер → одно действие (хотя мы разрешаем ему несколько HTTP-методов). Это по нескольким причинам:

  • Упрощает настройку
  • Упрощает поиск кода для данного маршрута (ровно одно место для поиска)
  • Помогает предотвратить большие контроллеры

То, что я сделал бы, это создать объект службы, который может обрабатывать различные связанные операции, а затем службу RPC на отдельную операцию (если эта операция не может быть описана с использованием разных HTTP-глаголов на том же маршруте, то есть). Затем вводите каждый контроллер этим служебным объектом и вызывайте соответствующий метод.

источник: https://groups.google.com/a/zend.com/d/msg/apigility-users/Or3xBLAd9Y0/RzQKIMpaV0cJ

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',
        ),
    ),
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
    }
}

URL-адрес.../api/test/test1

Я надеюсь, что это поможет вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню