2017-02-11 161 views
2

我在Symfony組件上創建了一個框架。 http://symfony.com/doc/2.7/create_framework/index.html在Symfony控制器中訪問容器

我想訪問我的控制器中的容器,但我不知道如何做到這一點的OOP方式。

我目前正在通過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文件

<?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->containerContainerAwareTrait$this->getContainer()提供由你的基地控制器提供。

+0

謝謝你的回答。我也想爲這個控制器添加Service和Dao。我將如何獲得容器的服務和模型來加載依賴關係。 –

+1

你必須改變你的''框架'服務請求 - 響應的方式。本教程將解決您的問題:[DependencyInjection組件](http://symfony.com/doc/2.7/create_framework/dependency_injection.html) –