【问题标题】:Access Container in Symfony controllersSymfony 控制器中的访问容器
【发布时间】:2017-02-11 23:00:35
【问题描述】:

我正在 Symfony 组件之上创建一个框架。 http://symfony.com/doc/2.7/create_framework/index.html

我想访问我的控制器中的容器,但我不确定如何以 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();

闰年控制器文件

<?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;
    }
}

【问题讨论】:

  • 我基本上不想使用全局 $container 并试图找到一种更好的方法来访问我的 LeapYear 控制器中的容器

标签: php dependency-injection frameworks symfony di-containers


【解决方案1】:

您的基类应如下所示:

<?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;
    }
}

然后在您的控制器中,您可以调用ContainerAwareTrait 提供的$this-&gt;container 或基本控制器提供的$this-&gt;getContainer()

【讨论】:

  • 感谢您的回答。我还想为这个控制器添加 Service 和 Dao。我怎样才能让容器在服务和模型中加载依赖项。
  • 你必须改变你的Framework服务请求-响应的方式。本教程将解决您的问题:The DependencyInjection Component
猜你喜欢
  • 2017-11-10
  • 2017-11-18
  • 2017-06-27
  • 2020-02-16
  • 1970-01-01
  • 2013-03-20
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多