首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Phalcon没有使用查询字符串正确地进行路由

Phalcon没有使用查询字符串正确地进行路由
EN

Stack Overflow用户
提问于 2015-12-13 22:46:31
回答 3查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
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和查询字符串,但我认为情况并非如此。

代码语言:javascript
复制
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;

我的micro-collection.php

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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为一个新项目生成的完全相同,只是我挂载了我的微收藏,所以我认为问题并不存在。

提前谢谢你!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-14 22:18:28

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

就在这之后:

代码语言:javascript
复制
$app = new \Phalcon\Mvc\Micro($di);

这是:

代码语言:javascript
复制
$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);

来源

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

不管怎么说,由于我对Phalcon不是很有经验,所以我很可能误解了什么。希望能帮上忙。

票数 6
EN

Stack Overflow用户

发布于 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上进行测试,但我想应该是一样的。

票数 1
EN

Stack Overflow用户

发布于 2015-12-14 19:04:06

首先,检查/facebook/callback是否正确工作?

这个网址:/facebook/回调

然后在函数中使用getQuery方法:

代码语言:javascript
复制
public function facebookCallback() {
   if($this->request->getQuery('code') !== null) {
        $code = $this->request->getQuery('code');
        // your other codes here
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34257310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档