amstaffix / extjs-bundle
使用 ExtJs 与 Symfony 2
Requires
- php: ~5.4
- doctrine/doctrine-bundle: ~1.0
- doctrine/orm: ^2.2.3
- friendsofsymfony/rest-bundle: ~1.0
- incenteev/composer-parameter-handler: ~2.0
- jms/di-extra-bundle: ~1.4
- jms/serializer: ~1.0
- jms/serializer-bundle: ~1.0
- sensio/generator-bundle: ~2.3, <2.5.0
- symfony/framework-bundle: ~2.3
- symfony/twig-bundle: ~2.3
Requires (Dev)
- doctrine/mongodb-odm: ~1.0
- doctrine/mongodb-odm-bundle: ~3.0
- symfony/symfony: ~2.3
This package is not auto-updated.
Last update: 2021-07-10 02:05:34 UTC
README
使用 ExtJs 与 Symfony 2
Packagist: https://packagist.org.cn/packages/amstaffix/extjs-bundle
本扩展的目标是简化 Symfony 2 与 ExtJS 客户端框架之间的集成。它支持
- 基于服务器端实体/模型的 Ext.data.Model 的动态运行时生成。
- 自动集成 Ext Remoting 与 Symfony 2 控制器。
- 根据实体生成 Rest 控制器代码,支持 GET、POST、PUT、PATCH 和 DELETE。
需求
强制
- Symfony ~2.3
- JMS 序列化库 ~1.0
- Doctrine ORM 或 ODM
- Sensio 生成器 ~2.3
可选
- Rest 控制器代码生成需要 FOSRestBundle ~1.0
安装
使用 composer
$ composer require amstaffix/extjs-bundle
启用扩展
<?php // app/AppKernel.php public function registerBundles() { $bundles = array( // ... new JMS\SerializerBundle\JMSSerializerBundle(), new \Tpg\ExtjsBundle\TpgExtjsBundle(), ); }
添加路由规则
# app/config/routing.yml tpg_extjs: resource: "@TpgExtjsBundle/Resources/config/routing.yml" prefix: /extjs
以下所有文档假设所有 ExtJs 控制器路径都以 /extjs 为前缀。
配置
tpg_extjs: entities: - @AcmeDemoBundle/Entity/ - @AcmeDemoBundle/Model/Auto remoting: bundles: - AcmeDemoBundle
测试运行
单元测试使用 PHPUnit 和 Jasmine JS 编写。如何运行单元测试在 .travis.yml 文件中。
模型/实体代码生成
您可能需要配置额外的路由规则才能使此功能正常工作。要生成 Ext.data.Model 代码,只需包含指向 generateModel.js 的脚本标签即可。
要生成配置中配置的所有实体和文档,
<script type="text/javascript" src="/extjs/generateModel.js"></script>
要生成一些特定的实体,
<script type="text/javascript" src="/extjs/generateModel.js?model[]=Acme.DemoBundle.Entity.Person&model[]=Test.TestBundle.Model.Book"></script>
Acme.DemoBundle.Entity.Person 和 Test.TestBundle.Model.Book 是模型的完整命名空间,只需将斜杠 () 替换为点 (.) 即可。
实体类必须使用 Tpg\ExtjsBundle\Annotation\Model 注解,请查看 Tpg/ExtjsBundle/Tests/Fixtures/Test/TestBundle/Model/*.php 以获取示例用法。
有一个 Twig 扩展 (extjs_model) 可以轻松地将模型包含/加载到当前页面。
要生成并注入当前页面的 ExtJS 代码,
{{ extjs_model(true, 'Acme.DemoBundle.Entity.Person', 'Test.TestBundle.Model.Book') }}
要通过脚本标签引用和加载 ExtJS 代码,
{{ extjs_model(false, 'Acme.DemoBundle.Entity.Person', 'Test.TestBundle.Model.Book') }}
远程集成
您需要配置远程参数以使 ExtJs Remoting 与控制器一起工作。
要生成页面上的远程集成粘合剂,只需包含
<script type="text/javascript" src="/extjs/remoteapi.js"></script>
要使控制器的操作可远程调用,需要使用 Tpg\ExtjsBundle\Annotation\Direct 注解该函数。
如果控制器参数期望 Symfony\Component\HttpFoundation\Request 对象,则需要使用单个参数调用远程 API。您需要将参数包装在数组中。
public function testRequestParamAction(Symfony\Component\HttpFoundation\Request $request) { $idResult = $request->query->get("id"); $nameResult = $request->query->get("name"); }
$idResult 将包含 12,$nameResult 将包含 "EFG"。
要调用该远程 API,您需要使用。
Test.testRequestParam({"id":12, "name":"EFG"});
Rest 控制器代码生成
Rest 控制器代码生成是 Sensio 控制器生成器的一个扩展。生成的控制器将扩展 FOS\RestBundle\Controller\FOSRestController 类。
您需要启用以下组件。
new \JMS\SerializerBundle\JMSSerializerBundle(), new \FOS\RestBundle\FOSRestBundle(),
同时,您还需要确保以下 fos_rest 的配置。
fos_rest: service: serializer: tpg_extjs.serializer routing_loader: default_format: json param_fetcher_listener: true
生成的控制器在序列化和反序列化过程中为 JMS 序列化器上下文设置不同的组。
- get:在 GET、POST、PUT、PATCH 动作期间对单个实体进行序列化。
- list:在 GET 动作期间对实体列表进行序列化。
- post:在 POST 动作期间对单个实体进行反序列化。
- put:在 PUT 动作期间对单个实体进行反序列化。
- patch:在 PATCH 动作期间对单个实体进行反序列化。
例如,
为了为实体 Acme.DemoBundle.Entity.Person 生成一个 REST 控制器(PeopleController),
php app/console generate:rest:controller --controller AcmeDemoBundle:People --entity AcmeDemoBundle:Person
实体中的属性需要指定 JMS 类型以使反序列化生效。
只需要控制器和实体选项即可,所有其他选项都可以保留为默认值。生成器将创建/更新 2 个文件,
- 将生成 Acme\DemoBundle\Controller\PeopleControler。
- 将更新或创建 Acme\DemoBundle\Resources\config\routing.rest.yml。
要将生成的 REST 控制器包含到路由表中,只需包含
# app/config/routing.yml acmedemo_api_rest: resource: "@AcemeDemoBundle/Resources/config/routing.rest.yml" prefix: /api type: rest
使用 generate:rest:controller 并带 --trait 选项支持 PHP 5.4 特性,生成器将为您生成 2 个类,
- 特质控制器类
- 实际控制器类
将生成的代码和您自定义的控制器实现分开。这将允许您在不影响自定义实现的情况下重新生成控制器。
在 Symfony 中将 ExtJS Rest Proxy 与 Rest 控制器连接
为了在 extjs 模型中指定 rest 代理,您需要
// in file Acme\TestBundle\Entity\Car.php /** * @Extjs\Model * @Extjs\ModelProxy("/api/cars") * @ORM\Entity * @ORM\Table(name="car") */ class Car { ...