jlaso/slim-routing-manager

对 Symfony 路由系统在 SlimFramework 中的近似实现

dev-master 2018-11-14 20:38 UTC

This package is auto-updated.

Last update: 2024-09-15 10:56:33 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

这是对 SlimFramework 的改进,允许以 Symfony2 风格声明路由

如果您想查看真实演示,可以克隆 这个仓库 并运行 composer install

或访问 这篇文章 来查看完整的演示

想法是在前端控制器(通常是 index.php)中拥有这种结构

new RoutingCacheManager(  
  array(  
    'cache'      => __DIR__ . '/cache/routing',  
    'controller' => __DIR__ . '/app/controller',  
  )  
);  

缓存和控制器默认值正好与显示的一样,即上一句话等价于

new RoutingCacheManager();  

并且 'controller' 键可以接受一个路径或路径数组,例如

new RoutingCacheManager(
   array(
      'cache'      => __DIR__ . '/cache/routing',
      'controller' => array(
         __DIR__ . '/app/controller',
         __DIR__ . '/app/subcontroller',
        )
    )
);

显然,'cache' 路径必须对 http/apache 守护进程用户有写权限。

想法是让 RoutingCacheManager 处理路径/路径中存在的 xxxxController 类,并为每个类创建一个 Slim 加载版本。

让我们看看一个例子。

这是 app/controller/FrontendController.php 的内容

    class FrontendController extends Controller
    {
      /**
       * @Route('/')
       * @Name('home.index')
       */
       public function sampleRouteAction()
       {
            /** @var Slim\Slim $slim */
            $slim = $this->getSlim();
            $slim->response()->body('This is the home route ' . $this->getName());
       }
    }

如您所见,注解非常清晰,并清楚地反映了此路由端点意图

问题是 Slim 不理解这种结构,我们需要将其转换为这种格式

$app->map("/", function(){ blah blah blah })->via("GET")->name("home.index");

然后我们的 SlimRoutingManager 处理 FrontendController 类,并创建一个带有 Slim 风味的加载器

$app->map("/", "FrontendController::___sampleRouteAction")->via("GET")->name("home.index");

主控制器类执行魔法,将伪静态方法 __sampleRouteAction 的调用改为正确的方法。