Как использовать Symfony HttpFoundation с PHP -DI для MVC - PullRequest
0 голосов
/ 14 июля 2020

Я изо всех сил пытаюсь создать рабочую структуру MVC для проекта.

Что я использую:

Вот мой код.

контейнер. php

$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->useAutowiring(true);
$containerBuilder->useAnnotations(true);
$containerBuilder->addDefinitions(__DIR__ . '/container-config.php');
$container = $containerBuilder->build();

конфигурация контейнера. php

use Twig\Environment;
use Twig\Loader\FilesystemLoader;
use Psr\Container\ContainerInterface;

return [

    'request' => function() {
        return Symfony\Component\HttpFoundation\Request::createFromGlobals();
    },

    'session' => function() {
        return new Symfony\Component\HttpFoundation \Session\Session();
    }

    Environment::class => function () {

        $loader = new FilesystemLoader(__DIR__ . '/../templates');
        $twig = new Environment($loader, [
            'cache' => __DIR__ . '/../var/cache/templates',
        ]);

        return $twig;
    },
];

роутер. php

use Pecee\SimpleRouter\SimpleRouter as R;
use Pecee\Http\Middleware\BaseCsrfVerifier;
use App\App;

R::csrfVerifier(new BaseCsrfVerifier());
R::setDefaultNamespace('\App\Controller');
R::enableDependencyInjection($container);

R::get('/', 'ProductController@index', ['as' => 'products']);

R::start();

Вот мой базовый контроллер

namespace App;

use Symfony\Component\HttpFoundation\Request;
use Twig\Environment;

class BaseController
{

    protected $request;

    protected $twig;

    public function __construct(Request $request, Environment $twig)
    {

        $this->request = $request;

        $this->twig = $twig;

    }

}

Наконец, мой контроллер продукта

namespace App\Controller;

use App\BaseController;

class ProductController extends BaseController
{

    public function index()
    {

        dump($this->request); // returns the request object
        dump($this->request->query->all()); // return empty array

    }

}

Первая проблема заключается в том, что объект запроса, который я установил в контейнере, не работает внутри моего контроллера.

Пример URL example.com?foo=bar

dump($this->request)

Эта строка возвращает Symfony\Component\HttpFoundation\Request, как и должно, но кажется новым, потому что я не могу получить параметры запроса с помощью $this->request->query->all(), он возвращает пустой.

Если я создаю Symfony\Component\HttpFoundation\Request::createFromGlobals(); как глобальную переменную, она работает, как ожидалось, а сброс $this->request->query->all() возвращает ожидаемый array.

Итак, мой вопрос: как мне лучше всего соединить все эти компоненты вместе, чтобы иметь рабочую структуру?

Спасибо!

1 Ответ

0 голосов
/ 14 июля 2020

Ничто в PHP -DI не предполагает, что внедрение зависимостей происходит в соответствии с именами параметров, но вместо этого имеет значение класс. PHP -DI волшебным образом внедряет любой класс, если он (еще) не определен . ( AnnotationBasedAutowiring будет создать класс из ничего, если определение не предоставлено )

Однако на самом деле с использованием аннотаций для запуска инъекций выглядит совсем иначе , и IMHO явно не то, что вы хотите, иначе вы бы это сделали.

Поскольку ваши определения содержат только запись для request, но не для Symfony\Component\HttpFoundation\Request, контейнер с радостью создаст ее для вас .

Чтобы исправить это, вы должны установить другой ключ, который соответствует:

use Symfony\Component\HttpFoundation\Request; // <-- added

return [
    Request::class => function() {
        return Request::createFromGlobals();
    },
    // ...
];
...