2017-02-11 120 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) –