Phalcon Micro应用程序无法使用查询字符串正确路由

时间:2015-12-13 22:46:31

标签: routing query-string phalcon php-builtin-server

我正在尝试使用 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.phpphalcon-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); ?> 完全相同,只是我挂载了我的微集合,所以我认为问题不在那里。

提前谢谢!

3 个答案:

答案 0 :(得分:6)

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

就在之后:

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

此:

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

Source

我不知道它为什么会起作用,因为正如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
   }
}