mach/silex-rest

Silex 的 RestApplicationServiceProvider

2.0 2015-08-22 00:15 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:18:08 UTC


README

Build Status

RestApplicationServiceProvider for Silex 为开发者提供了快速创建 REST 应用程序的能力。

关于转换的说明很少。此提供程序为您提供了一种服务,可以更快、更一致地构建整个应用程序中的 RESTful 路由。虽然您可以创建 GETPOSTPUTPATCHDELETE 动作,但并非所有动作都可以用于单个项目或集合。端点应定义为项目类型的复数名称,例如 /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 进行安装

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

添加 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 还能做什么?

子资源

您可以使用子路由将资源一起配对。例如,如果您有用户和笔记(一对一)之间的关系,并使用用户友好的 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 许可证下授权。