symfony v3.3.6 意外的服务行为
symfony v3.3.6 unexpected service behaviour
我正在开发一个 Symfony3 项目并使用 "new" 依赖注入机制。
请一些人向我解释以下行为:
这是我的设置:
services.yml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
MyBundle\Controller\:
resource: '../../Controller/'
public: true
tags: ['controller.service_arguments']
MyBundle\A:
public:false
控制器场景 A
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction(A $a) <- INJECTION HERE
{
$b = $this->get(A::class); // NO EXCEPTION THROWN HERE
return new Response();
}
}
控制器场景 B
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction() // <- NO INJECTION
{
$b = $this->get(A::class); // EXCEPTION THROWN HERE
return new Response();
}
}
我正在尝试从容器中获取 indexAction
内的服务 A
。当我在 services.yml
中将其标记为私有时,我希望在尝试获取它时出现异常(如 Scenario B
中)。但是在 Scenario A
中我没有得到异常,因为服务 A
已经被注入(自动连接)到控制器中。
(这里是场景 B 的(预期)异常:You have requested a non-existent service "MyBundle\A".
)
请解释一下这种行为。
干杯
私有服务的无效行为描述如下:
http://symfony.com/blog/new-in-symfony-3-2-improved-private-services
Requesting a private service with the Container::get() method is deprecated in Symfony 3.2 and no longer returns the service in 4.0.
它是否在开发者日志中记录任何 'deprecated'?
在评论中进行了一些解释后,我将您的问题理解为:
controller action中请求私服如何变成public?
通过操作注入,这些收集的服务将重新注册到 ServiceLocator
class,这使得它可以通过 ->get()
.
访问
请参阅此处 RegisterControllerArgumentLocatorsPass
。
我同意这是一个有点不清楚的行为。我猜不是所有的路径都可以覆盖。
我正在开发一个 Symfony3 项目并使用 "new" 依赖注入机制。 请一些人向我解释以下行为:
这是我的设置:
services.yml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
MyBundle\Controller\:
resource: '../../Controller/'
public: true
tags: ['controller.service_arguments']
MyBundle\A:
public:false
控制器场景 A
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction(A $a) <- INJECTION HERE
{
$b = $this->get(A::class); // NO EXCEPTION THROWN HERE
return new Response();
}
}
控制器场景 B
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction() // <- NO INJECTION
{
$b = $this->get(A::class); // EXCEPTION THROWN HERE
return new Response();
}
}
我正在尝试从容器中获取 indexAction
内的服务 A
。当我在 services.yml
中将其标记为私有时,我希望在尝试获取它时出现异常(如 Scenario B
中)。但是在 Scenario A
中我没有得到异常,因为服务 A
已经被注入(自动连接)到控制器中。
(这里是场景 B 的(预期)异常:You have requested a non-existent service "MyBundle\A".
)
请解释一下这种行为。
干杯
私有服务的无效行为描述如下: http://symfony.com/blog/new-in-symfony-3-2-improved-private-services
Requesting a private service with the Container::get() method is deprecated in Symfony 3.2 and no longer returns the service in 4.0.
它是否在开发者日志中记录任何 'deprecated'?
在评论中进行了一些解释后,我将您的问题理解为:
controller action中请求私服如何变成public?
通过操作注入,这些收集的服务将重新注册到 ServiceLocator
class,这使得它可以通过 ->get()
.
请参阅此处 RegisterControllerArgumentLocatorsPass
。
我同意这是一个有点不清楚的行为。我猜不是所有的路径都可以覆盖。