warmans / silex-rest-provider
基于Silex的REST资源生成的基本库,使用极简配置。部分基于mach/silex-rest。
Requires
- php: >=5.4.0
- silex/silex: ~2.0@dev
Requires (Dev)
- phpunit/phpunit: 4.1.*
- squizlabs/php_codesniffer: 1.*
This package is not auto-updated.
Last update: 2024-09-24 03:44:02 UTC
README
提供者,用于简化/标准化基于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
开头,然后使用资源层次结构的完整路径,例如在子资源部分定义的配置将注册
- rest.ctl.api.v1.foo
- rest.ctl.api.v1.foo.bar
等等。