0

作为这个问题的序言,我正在转换一个演示应用程序以利用 RESTful、SEO 友好的 URL;除了用于 AJAX 请求的两条路由之一之外,每条路由在 Web 上的应用程序中使用时都可以正常工作,并且所有路由都已使用 Postman 进行了完全测试 - 使用普通 Nginx 配置。

话虽如此,这里是有问题的路由定义 - 登录是失败的定义路由:

$routing_map->post('login.read', '/services/authentication/login', [
    'params' => [
        'values' => [
            'controller' => '\Infraweb\Toolkit\Services\Authentication',
            'action' => 'login',
        ]
    ]
])->accepts([
    'application/json',
]);

$routing_map->get('logout.read', '/services/authentication/logout', [
    'params' => [
        'values' => [
            'controller' => '\Infraweb\Toolkit\Services\Authentication',
            'action' => 'logout',
        ]
    ]
])->accepts([
    'application/json',
]);

使用 Postman 和 xdebug 跟踪,我想我看到它(显然)没有通过我认为是路径规则中的正则表达式检查,但我无法完全理解。至少可以说令人沮丧。在发帖之前,我查看了所有可以使用网络搜索的地方——Auraphp 的 Google 组这些天似乎没有太多流量。很可能我做错了什么,所以我想是时候向集体用户社区寻求方向了。非常欢迎和赞赏任何和所有建设性的批评。

提前感谢,并为在这个问题上浪费任何人的带宽而道歉......

4

1 回答 1

0

让我说清楚一点。Aura.Router 不进行调度。它只匹配路线。它不处理您的路线的处理方式。

查看完整的工作示例(在该示例中,处理程序被假定为可调用的)

$callable = $route->handler;
$response = $callable($request);

在您的情况下,如果您匹配请求(请参阅匹配请求

$matcher = $routerContainer->getMatcher();
$route = $matcher->match($request);

您将获得路线,现在您需要编写适当的方法来处理来自$route->handler.

这是我在 var_dump $route->handlerfor the /signinroute 之后所做的。

array (size=1)
'params' => 
    array (size=1)
    'values' => 
        array (size=2)
        'controller' => string '\Infraweb\LoginUI' (length=17)
        'action' => string 'read' (length=4)

下面尝试了完整的代码。正如我之前提到的,我不知道您的路线处理逻辑。因此,正确编写内容取决于您。

<?php
require __DIR__ . '/vendor/autoload.php';

use Aura\Router\RouterContainer;

$routerContainer = new RouterContainer();

$map = $routerContainer->getMap();

$request = Zend\Diactoros\ServerRequestFactory::fromGlobals(
    $_SERVER,
    $_GET,
    $_POST,
    $_COOKIE,
    $_FILES
);

$map->get('application.signin.read', '/signin', [
    'params' => [
        'values' => [
            'controller' => '\Infraweb\LoginUI',
            'action' => 'read',
        ]
    ]
]);

$map->post('login.read', '/services/authentication/login', [
    'params' => [
        'values' => [
            'controller' => '\Infraweb\Toolkit\Services\Authentication',
            'action' => 'login',
        ]
    ]
])->accepts([
    'application/json',
]);


$matcher = $routerContainer->getMatcher();

// .. and try to match the request to a route.
$route = $matcher->match($request);
if (! $route) {
    echo "No route found for the request.";
    exit;
}

echo '<pre>';
var_dump($route->handler);
exit;

为了记录,这是composer.json

{ "require": { "aura/router": "^3.1", "zendframework/zend-dictoros": "^2.1" } }

并通过运行

php -S localhost:8000 index.php

并浏览 http://localhost:8000/signin

于 2019-02-25T06:00:32.603 回答