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.php
与 phalcon-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);
我不知道它为什么起作用,因为正如 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 上测试,但我想它会是一样的。
我正在尝试在 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.php
与 phalcon-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);
我不知道它为什么起作用,因为正如 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 上测试,但我想它会是一样的。