Extjs 通过 Ext.Direct 实现与 Laravel 通信

软件版本要求

Laravel:5.1 至 5.3
Extjs:4.1 至 6.2

参考资料

Ext Direct RPC 协议规格:http://docs.sencha.com/extjs/6.2.0/guides/...
PHP 实现 Ext Direct 服务器端范例:http://docs.sencha.com/extjs/6.2.0/guides/...
Ext Direct 服务器端清单:https://www.sencha.com/forum/showthread.ph...
laravel 作为 Ext Direct 服务器端(bulforce/ext-direct):https://www.sencha.com/forum/showthread.ph...

环境设置

为laravel项目添加 ext-direct 包

通过查询 http://packalyst.com/packages/tag/extjs 和 Github,lucasromanojf/ext-direct 可用于 laravel 5.1至5.3, bulforce/ext-direct 只可用于 laravel 4,故选择 lucasromanojf/ext-direct。

composer require lucasromanojf/ext-direct

添加路由

laravel 5.1、5.2 在 ...\laravel_project\app\Http\routes.php 添加, laravel 5.3 在 ...\laravel_project\routes\web.php 添加:

use Bulforce\ExtDirect\ExtDirect;
Route::any('rpc', function() {
    return ExtDirect::provide();
});

添加类及方法

<?php
namespace App\Http\Controllers;
class ItemExternalController extends Controller
{
    /**
     * @direct
     */
    public function getServerDate($params) {
        return date($params);
    }
}

前端页面

...\laravel_project\public 文件夹添加 extdirecttest.html 文件:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>laravel ext.direct test</title>
    <script type="text/javascript" src="ext4.1-all.js"></script>
    <script type="text/javascript" src="rpc?javascript"></script>
    <script type="text/javascript" >
        Ext.onReady(function () {
            console.log("AAAAA:Ext.onReady");
            Ext.rpc.ExternalItems.getServerDate("Y-m-d H:i:s", function (response) {
                console.log("CCCCC:" + response);
            });
        })
    </script>
</head>
<body>
<h1>laravel ext.direct test</h1>
</body>
</html>

编辑配置文件

将 ...\laravel_project\app\vendor\lucasromanojf\ext-direct\src\config\Bulforce 文件夹 复制到 ...\laravel_project\app\config 下;编辑 ...\laravel_project\config\Bulforce\ext-direct\config.php 文件:

<?php
return array(
    'namespace' => 'Ext.rpc',
    'descriptor' => 'Ext.rpc.REMOTING_API',
    'debug' => false,
    'timeout' => 1000, // 默认为30,应增大
    'url' => 'rpc',
    'api_classes' => array(
        'ExternalItems' => 'App\Http\Controllers\ItemExternalController' // 应为完整path,否则报错
    )
);

访问 http://127.8.8.8:9898/extdirecttest.html ,客户端 Extjs 调用 服务端 App\Http\Controllers\ItemExternalController 类的方法 getServerDate() 获取服务器时间,从客户端控制台输出。
file

填坑

...\laravel_project\config\Bulforce\ext-direct\config.php 文件中 timeout 就是 lucasromanojf/ext-direct 的坑。
其默认值为 30,如不修改,在本地开发环境 chrome 里面 js 提示 『Provisional headers are shown』 错误:
file
百度查询:
http://stackoverflow.com/questions/2117738...
http://blog.csdn.net/wyfhist/article/detai...
主要原因是服务端超时(被墙、数据库查询慢)导致,因此通过增加 timeout 时间解决;另外:代码注释中 timeout 单位为 second ,实际应为 millisecond。
file

结论

Ext Direct 是 RPC 协议,与平台、语言无关。
Laravel 与 Extjs 通过 Ext.Direct 结合使用文章较少,是因为有其他更好方式?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
颜⑧

也在看Extjs ,很好的案例

6年前 评论

@颜⑧,laravel 程序员中使用 extjs 的看来比较少

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!