编辑
在深入研究了 symfony 代码,尤其是 ControllerResolver 之后,似乎我试图做的事情实际上是不可能的,除非我自己继承/实现 ControllerResolverInterface。
这是以下代码,它实例化从路由传递的控制器:
protected function createController($controller)
{
if (false === strpos($controller, '::')) {
throw new \InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
}
list($class, $method) = explode('::', $controller, 2);
if (!class_exists($class)) {
throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
}
return array(new $class(), $method);
}
正如你在最后一行看到的,它总是在没有传递参数的情况下被实例化,所以我必须重写这个方法才能以这种方式注入一些东西。感觉很hacky。
原始问题
我试图弄清楚如何使用 Symfony 组件(例如,不是完整的堆栈框架)将服务注入到在动态路由中定义的自定义控制器中。
请注意,我没有使用完整的堆栈框架,也没有使用他们的 DemoBundle src 代码。我有一个composer.json
需要组件的文件,所以我有一个index.php
与此处详述的文件大致相同的自定义文件:
我有以下内容:
$routes = new RouteCollection();
$routes->add(
'some route name',
new Route(
'a route path',
array(
'_controller' => 'App\MyBundle\Controller\MyController::handle'
)
)
);
然后我有以下内容App/MyBundle/DependencyInjection/MyExtension.php
:
public function load(array $configs, ContainerBuilder $container) {
$loader = new XmlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resource/config')
);
$loader->load('services.xml');
}
App/MyBundle/Resources/config/services.xml
:
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="templating" class="Symfony\Component\Templating\EngineInterface" />
<service id="navigation" class="App\MyBundle\Controller\MyController">
<argument type="service" id="templating" />
</service>
</services>
</container>
我基本上是在尝试将模板服务注入MyController
构造函数,我的理解是MyExtension
文件应该自动加载。我假设我没有使用完整的堆栈框架,这就是原因,但我怎样才能让它工作呢?