Prestashop-我的模块的REST端点

mac*_*y_b 2 php rest module prestashop

我正在开发Prestashop模块,它将导出客户数据和订单,它将包含用于客户同步,购物车和订单事件的挂钩-通常该模块将与类似CRM的服务集成。

我的模块包含它自己的视图,这些视图是在vue.js中制作的-单页,异步。有注册,登录,设置等页面。与后端的通信是通过{baseUrl} / mymodule / actionname路由上的GET / POST请求以及vue视图所依赖的简单json响应进行的。我只需要为我的模块创建REST端点,就像下面的示例一样。

WordPress自定义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' ),
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

SugarCRM自定义RestApi:

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

我在PrestaShop中找不到类似的解决方案,在presta文档中没有关于自定义终结点的字词,我尝试将FrontModuleControllers与友好的url一起使用,但它似乎对我不起作用,它抛出了很多东西,对此响应毫无用处我,当我尝试覆盖init()方法时,它也需要很多东西才能真正启动控制器。我需要简单的REST解决方案,可以在其中放置用于从视图中接收数据的逻辑,将其传递给CRM服务,并将json响应返回给视图。我不需要更多的模板或视图渲染,只需路由即可进行累积。

The*_*rot 5

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'
                ] 
            ]              
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

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'
        ]));
    }
}
Run Code Online (Sandbox Code Playgroud)

安装模块,现在您可以点击了http://example.com/restapimodule/login,根据请求的类型,它会做您想做的任何事情,然后您会得到JSON响应。

要添加更多端点,请module-restapimodule-endpointnamehookModuleRoutes数组中添加另一个条目,并从扩展一个前端控制器AbstractRestController

如果您还需要适当的响应代码等,则必须使用本机php函数设置标头,因为PrestaShop afaik没有任何实用程序可以为您执行此操作或使用某种库。

您可能要设置的其他任何标头也是如此content-type(默认情况下为text/html)。