Phalcon Micro 应用程序无法使用查询字符串正确路由

Phalcon Micro app doesn't route correctly with query strings

我正在尝试在 Phalcon 中使用 Micro 应用程序开发 RESTful API。现在我正在使用 Facebook SDK 为 PHP 进行社交登录,但我发现当 Facebook 将我重定向到我的回调时(显然 里面有一个查询字符串 )路由器找不到任何处理程序方法。

GET: http://localhost:8000/api/v1/register/facebook/callback?code=...&state=...#_=_

Not-Found handler is not callable or is not defined
#0 /home/adrian/PhpstormProjects/myproject/index.php(39): Phalcon\Mvc\Micro->handle()
#1 {main}

我的所有其他路由都正常工作,但这是我第一次遇到查询字符串,所以我不知道我是否做错了什么。

我正在使用 Micro Collections 进行路由和 PHP built-in 服务器 .

这是我的 .htrouter.php。当 我抑制 来自 $_SERVER['REQUEST_URI'] 的查询字符串时, 路由正常工作 ,但 Facebook SDK 失败,因为它需要参数。我试图找出 Phalcon 是否将 URL 和查询字符串保存在不同的 $_GET 变量中,但我认为情况并非如此。

<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;

我的micro-collection.php

<?php

use \Phalcon\Mvc\Micro\Collection as MicroCollection;

$register = new MicroCollection();
$register->setHandler('App\Controllers\V1\RegisterController', true);
$register->setPrefix('/api/v1/register');
$register->get('/facebook', 'getAuthFacebook');
$register->get('/facebook/callback', 'facebookCallback');

return $register;

这是我的RegisterController.php

<?php

namespace App\Controllers\V1;

use App\Controllers\ControllerBase;
use Phalcon\Http\Response;

class RegisterController extends ControllerBase
{
    public function getAuthFacebook()
    {
        $helper = $this->facebook->getRedirectLoginHelper();
        $permissions = ['email', 'user_likes'];
        $loginUrl = $helper->getLoginUrl('http://localhost:8000/api/v1/register/facebook/callback', $permissions);

        return new Response($loginUrl);
    }

    public function facebookCallback()
    {
        ....
    }
}

我的 index.phpphalcon-devtools 为新项目生成的完全相同,除了我挂载了我的微型 collections,所以我认为问题不在那里.

提前致谢!

首先检查 /facebook/callback 是否正常工作?
这个 url : /facebook/callback
然后在你的函数中使用 getQuery 方法:

public function facebookCallback() {
   if($this->request->getQuery('code') !== null) {
        $code = $this->request->getQuery('code');
        // your other codes here
   }
}

最后,经过论坛的大量研究,我找到了解决方案。我必须将此添加到我的 index.php:

就在:

之后
$app = new \Phalcon\Mvc\Micro($di);

这个:

$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);

Source

我不知道它为什么起作用,因为正如 documentation 所说,它改变了路由器的行为以使用 $_SERVER['REQUEST_URI'] 而不是 $_GET['_url'] 但这实际上是 .htrouter.php 确实(或至少尝试这样做)。

无论如何,由于我对 Phalcon 不是很有经验,所以很可能我误解了什么。希望对你有帮助。

我自己实现了一个微应用程序,我确实发现 php 版本会影响请求 url 解析的行为。在 php 5.6 上,我不得不使用@soutoner

的答案

请求/service/endpoint?somefilter=something

$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);

如果没有此转储,请求将参数显示为 endpoint?somefilter=something

在 php 7 转储显示 endpoint 这是完美的

有趣的是,添加它不会在 php 7 上阻止应用程序并修复 php 5.6。所以这是一个很好的复古兼容性技巧。没有在 7.2 上测试,但我想它会是一样的。