Приложение 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
   }
}
Другие вопросы по тегам