Я изо всех сил пытаюсь создать рабочую структуру MVC для проекта.
Что я использую:
- PHP-DI для контейнера DI
- skipperbent/simple-php-router для маршрутизации
- HttpFoundation Symfony
Вот мой код.
container.php
$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->useAutowiring(true);
$containerBuilder->useAnnotations(true);
$containerBuilder->addDefinitions(__DIR__ . '/container-config.php');
$container = $containerBuilder->build();
контейнер-config.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;
},
];
router.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()
вернет ожидаемый массив.
Итак, мой вопрос: как мне лучше всего соединить все эти компоненты вместе, чтобы иметь работающую структуру?
Благодарю вас!