Приложение Phalcon Micro не работает правильно со строками запроса
Я пытаюсь разработать RESTful API с помощью приложения Micro в Phalcon. Сейчас я работаю в социальной учетной записи с помощью 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.
Это мое .htrouter.php
, Когда я подавляю строку запроса из $_SERVER['REQUEST_URI']
маршрут работает правильно, но SDK Facebook не работает, потому что он ожидает параметры. Я пытался найти, если 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
генерирует для нового проекта, за исключением того, что я монтирую свои микро-коллекции, так что я думаю, что проблема не в этом.
Заранее спасибо!
3 ответа
Наконец, после долгих исследований на форумах я нашел решение. Я должен был добавить это к моему 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, очень вероятно, что я что-то неправильно понял. Надеюсь, поможет.
Создавая собственную реализацию микро-приложения, я обнаружил, что версия php влияет на поведение парсинга URL запроса. На php 5.6 мне пришлось использовать ответ @soutoner
Для запроса / обслуживания / конечной точки? Somefilter = что-то
$app->getRouter()->setUriSource(\Phalcon\Mvc\Router::URI_SOURCE_SERVER_REQUEST_URI);
Без этого дампа запрос показывает параметры как endpoint?somefilter=something
На php 7 дампов показывает endpoint
что идеально
Интересно то, что добавление этого не тормозит приложение на php 7 и исправляет php 5.6. Так что это хороший совет для ретро-совместимости. Не проверял на 7.2, но я думаю, что это будет то же самое.
Прежде всего, убедитесь, что /facebook/callback
работает правильно или нет?
Этот URL: / facebook / обратный звонок
Тогда в вашей функции используйте getQuery
метод:
public function facebookCallback() {
if($this->request->getQuery('code') !== null) {
$code = $this->request->getQuery('code');
// your other codes here
}
}