这里有两个问题,说注入整个服务容器应该解决这个问题.但是问题......见下文(注意尝试2和3之间的差异)......
试试1
public function __construct(SecurityContext $securityContext) {
$this->securityContext = $securityContext);
}
Run Code Online (Sandbox Code Playgroud)
Curcular Reference.好的 ...
试试2
public function __construct(ContainerInterface $container) {
$this->securityContext = $container->get('security.context');
}
Run Code Online (Sandbox Code Playgroud)
循环引用(为什么?,我在try 3中注入容器,除了我只有安全上下文)
试试3
public function __construct(ContainerInterface $container) {
$this->container = $container;
}
Run Code Online (Sandbox Code Playgroud)
作品.
我正在尝试将当前登录的用户注入监听器.我的目标是每一个用户做任何操作(包括这段时间写的电流\日期时间()我的"demo_user"表"last_active"列此方法不为我工作).
应用程序/配置/ config.yml
# ...
services:
demo.listener:
class: Demo\UserBundle\EventListener\ActivityWatcher.php
arguments: ['@service_container']
tags:
- { name: doctrine.event_listener, event: postLoad }
Run Code Online (Sandbox Code Playgroud)
SRC /演示/ UserBundle /事件监听/ ActivityWatcher.php
namespace Demo\UserBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Demo\UserBundle\Entity\DemoUser;
class ActivityWatcher
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$entityManager = $args->getEntityManager();
if ($entity instanceof DemoUser) {
$token = $this->container->get('security.context')->getToken();
$user = $token->getUser();
if($entity->getId() == $user->getId()) {
$entity->setLastActivity( new \DateTime() );
$entityManager->persist($entity);
$entityManager->flush(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个需要访问用户权限级别的事件监听器.在控制器中,我使用以下代码
码:
$securityContext = $this->container->get('security.context');
if($securityContext->isGranted('ROLE_USER')){
//Do Something
}
Run Code Online (Sandbox Code Playgroud)
但是在控制器之外我无法弄清楚如何获得安全上下文.可能吗?
来自这个帖子和修复后的东西我在另一个问题/安全问题/问题.
正如你在其他帖子中看到的那样,我正在尝试在监听器中注入安全上下文,但是如果我保持代码完整而没有触摸我得到了这个错误:
ServiceCircularReferenceException:检测到服务"doctrine.orm.default_entity_manager"的循环引用
因此,阅读和研究我找到了一个解决方案,但我不清楚它是否是正确的,或者它对我的应用程序是否安全.所以这就是我做的:
而不是注入[@security.context]我这样做:
services:
orderhascomment.listener:
class: PL\OrderBundle\Listener\OrderHasCommentListener
arguments: [@service_container]
tags:
- { name: doctrine.event_listener, event: prePersist, method: onPrePersist }
Run Code Online (Sandbox Code Playgroud)
我的听众OrderHasCommentListener.php如下:
namespace PL\OrderBundle\Listener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface;
class OrderHasCommentListener {
protected $container;
public function __construct(ContainerInterface $container = null) {
$this->container = $container;
}
/**
*
* @param LifecycleEventArgs $args
*/
public function onPrePersist(LifecycleEventArgs $args) {
$entity = $args->getEntity();
$user = $this->container->get('security.context')->getToken()->getUser();
$entity->setUser($user);
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?还是存在另一个?我认为注入整个容器是一个坏主意,因为我只需要安全上下文,那么解决方案是什么?(https://insight.sensiolabs.com/what-we-analyse)
试图在服务中转换UserCallable
我正在尝试UserCallable按照这里的说明转换服务,看看 …
我有一个具有必需活动用户字段的实体,因此我需要在以下位置添加活动用户的名称configureFormFields():
class DokumentAdmin extends Admin
{ protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('email')
...
->add('user_name',null,array('required' => true, 'data' => "THIS IS A LOGGED ADMIN NAME"))
;
}
Run Code Online (Sandbox Code Playgroud)
我试图使用一个监听器,
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Dokument) {
//set user name
}
}
Run Code Online (Sandbox Code Playgroud)
但我现在不在这里如何使用容器对象.