мне нужен твой совет. Мне нужно создать несколько действий в контроллере 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',
),
),
Спасибо за помощь!
Множество действий на одного контроллера не приветствуется Мэтью Вейером О'Финни (создателем 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',
),
),
Возможно, вам нужно скопировать и изменить конфигурацию маршрута и другие конфиги.
Решение 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
}
}
URL-адрес.../api/test/test1
Я надеюсь, что это поможет вам.