2

Я создаю структуру сверху на компонентах Symfony. http://symfony.com/doc/2.7/create_framework/index.htmlAccess Container в контроллерах Symfony

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

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

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

Front Controller File

<?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 Файл

<?php 


namespace 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; 
    } 
} 
+0

В основном я не хочу использовать глобальный контейнер $ и пытаюсь найти лучший способ доступа к контейнеру в своем контроллере LeapYear. –

ответ

4

Ваш базовый класс должен выглядеть следующим образом:

<?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(), как это предусмотрено базового контроллера.

+0

Благодарим вас за ответ. Я также хотел добавить Service и Dao для этого контроллера. как я могу получить контейнер в сервисе и модель для загрузки зависимостей. –

+1

Вы должны изменить способ, которым ваша «Framework» служит для запроса-ответа. Этот учебник поможет решить ваши проблемы: [компонент DependencyInjection] (http://symfony.com/doc/2.7/create_framework/dependency_injection.html) –