Нужный action

Главные вкладки

Аватар пользователя Artalek Artalek 9 октября 2020 в 10:23

Здравствуйте, не могу понять как лучше сделать.

Я создал routing.yml:

modulemy.json_api:
  path: '/api/json'
  defaults:
    _controller: 'Drupal\modulemy\Controller\JsonApiController::renderApi'
    _title: 'JSON api'
  methods: [POST]
  requirements:
    _access: 'TRUE'

и controller JsonApiController.php:

<?php
namespace Drupal\modulemy\Controller;

use 

Drupal\Core\Controller\ControllerBase;
use 
Symfony\Component\HttpFoundation\JsonResponse;
use 
Symfony\Component\HttpFoundation\Request;
/**
 * Implementing our example JSON api.
 */
class JsonApiController extends ControllerBase {
    
/**
    * Callback for the API.
    */
    
public function renderApi(Request $request) {
        
$post $request->request;

        switch (

$post->get('action')) {
            case 
'getInfo':
                
$data $this->actiongetInfo($post->get('id'));
                break;
            
            default:
                
$data 'Данный action не найден!';
                break;
        }

        return new 

JsonResponse([
            
'data' => $data,
            
'method' => 'POST',
        ]);
    }

    public function 

actiongetInfo($id='')
    {
        return [
            
'id' $id,
            
'title' 'Title'
        
];
    }
}
?>

В данном случае я использую "switch" и POST параметр "action", чтобы понять из какого action брать информацию, может есть какой-то более лучший вариант?

Комментарии

Аватар пользователя gun_dose gun_dose 9 октября 2020 в 13:16

Можно создать в классе методы с именами экшенов и вызывать типа так:

<?php
    
if (!is_callable([$this$payload['action']])) {
      throw new 
BadRequestHttpException('Action ' $payload['action'] . ' does not exist');
    }

    

$data call_user_func([$this$payload['action']], $payload);

?>