jlaso / slim-routing-manager
对 Symfony 路由系统在 SlimFramework 中的近似实现
dev-master
2018-11-14 20:38 UTC
Requires
- php: >=5.3.0
- slim/slim: 2.2.0
This package is auto-updated.
Last update: 2024-09-15 10:56:33 UTC
README
这是对 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 的调用改为正确的方法。