2

我正在尝试使用Phalcon中的Micro应用程序开发 RESTful API 。现在我正在使用 Facebook SDK for 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内置服务器

这是我的.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.php完全相同,phalcon-devtools只是我挂载了我的微收藏,所以我认为问题不存在。

先感谢您!

4

3 回答 3

6

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

刚过:

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

这个:

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

资源

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

无论如何,由于我对 Phalcon 不是很有经验,我很可能误解了一些东西。希望能帮助到你。

于 2015-12-14T22:18:28.517 回答
1

我自己实现了一个微应用,我确实发现 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 上测试,但我想它会是一样的。

于 2018-09-05T23:11:38.557 回答
0

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

public function facebookCallback() {
   if($this->request->getQuery('code') !== null) {
        $code = $this->request->getQuery('code');
        // your other codes here
   }
}
于 2015-12-14T19:04:06.203 回答