codehouse/highway

此包已被弃用且不再维护。未建议替代包。

基于正则表达式的路由器,具有类似Spring风格的配置(具有依赖注入支持)

1.0 2016-07-27 19:59 UTC

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() { ... }
 
...