warmans/silex-rest-provider

此软件包的最新版本(2.0.0)没有可用的许可证信息。

基于Silex的REST资源生成的基本库,使用极简配置。部分基于mach/silex-rest。

2.0.0 2014-11-25 12:09 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:44:02 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

提供者,用于简化/标准化基于mach/silex-rest的Silex中REST API资源的生成。

关于版本的注意事项

2.0.0以下版本支持Silex 1.x,而2.0.0及以上版本支持silex 2.0@dev。2.0.0版本将无法与silex 1.2兼容。

问题

使用mach的rest提供者,您可以这样定义您的API:

$app['some.controller'] = function() {
    return new \Some\Controller();
}

$app['some.controller.2'] = function() {
    return new \Some\Controller();
}

$app['some.controller.3'] = function() {
    return new \Some\Controller();
}

$app['some.controller.4'] = function() {
    return new \Some\Controller();
}

$r1 = $app['rest']->resource('foo', 'some.controller'); // /foo
$r2 = $r1->subresource('bar', 'some.controller.2');     // /foo/0/bar
$r3 = $r2->subresource('baz', 'some.controller.3');     // /foo/0/bar/0/baz
$r4 = $r2->subresource('baz-alt', 'some.controller.4'); // /foo/0/bar/0/baz-alt

如果资源集很小,这样是可以的,但随着API的增长,您会变得有些混乱。删除资源也可能引起问题,因为您必须找到工厂,并解开要删除的资源的相关资源。

解决方案

基于配置数组生成API,并允许内联控制器工厂定义。

API的定义如下:

$resources = [[
    'uri' => 'foo',
    'ctl' => function() { return new \Some\Controller(); },
    'sub' => [[
        'uri' => 'bar',
        'ctl' => function() { return new \Some\Controller(); },
        'sub' => [[
            'uri' => 'baz',
            'ctl' => function() { return new \Some\Controller(); },
        ],[
            'uri' => 'baz-alt',
            'ctl' => function() { return new \Some\Controller(); },
        ]]
    ]]
]];

$app['rest']->importApi($resources);

内部将注册所有控制器,然后为HTTP动词设置路由。

安装

使用composer安装,然后在您的应用程序中注册提供者

$app->register(new \SilexProvier\Rest\Provider\RestServiceProvider($app));

资源

至少一个资源必须具有以下元素

[
    'uri' => '/api/v1/foo',
    'ctl' => function() { return new \Some\Controller(); }
]

URI定义资源的URI段,控制器定义一个工厂,该工厂将生成用于处理该段请求的控制器。

控制器类必须实现您想要实现的HTTP动词的公共方法。

请注意,配置的根和每个子资源都是资源数组,因此即使只有一个根资源,也必须将其包装在数组中,如下所示

$myApi = [[
    'uri' => '/api/v1/foo',
    'ctl' => function() { return new \Some\Controller(); }
]];

子资源

子资源可以定义为以下形式

[
    'uri' => '/api/v1/foo',
    'ctl' => function() { return new \Some\Controller(); },
    'sub' => [[
        'uri' => 'bar',
        'ctl' => function() { return new \Some\Controller(); },
    ]]
]

对于层次结构中每个额外的子资源,都会将一个额外的id属性传递给控制器操作。这些名称依次为id、idd、iddd、idddd等,直到存在多少个子资源。

根据上述示例,对GET /api/v1/foo/1/bar/2的调用将调用等价的\Some\Controller::get(1, 2),因此\Some\Controller应该将get方法定义为get($id, $idd)

同样,对GET /api/v1/foo/1/bar的调用将调用\Some\Controller::cget(1)

关于控制器的一些附加信息

如果您不想内联定义工厂,只需将ctl分配给现有服务的名称,例如

'ctl' => 'my.registered.controller'

如果您想访问之前内联定义的控制器,其名称将以rest.ctl开头,然后使用资源层次结构的完整路径,例如在子资源部分定义的配置将注册

  1. rest.ctl.api.v1.foo
  2. rest.ctl.api.v1.foo.bar

等等。