我正试图在RESTful Phalcon中开发一个带有Micro应用程序的 API。现在我正在使用Facebook进行社交登录,但是我发现当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}我所有的其他路线都正常工作,但这是我第一次面对查询字符串,所以我不知道我是否做错了什么。
我使用微集合进行路由,并使用PHP 内置服务器。
这是我的.htrouter.php。当我禁止使用来自$_SERVER['REQUEST_URI']的查询字符串时,路由正确地工作,但是Facebook失败了,因为它需要参数。我试着查找Phalcon是否在不同的$_GET变量中保存了URL和查询字符串,但我认为情况并非如此。
<?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为一个新项目生成的完全相同,只是我挂载了我的微收藏,所以我认为问题并不存在。
提前谢谢你!
发布于 2015-12-14 22:18:28
最后,经过论坛的大量研究,我找到了解决方案。我不得不把这个加到我的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不是很有经验,所以我很可能误解了什么。希望能帮上忙。
发布于 2018-09-05 23:11:38
在自己实现一个微型应用程序时,我确实发现php版本会影响请求url解析的行为。在php 5.6上,我不得不使用@soutoner的答案
对于请求/service/终结点?
$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);
如果没有这种转储,请求将params显示为endpoint?somefilter=something
在php 7上,转储显示endpoint,这是非常完美的。
有趣的是,添加这个程序并不能阻止php 7上的应用程序,并且可以修复php5.6。因此,这是一个很好的建议复古兼容性。没有在7.2上进行测试,但我想应该是一样的。
发布于 2015-12-14 19:04:06
首先,检查/facebook/callback是否正确工作?
这个网址:/facebook/回调
然后在函数中使用getQuery方法:
public function facebookCallback() {
if($this->request->getQuery('code') !== null) {
$code = $this->request->getQuery('code');
// your other codes here
}
}https://stackoverflow.com/questions/34257310
复制相似问题