Installation:
composer require asiragusa/extjs-bundle
Ensure JMS\SerializerBundle and Tpg\ExtjsBundle are registered in AppKernel.php.
Basic Configuration (config.yml):
tpg_extjs:
entities:
- "@YourBundle/Entity/"
remoting:
bundles:
- YourBundle
Routing (routing.yml):
tpg_extjs:
resource: "@TpgExtjsBundle/Resources/config/routing.yml"
prefix: /extjs
First Use Case:
@Tpg\ExtjsBundle\Annotation\Model (e.g., Acme\DemoBundle\Entity\Person).{{ extjs_model(true, 'Acme.DemoBundle.Entity.Person') }}
Workflow:
@Model and optionally @ModelProxy (e.g., @ModelProxy("/api/persons")).generateModel.js in your layout or template:
<script src="{{ asset('/extjs/generateModel.js') }}"></script>
Integration Tips:
extjs_model() to dynamically inject models:
{{ extjs_model(false, 'Acme.DemoBundle.Entity.Person') }} {# Script tag #}
{{ extjs_model(true, ['Acme.DemoBundle.Entity.Person', 'Acme.DemoBundle.Entity.Book']) }}
Workflow:
@Direct:
use Tpg\ExtjsBundle\Annotation\Direct;
class PersonController extends Controller {
/**
* @Direct
*/
public function getPersonAction($id) { ... }
}
remoteapi.js in your template:
<script src="{{ asset('/extjs/remoteapi.js') }}"></script>
App.PersonController.getPerson({ id: 123 });
Handling Request Objects:
Request $request, wrap parameters in an array:
App.TestController.testRequestParam({ id: 12, name: "EFG" });
Workflow:
php app/console generate:rest:controller --controller YourBundle:Person --entity YourBundle:Person
fos_rest in config.yml:
fos_rest:
service:
serializer: tpg_extjs.serializer
routing_loader:
default_format: json
routing.yml:
your_api:
resource: "@YourBundle/Resources/config/routing.rest.yml"
prefix: /api
type: rest
Trait Support (PHP 5.4+):
--trait flag to separate generated code from custom logic:
php app/console generate:rest:controller --controller YourBundle:Person --entity YourBundle:Person --trait
PersonControllerTrait (generated code).PersonController (your custom implementation extending the trait).Serializer Configuration:
Type annotations for deserialization to work (e.g., @Type("string")).use JMS\Serializer\Annotation as Serializer;
class Person {
/**
* @Serializer\Type("string")
*/
private $name;
}
Routing Conflicts:
/extjs to avoid conflicts with other bundles./extjs/generateModel.js instead of /generateModel.js.FOSRestBundle Dependency:
FOSRestBundle (≥0.12). If missing, use the --no-rest flag or install it first:
composer require friendsofsymfony/rest-bundle
Model Proxy Paths:
@ModelProxy paths match your API routes (e.g., @ModelProxy("/api/persons") must align with routing.rest.yml).Generated Model Issues:
generateModel.js. Common causes:
@Model annotation on entities.. instead of slashes / in Twig calls).tpg_extjs.entities config.Remoting Failures:
@Direct actions fail, ensure:
Request objects.remoteapi.js script is loaded before ExtJS calls.REST Controller Debugging:
/api/persons) to isolate issues.fos_rest logs for serialization/deserialization errors.Partial Model Generation:
{{ extjs_model(true, 'Acme.DemoBundle.Entity.Person') }}
Caching Models:
Ext.define with static configurations for critical models.Extending Remoting:
remoteapi.js to add global remoting logic (e.g., auth headers):
Ext.Ajax.defaultHeaders = {
'X-Auth-Token': 'your_token'
};
PHP 5.4 Traits:
php app/console generate:rest:controller --controller YourBundle:Person --trait
class PersonController extends FOSRestController {
use PersonControllerTrait;
public function customAction() { ... }
}
Testing:
generateModel.js responses in tests to avoid server dependencies.How can I help you explore Laravel packages today?