【问题标题】:Aura Router AJAX Route Failure - Route Not FoundAura 路由器 AJAX 路由失败 - 找不到路由
【发布时间】:2019-02-22 02:54:33
【问题描述】:

作为这个问题的序言,我正在转换一个演示应用程序以利用 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 群组这些天似乎没有太多流量。很可能我做错了什么,所以我想是时候向集体用户社区寻求方向了。非常欢迎和赞赏任何和所有建设性的批评。

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

【问题讨论】:

  • 你能发布你得到的异常吗?我不在电脑前。即为什么。关于 google group,如果有人提出问题,就会有人试图回复。
  • 在不知道您使用的版本等情况下胡乱猜测。我相信您使用的是 3.x 。但是您正在尝试使用 2.x 中的概念。 $routing_map 的第三个参数 > 一个可选的 $handler(闭包、回调、动作对象、控制器类等);如果您不传递处理程序,则路由将使用 $name 参数作为处理程序。我建议您阅读以下文档:auraphp.com/packages/3.x/Router/getting-started.html#1-4-1。放松并阅读这将帮助您更好地单独调试。否则将错误或完整代码发布到 github 并 ping 我。
  • 感谢@HariKT 的快速回复!是的,我使用的是 2.x 和 3.x 实现逻辑的混合包;搜索网络时发现的例子好坏参半。我的坏处......在我在这里实际发布这个问题之前,我已经在你提供的链接上浏览了所有文档,并且我已经重构了一些东西以更符合 V3.x。但是,错误仍然存​​在,所以我很确定我仍然有一些配置或编码不正确。无论如何,我暂时先把它留在这里,然后在 github 上继续它,直到我在你的帮助下得到缓解,然后关闭它。
  • 在这里继续讨论:[github.com/auraphp/Aura.Router/issues/166]

标签: auraphp


【解决方案1】:

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

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

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

如果您匹配请求(请参阅matching request

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

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

这是我在 var_dump $route->handler/signin 路由之后所做的。

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

{ “要求”: { “光环/路由器”:“^3.1”, “zendframework/zend-diactoros”:“^2.1” } }

并通过

运行
php -S localhost:8000 index.php

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

【讨论】:

  • 让我对这个问题更清楚一点;您示例中的路线不是有问题的路线。任何与 UI 相关的路由都没有问题,有问题的路由是 '/services/authentication/login' 路由路径(js fetch api call), 不知何故未能通过路径规则“/signin”(标准请求)。 FWIW,其他一切实际上与上述相同。我还使用我写给 diactoros 响应类包的调度程序进行了重构——它没有改变任何事情,但在 php-fpm 错误日志中留下了一条消息。解决后我会解决这个问题 - 谢谢!
  • @Doktor13 我确实按照您的示例更改了路线,并且通过邮递员的发布请求没有问题。我不认为路由器是问题,如果你确定的话,正如我之前所说,将完整的代码保存在你的 github repo 中,所以我们只需要做 composer install 来测试它。
猜你喜欢
  • 2017-09-25
  • 2021-11-06
  • 2016-07-03
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多