ddesrosiers/silex-annotation-provider

Silex 服务提供程序,允许在 ServiceControllers 中使用注解。

v3.0.0 2018-12-03 03:00 UTC

This package is auto-updated.

Last update: 2024-08-29 04:08:58 UTC


README

Latest Stable Version Build Status Total Downloads License Scrutinizer Code Quality

silex-annotation-provider

Silex ServiceProvider,允许在 Silex 控制器中使用注解。在类中定义您的控制器,并使用注解来设置路由和定义修饰符。

v3 版本中的更改

  • 重新设计注解格式。不再使用 Doctrine Annotations。
  • 使用 PSR-16 缓存代替 Doctrine Cache。
  • 简化功能集。为简化起见,移除了对 ServiceProviders、自定义 Service Controller 注册以及其他不常见自定义选项的支持。
  • 最低 PHP 版本为 7.1。不支持 HHVM。

安装

使用 composer 安装 silex-annotation-provider。

{
    "require": {
        "ddesrosiers/silex-annotation-provider": "~3.0"
    }
}

注册

$app->register(new DDesrosiers\SilexAnnotations\AnnotationServiceProvider(), array(
    "annot.cache" => new MyPsr16Cache(),
    "annot.controllerDir" => "$srcDir/Controller",
    "annot.controllers" => [
        MyClass1::class,
        MyClass2::class
    ]
));

参数

annot.controllerDir

指定搜索控制器的目录。该目录将递归搜索具有 @Controller 注解的类。找到的控制类将根据路由注解进行处理。必须指定此选项或 annot.controllers 以定位控制器。

annot.controllers

完全限定控制器名称的数组。如果设置,提供程序将自动将每个控制器注册为 ServiceController,并根据找到的注解设置路由和修饰符。

annot.cache

实现了 Psr\SimpleCache\CacheInterface 的类的实例。此缓存用于缓存注解和控制器列表以提高性能。

更快的控制器注册

Silex 必须在每次请求时注册您的应用程序中的每个端点。如果您有很多端点,那么这可能会在每个请求上产生显著的开销。Silex Annotations 可以通过使用 prefixController 注解上过滤需要注册的控制器来提高此性能。只有在前缀与 URI 匹配时,我们才需要在 Controller 中注册端点。这样,Silex Annotations 允许比纯 Silex 更快的路由。

注解控制器

创建您的控制器。以下是一个示例,演示了使用注解注册端点的方法。

namespace DDesrosiers\Controller;

use Symfony\Component\HttpFoundation\Response;

/**
 * @Controller(
 *     prefix => test
 *     after => \DDesrosiers\Controller\TestController::converter
 *     host => www.test.com
 *     requireHttp
 *     secure => ADMIN
 * )
 */
class TestController
{
    /**
     * @Route(
     *     uri => GET test/{var}
     *     assert => var, \d+
     *     convert => var, \DDesrosiers\Controller\TestController::converter
     *     after => \DDesrosiers\Controller\TestController::converter
     *     host => www.test.com
     *     requireHttps
     *     secure => DEV
     *     value => var, default
     * )
     */
    public function testMethod($var)
    {
        return new Response("test Method: $var");
    }

    public static function converter($var)
    {
        return $var;
    }
}

我们的 TestController 中的注解解释如下

$controllerCollection = $app['controller_factory']
    ->after('\DDesrosiers\Controller\TestController::converter');
    ->host('www.test.com');
    ->requireHttp();
    ->secure('ADMIN');
$controllerCollection->get("test/{var}", "\\DDesrosiers\\Controller\\TestController:testMethod")
    ->assert('var', '\d+')
    ->convert('var', "\\DDesrosiers\\Controller\\TestController::converter");
    ->host('www.test.com')
    ->requireHttps()
    ->secure('DEV')
    ->value('var', 'default');
$app->mount('/prefix', $controllerCollection);

注解

控制器

使用 @Controller 注解标记一个类为控制器。'prefix' 选项定义了控制器集合的挂载点。前缀必须是第一个选项。

@Route

使用 @Route 注解定义一个端点。'uri' 是必需的,并且必须是第一个定义的选项。

简写注解表示法

在控制器注解中,如果不需要 'prefix' 选项,则可以省略 'prefix' 键。

在路由注解中,如果不需要 'uri' 选项,则可以省略 'uri' 键。

   namespace DDesrosiers\Controller;
   
   use Symfony\Component\HttpFoundation\Response;
   
   /**
    * @Controller(test)
    */
   class TestController
   {
       /**
        * @Route(GET test/{var})
        */
       public function testMethod($var)
       {
           return new Response("test Method: $var");
       }
   }