kron0s/silex-rest

Silex 的 RestApplicationServiceProvider

dev-master / 1.0.x-dev 2015-05-15 08:55 UTC

This package is not auto-updated.

Last update: 2024-09-28 18:00:00 UTC


README

Build Status

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 安装

  1. 使用 CLI 添加需求:php composer.phar require mach/silex-rest:dev-master
  2. 更新需求: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+');

添加 beforeafter 中间件

中间件是特定于操作的,您不能(抱歉)为所有操作定义全局中间件。

<?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 类应该定义 cgetpostgetputpatchdelete 方法。稍后我会向您展示如何更改应用程序中的方法名称。

动态创建控制器服务

<?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'
));

你还可以在调用 resourcesubresource 之间动态更改所选方法。要更改 GET 项目方法,调用 $app['rest.methods.get'] = 'read'; 这将影响后续(子)资源创建。

许可证

RestApplicationServiceProvider 使用 MIT 许可证授权。