danielbragaalmeida / extdirect
An PHP implementation of the Ext Direct Specification
Installs: 29
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
pkg:composer/danielbragaalmeida/extdirect
Requires
- php: >=5.6
- doctrine/cache: ^1.7
- neomerx/cors-psr7: ^1.0
- nette/reflection: ^2.4.2
- zendframework/zend-diactoros: ^1.4
- zendframework/zend-stratigility: ^2.0.1
This package is not auto-updated.
Last update: 2025-10-19 14:05:21 UTC
README
An PHP implementation of the Sencha Ext Direct Specification
This project has some code from J. Bruni (ExtDirect.php)
Install
composer require danielbragaalmeida/extdirect
How to Use
PHP
config.php
<?php
return [
    'discoverer' => [
        'paths' => [ // Directories of your classes
            __DIR__ . '/src', 
        ]
    ],
    'cache' => [
        'directory' => __DIR__ . '/cache',
        'lifetime' => 60,
    ],
    'api' => [
        'descriptor' => 'window.uERP_REMOTING_API',
        'declaration' => [
            'url' => 'http://api.myadomain.com/router.php', // Your router may be in another domain
            'type' => 'remoting',
            'id' => 'uERP', // it's required for the cache mechanism
            'namespace' => 'Ext.php',
            'timeout' => null,
        ]
    ]
];
Sample class src/Server.php
<?php
namespace Util;
/**
 * Class Server
 *
 * @ExtDirect
 * @ExtDirect\Alias UtilServer
 */
class Server
{
    /**
     * @param $format
     * @return bool|string
     * @ExtDirect
     */
    public function date($format)
    {
        return date($format);
    }
    /**
     *
     * @return string
     * @ExtDirect
     */
    public function hostname()
    {
        return gethostname();
    }
}
api.php
<?php
require_once __DIR__ . '/../vendor/autoload.php';
$config = new ExtDirect\Config(include 'config.php');
$discoverer = new ExtDirect\Discoverer($config);
$discoverer->start();
router.php
<?php
require_once __DIR__ . '/../vendor/autoload.php';
$config = new ExtDirect\Config(include 'config.php');
$discoverer = new ExtDirect\Router($config);
$discoverer->route();
HTML
<-- API in same domain -->
<script type="text/javascript" src="api.php"></script>
<-- API in another domain -->
<script type="text/javascript" src="http://api.mydomain.com/api.php"></script>
JavaScript:
Here, you can call actions/methods from your API. If you exposed the Util\Server (alias UtilServer) class and the date method, You must
class the API as follows:
Ext.Direct.addProvider(window.uERP_REMOTING_API); // window.uERP_REMOTING_API is your descriptor
Ext.php.UtilServer.date('Y-m-d', function(result) {
    alert('Server date is ' + result); 
});
Features
- 
Configure once, work everywhere. You configure the path where your classes resides, not which classes you will expose. 
- 
Use of Annotations to easily determine which classes and methods are exposed. All classes with @ExtDirectwill be inspected for methods that can be exposed (only methods com@ExtDirectwill be exposed).
- 
Cache mechanism. Your API classes/methods will be cached to avoid overloading the discovery process. You can configure the cache lifetime. 
Configuration
An array with the following structure:
- discovery
- paths array
 
- paths 
- cache array- directory string
- lifetime int
 
- directory 
- api
- descriptor string
- declaration
- url string
- type string
- id string
- namespace string
- timeout int
 
- url 
 
- descriptor 
Discovery config
discovery.paths: An array with paths to your classes.
<?php
...
'discoverer' => [
    'paths' => [
        __DIR__ . '/../src',
        __DIR__ . '/../lib',
    ]
],
...
cache.directory: The directory that will be used to store the cached data.
cache.lifetime: The cache lifetime, in seconds.
<?php
...
'cache' => [
    'directory' => __DIR__ . '/../cache',
    'lifetime' => 60,
],
...
API config
api.descriptor: The JavaScript variable which will receive the API declaration.
api.declaration.url: The Service URI for this API.
api.declaration.type: MUST be either remoting for Remoting API, or polling for Polling API.
api.declaration.id: The identifier for the Remoting API Provider. This is useful when there are more than one API in use. Cache mechanism require it.
api.declaration.namespace: The Namespace for the given Remoting API.
api.declaration.timeout: The number of milliseconds to use as the timeout for every Method invocation in this Remoting API. (not implemented)