mbezhanov/silex-route-annotations

一个服务提供程序,允许你在 Silex 应用程序中使用 @Route 注解。

0.2.1 2017-07-03 15:48 UTC

This package is auto-updated.

Last update: 2024-09-23 00:20:01 UTC


README

一个服务提供程序,允许你在 Silex 应用程序中使用 @Route 注解,以便直接在你的控制器中定义路由。

安装

通过 Composer 安装库

composer require mbezhanov/silex-route-annotations

注册

要启用 @Route 注解,请将服务提供程序注册到你的应用程序中

<?php 

use Bezhanov\Silex\Routing\RouteAnnotationsProvider;
use Silex\Application;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

$app = new Application();

$app->register(new RouteAnnotationsProvider(), [
    // it is required to specify the full path, where your Controllers reside
    'routing.controller_dir' => __DIR__ . '/../src/App/Controllers',
    // not required, but highly recommended to specify a Cache Adapter, in order to use caching
    'routing.cache_adapter' => new FilesystemAdapter('routing', 0, __DIR__ . '/../var/cache'),
]);

基本用法

将服务提供程序注册到应用程序中允许你在控制器中使用 @Route 注解,与 SensioFrameworkExtraBundle / Symfony 中的注解相同。

<?php

namespace Bezhanov\Silex\Routing\Tests\Fixtures\AnnotatedClasses;

use Bezhanov\Silex\Routing\Route;

/**
 * @Route("/foo")
 */
class FooController
{
    /**
     * @Route("/bar/{lorem}")
     */
    public function barAction($lorem = 'ipsum')
    {
        // ...
    }
}

服务控制器

随着应用程序的增长,你可能会发现自己在使用 Silex 提供的 服务控制器 机制,以便将外部依赖项注入到你的控制器中。在这种情况下,库会为你提供覆盖,因为它允许你通过服务容器直接实例化你的控制器。

<?php

// Service Controller definition:
$app['foo.bar_baz'] = function ($app) {
    return new App\Controller\FooController($app['some_other_service']);
};

// Controller example:

namespace App\Controller;

use Bezhanov\Silex\Routing\Route;
use Symfony\Component\HttpFoundation\Response;

/**
 * @Route(service="foo.bar_baz") 
 */
class FooController
{
    private $service;
    
    public function __construct(SomeOtherService $service)
    {
        $this->service = $service;
    }
    
    /**
     * @Route("/foo")
     */
    public function fooAction()
    {
        $result = $this->service->doSomething();
        return new Response($result, Response::HTTP_OK);
    }
}

你也可以从你的 @Route 声明中完全省略 service 选项,只要你的服务 ID 与从完全限定的类名(FQCN)派生的 ID 匹配,例如:

<?php

$app['app.controller.manufacturer_controller'] = function (Application $app) {
    return new App\Controller\FooController($app['some_other_service']);
};

在此,控制器将通过服务容器自动实例化,你不需要在类级别 @Route 注解中显式指定 service 属性。

贡献

这个库还处于开发的早期阶段。所有贡献都欢迎。在打开 PR 之前,请确保所有测试都通过,并且代码覆盖率令人满意。

phpunit tests --coverage-html coverage