Prestashop - конечные точки REST для моего модуля - PullRequest
0 голосов
/ 25 апреля 2018

Я разрабатываю модуль Prestashop, он будет экспортировать данные клиентов и заказы, он будет содержать хуки для синхронизации клиентов, корзину и события заказов - обычно это модуль, который будет интегрирован с CRM-подобной службой.

Мой модуль содержит свои собственные представления, сделанные в vue.js - одна страница, асинхронная. Существуют страницы регистрации, входа в систему, настройки и т. Д. Связь с бэкэндом осуществляется с помощью запросов GET / POST по маршрутам {baseUrl} / mymodule / actionname и простых ответов json, от которых зависят представления vue. Просто мне нужно создать конечные точки REST для моего модуля, что-то вроде примеров ниже.

WordPress Custom RestApi:

class RestApi
{
    public function __construct()
    {
        add_action('rest_api_init', array(get_class($this), 
        'register_endpoints'));
    }

    public static function register_endpoints()
    {
        register_rest_route('mymodule', '/login', array(
            'methods' => WP_REST_Server::CREATABLE,
            'callback' => array('RestApi', 'login' ),
        ));
    }
}

SugarCRM custom RestApi:

class ModuleRestApi extends SugarApi
{
    public function registerApiRest()
    {
        return [
            'moduleLogin' => [
                'reqType' => 'POST',
                'noLoginRequired' => true,
                'path' => [
                    'mymodule', 'login'
                ],
                'method' => 'login'
            ],
        ];
    }
}

Я не могу найти подобное решение в PrestaShop, в presta docs нет ни слова о пользовательских конечных точках, я пытался использовать FrontModuleControllers с дружественными URL-адресами, но, похоже, это не работает для меня, в ответ выдает много вещей, которые для меня это бесполезно, и когда я пытаюсь переопределить метод init (), ему также нужно много чего, чтобы фактически запустить контроллер. Мне нужно простое решение REST, в котором я могу поместить логику для получения данных из моих представлений, передать их в службу CRM и вернуть ответы json на мои представления. Мне больше не нужны шаблоны или рендеринг представлений, просто маршрутизация для общения.

1 Ответ

0 голосов
/ 25 апреля 2018

PrestaShop не поддерживает это из коробки. Однако вы можете сделать это с помощью модуля и передних контроллеров.

Это базовый пример этого.

1. Модуль для регистрации дружественных URL

class RestApiModule extends Module
{
    public function __construct() 
    {
        $this->name = 'restapimodule';
        $this->tab = 'front_office_features';
        $this->version = '1.0';

        parent::__construct();
    }

    public function install() 
    {
        return parent::install() && $this->registerHook('moduleRoutes');
    }

    public function hookModuleRoutes()
    {
        return [
            'module-restapimodule-login' => [
                'rule' => 'restapimodule/login',
                'keywords' => [],
                'controller' => 'login',
                'params' => [
                    'fc' => 'module',
                    'module' => 'restapimodule'
                ] 
            ]              
        ];
    }
}

2. Создать абстрактный REST-контроллер

Создайте абстрактный контроллер, чтобы фактические конечные точки могли расширяться от него. Создайте его в папке модуля controllers, назовите его AbstractRestController.php

abstract class AbstractRestController extends ModuleFrontController
{
    public function init() 
    {
        parent::init();
        switch ($_SERVER['REQUEST_METHOD']) {
            case 'GET':
                $this->processGetRequest();
                break;
            case 'POST':
                $this->processPostRequest();
                break;
            case 'PATCH': // you can also separate these into their own methods
            case 'PUT':
                $this->processPutRequest();
                break;
            case 'DELETE':
                $this->processDeleteRequest();
                break;
            default:
                // throw some error or whatever
        }
    }

    abstract protected function processGetRequest();
    abstract protected function processPostRequest();
    abstract protected function processPutRequest();
    abstract protected function processDeleteRequest();
}

3. Создать актуальный фронт-контроллер

Создайте фронтальный контроллер в папке модуля controllers/front и назовите его login.php.

require_once __DIR__ . '/../AbstractRestController.php';

class RestApiModuleLoginModuleFrontController extends AbstractRestController
{
    protected function processGetRequest()
    {
        // do something then output the result
        $this->ajaxDie(json_encode([
            'success' => true,
            'operation' => 'get'
        ]));
    }

    protected function processPostRequest()
    {
        // do something then output the result
        $this->ajaxDie(json_encode([
            'success' => true,
            'operation' => 'post'
        ]));
    }

    protected function processPutRequest()
    {
        // do something then output the result
        $this->ajaxDie(json_encode([
            'success' => true,
            'operation' => 'put'
        ]));
    }

    protected function processDeleteRequest()
    {
        // do something then output the result
        $this->ajaxDie(json_encode([
            'success' => true,
            'operation' => 'delete'
        ]));
    }
}

Установите модуль, и теперь вы можете нажать http://example.com/restapimodule/login, и в зависимости от типа запроса он будет делать все, что вы хотите, и вы получите ответ JSON.

Чтобы добавить больше конечных точек, добавьте еще одну запись module-restapimodule-endpointname в массив hookModuleRoutes и фронт-контроллер, который простирается от AbstractRestController.

Если вам также нужны правильные коды ответов и т. Д., Вам придется устанавливать заголовки с собственными функциями php, так как PrestaShop afaik не имеет никаких утилит, чтобы сделать это за вас, или использовать какую-то библиотеку.

То же самое относится и к любым другим заголовкам, которые вы можете установить, например content-type (по умолчанию это text/html).

...