Контейнер доступа в контроллерах Symfony

Я создаю фреймворк поверх компонентов Symfony.
http://symfony.com/doc/2.7/create_framework/index.html

Я хочу получить доступ к контейнеру в моем контроллере, но я не уверен, как это сделать способом ООП.

Я в настоящее время доступ к нему через global но я уверен, что был бы лучший способ сделать то же самое. Пожалуйста, обратитесь мои блоки кода:

#services.yml file
services:
calendar.model.leapyear:
class: Calendar\Model\LeapYear

Файл переднего контроллера

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing;
use Symfony\Component\HttpKernel;

$request = Request::createFromGlobals();
$routes = include __DIR__ . '/../src/routes.php';
$container = include __DIR__ . '/../src/app/Container.php';

$context = new Routing\RequestContext();
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);

$controllerResolver = new HttpKernel\Controller\ControllerResolver();
$argumentResolver = new HttpKernel\Controller\ArgumentResolver();

$framework = new Framework($matcher, $controllerResolver, $argumentResolver);
$response = $framework->handle($request);

$response->send();

Файл LeapYearController

<?phpnamespace Calendar\Controller;

use Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class LeapYearController extends Controller
{

protected $model;

public function indexAction(Request $request, $year)
{
$this->model = $this->container->get('calendar.model.leapyear');
if ($this->model->isLeapYear($year)) {
return new Response('Yep, this is a leap year!');
}

return new Response('Nope, this is not a leap year.');
}
}

Базовый контроллер

<?php

namespace Controller;

use Symfony\Component\DependencyInjection\ContainerAware;

class Controller extends ContainerAware
{
protected $container;

public function __construct()
{
global $container;
$this->container = $container;
}
}

2

Решение

Ваш базовый класс должен выглядеть так:

<?php

namespace Controller;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class Controller implements ContainerAwareInterface
{
use ContainerAwareTrait;

public function getContainer()
{
return $this->container;
}
}

Тогда в ваших контроллерах вы можете позвонить либо $this->container как предусмотрено ContainerAwareTrait или же $this->getContainer() как предусмотрено вашим базовым контроллером.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]