kron0s / silex-rest
Silex 的 RestApplicationServiceProvider
Requires
- silex/silex: ~2.0@dev
This package is not auto-updated.
Last update: 2024-09-28 18:00:00 UTC
README
RestApplicationServiceProvider for Silex 为开发者提供了快速创建 REST 应用的能力。
关于转换的说明很少。此提供程序为您提供构建 RESTful 路由更快、更一致的服务。
GET可以用来获取/users下的整个集合或/users/{id}下的单个对象。POST可以用来在/users下插入新的项目。PUT可以用来完全更新/users/{id}下的现有项目。PATCH可以用来部分更新/users/{id}下的现有项目。DELETE可以用来删除/users/{id}下的现有项目。
遗憾的是,没有选项可以自动为 PATCH 操作创建自定义路由,例如 /users/{id}/activate,但您仍然可以通过将此类路由添加到 $app 来手动执行。
此库要求您启用 ServiceControllerServiceProvider,因为我建议您使用类来作为资源控制器的控制器。这样,您可以保持应用程序井井有条,并在 Symfony2 等应用中重用控制器。如果您决定只使用 Silex 保持控制器,您可以使用 ApplicationAwareController,它实现了 disable() 以快速在需要隐藏某些操作时抛出 404,并在需要时将方法调用委托给 $app(由构造函数传入)。
使用 Composer 安装
- 使用 CLI 添加需求:
php composer.phar require mach/silex-rest:dev-master。 - 更新需求:
php composer.phar update mach/silex-rest。
或者,您可以手动添加需求。
{
...
"require": {
...
"mach/silex-rest": "dev-master",
...
},
...
}
用法
注册提供程序
<?php use Silex\Application; use Silex\Provider\ServiceControllerServiceProvider; use Mach\Silex\Rest\Provider\RestApplicationServiceProvider; $app = new Application(); $app->register(new ServiceControllerServiceProvider()); $app->register(new RestApplicationServiceProvider()); // The service is available under $app['rest']
还有一个 trait 可以提供更清晰的用法。
基本用法
注册资源
<?php $res = $app['rest']->resource('/users');
创建集合操作
<?php $res->cget(function(Request $request){ … }); $res->post(function(Request $request){ … });
创建项目操作
<?php $res->get(function(Request $request, $id){ … }); $res->put(function(Request $request, $id){ … }); $res->patch(function(Request $request, $id){ … }); $res->delete(function(Request $request, $id){ … });
添加转换器
您可以使用转换器与项目操作一起使用。这可以帮助您在例如 id 与整个实体之间进行转换。
<?php $res->convert('user', function($user, Request $request){ … });
添加对项目 ID 的约束检查
要检查提供的 ID 是否例如是整数,您可以添加全局资源断言,就像在常规 Silex 路由中一样。
<?php $res->assertId('\d+');
添加 before 和 after 中间件
中间件是特定于操作的,您不能(抱歉)为所有操作定义全局中间件。
<?php $res->before('cget', function(Request $request){ … }); $res->after('post', function(Request $request, Response $response){ … });
控制器类用法
您可以使用现有的服务控制器或当通过 resource() 传递对象时自动注册一个。
使用现有的控制器服务
<?php $app['rest.users.controller'] = $app->share(function($app){ return new UsersController(); }); $app['rest']->resource('/users', 'rest.users.controller');
您的 UsersController 类应该定义 cget、post、get、put、patch 和 delete 方法。稍后我会向您展示如何更改应用程序中的方法名称。
动态创建控制器服务
<?php $app['rest']->resource('/users', new UsersController());
RestApplicationServiceProvider 还能做什么?
子资源
您可以使用子路由来配对资源。例如,如果您在 Users 和 Notes 之间有一个(多对一)关系并使用用户友好的 URL(例如 /users/2/notes/25),则可以创建一个子资源。
<?php $userResource = $app['rest']->resource('/users'); $noteResource = $userResource->subresource('/notes');
将要绑定笔记ID的变量将是 idd。如果你创建一个指向 /notes 的子资源,下一个ID将是 iddd(查看约定?)。但你 可以 修改它。简单来说,将名称作为子资源的第三个参数传递。
<?php $userResource = $app['rest']->resource('/users'); $noteResource = $userResource->subresource('/notes', null, 'nid');
重写控制器类的默认方法名称
在注册提供者时,将变量传递给容器。
<?php $app->register(new RestApplicationServiceProvider(), array( 'rest.methods.cget' => 'all', 'rest.methods.post' => 'create', 'rest.methods.get' => 'read', 'rest.methods.put' => 'update' 'rest.methods.patch' => 'merge' ));
你还可以在调用 resource 和 subresource 之间动态更改所选方法。要更改 GET 项目方法,调用 $app['rest.methods.get'] = 'read'; 这将影响后续(子)资源创建。
许可证
RestApplicationServiceProvider 使用 MIT 许可证授权。