mach / silex-rest
Silex 的 RestApplicationServiceProvider
Requires
- silex/silex: ~2.0@dev
This package is not auto-updated.
Last update: 2024-09-14 13:18:08 UTC
README
RestApplicationServiceProvider for Silex 为开发者提供了快速创建 REST 应用程序的能力。
关于转换的说明很少。此提供程序为您提供了一种服务,可以更快、更一致地构建整个应用程序中的 RESTful 路由。虽然您可以创建 GET
、POST
、PUT
、PATCH
和 DELETE
动作,但并非所有动作都可以用于单个项目或集合。端点应定义为项目类型的复数名称,例如 /users
(但您不受提供程序的限制,可以使用您喜欢的任何约定)。
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:~1.0"
。 - 更新需求:
php composer.phar update mach/silex-rest
。
或者,您可以手动添加需求
{ ... "require": { ... "mach/silex-rest": "~1.0", ... }, ... }
使用方法
注册提供程序
<?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 还能做什么?
子资源
您可以使用子路由将资源一起配对。例如,如果您有用户和笔记(一对一)之间的关系,并使用用户友好的 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 许可证下授权。