我正在尝试使用 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
为新项目生成的<?php
$dsn = "xxx";
$user = "xxx";
$pw = "xxx";
try {
$pdo = new PDO($dsn, $user, $pw);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
$usersQuery = "SELECT fach_id, fach FROM faecher";
$users = $pdo->query($usersQuery);
?>
完全相同,只是我挂载了我的微集合,所以我认为问题不在那里。
提前谢谢!
答案 0 :(得分:6)
最后,经过论坛的大量研究后,我找到了解决方案。我必须将此添加到我的index.php
:
就在之后:
$app = new \Phalcon\Mvc\Micro($di);
此:
$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);
我不知道它为什么会起作用,因为正如documentation所说,它改变了路由器的行为,以便使用$_SERVER['REQUEST_URI']
而不是$_GET['_url']
,但是实际上是.htrouter.php
所做的(或者至少尝试做过)。
无论如何,由于我对Phalcon不是很有经验,所以我很可能误解了一些事情。希望它有所帮助。
答案 1 :(得分: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上进行测试,但我想它是相同的。
答案 2 :(得分:0)
首先检查/facebook/callback
是否正常工作?
这个网址:/facebook/callback
然后在您的函数中使用getQuery
方法:
public function facebookCallback() {
if($this->request->getQuery('code') !== null) {
$code = $this->request->getQuery('code');
// your other codes here
}
}