codehouse / highway
此包已被弃用且不再维护。未建议替代包。
基于正则表达式的路由器,具有类似Spring风格的配置(具有依赖注入支持)
1.0
2016-07-27 19:59 UTC
Requires
- doctrine/common: 2.*
- phroute/phroute: v2.1.0
This package is not auto-updated.
Last update: 2022-10-29 09:08:24 UTC
README
#Highway 该库是 mrjgreen/phroute 路由库的包装。增加的功能如下
- 基于注解的控制器(@Controller)配置
- 基于注解的请求映射(@RequestMapping)配置
- 基于注解的保护内容(@Security)配置
- 依赖注入支持
初始化
基本
为了使系统正常运行,请将以下内容放入您的 index.php 中(假设您的控制器位于 /src/Controller 文件夹中,并使用 Controller 命名空间)
$router = new CodeHouse\Highway\Router(__DIR__ . '/src/Controller', 'Controller'); echo $router->serve($_SERVER['REQUEST_METHOD'], parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
依赖注入
为了使用依赖注入,在初始化路由器之后,初始化 DI 容器并将它传递给 Highway 实例
$builder = new \DI\ContainerBuilder(); $builder->useAnnotations(true); $router->setDiContainer($builder->build());
安全
如果您需要使用基于角色的授权,您必须将安全处理器传递给 Highway 路由器实例。安全处理器定义了当路由器找到 @Security 注解时调用的方法。一个示例安全处理器如下所示
class SecurityHandler { public static function admin() { $auth = new \Services\Authentication(); if ($auth->getLoggedInUserRole() != UserRoles::ADMIN) { throw new InvalidRoleException('Role needed: ' . UserRoles::ADMIN . ', Role found: ' . $auth->getLoggedInUserRole()); } } }
它检查用户是否有管理员角色,如果没有,则抛出 InvalidRoleException!当用户尝试访问带有 @Security 注解的方法,并且注解具有角色值 "admin" 时,此方法将被调用。
配置路由器以使用处理器非常简单
$router = new CodeHouse\Highway\Router(__DIR__ . '/src/Controller', 'Controller', new SecurityHandler()); echo $router->serve($_SERVER['REQUEST_METHOD'], parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
注解
控制器
此注解是库的标识。只有当类带有 @Controller 注解时,才会扫描其他注解!
use \CodeHouse\Highway\Annotations as Highway; /** * @Highway\Controller */ class SomeController { .. }
请求映射
此注解用于方法,以指示指向此当前方法的 URL。请注意,您只能使用每个 URL 和方法一次。
use \CodeHouse\Highway\Annotations as Highway; ... /** * @Highway\RequestMapping(value="/users", method="get") */ public function listUsers() { ... } ...
请注意,方法名在这里并不重要。当用户导航到 [服务器]/users 时,将提供 listUsers() 的返回值!
您还可以使用动态 URL。从 mrjgreen 的页面了解更多信息!
安全
如果您必须限制对某些方法的访问,则使用 @Security 标签。
use \CodeHouse\Highway\Annotations as Highway; ... /** * @Highway\Security(role="admin") */ public function adminOnlyMethod() { ... } ...