我有一个特征,可以检查用户是否登录以及尝试访问特定位置的次数。
我尝试在 FormType 内部使用此特征,以便在多次尝试后显示验证码。
在 getIpOrUserId()
内部,我正在尝试检查用户是否已登录 $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')
但它返回一个错误
尝试调用类的名为“get”的未定义方法
。
我认为不可能创建一个特征即服务,以便我可以注入(inject)安全对象。
有办法实现吗?
Trait
<?php
Trait CheckAttempts {
public function getTryAttempts()
{
if ($this->getIpOrUserId() == null) {
return false;
} else {
$attempts = $this->getDoctrine()
->getRepository('SiteBundle:LoginAttempts')
->findOneByIpOrUserId($this->getIpOrUserId());
}
return $attempts->getAttempts();
}
protected function getIpOrUserId()
{
//get logged in user
//if ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
$ipOrUserId = $this->get('security.token_storage')->getToken()->getUser()->getId();
} else {
$ipOrUserId = $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
}
return $ipOrUserId;
}
FormType
class RegisterType extends AbstractType
{
use FormSendLimitTrait;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
var_dump($this->getTryAttempts());
$form->add('captcha', 'captcha',
'label' => 'site.captcha'
]);
/*if ($attempts->getAttempts() > 6) {
$form->add('captcha', 'captcha', [
'label' => 'site.captcha'
]);
}*/
})
最佳答案
get
方法仅在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller
类时才有效,通常它在 Controller 类中使用。它只返回 $this->container->get($id)
,没有其他,这意味着它返回 Symfony\Component\DependencyInjection\Container
类。您应该将 security.authorization_checker
服务注入(inject)您的类(或您想要的其他服务),甚至整个 service_container
服务(但不建议 )。
示例:
class MyClass
{
private $securityChecker;
public function __construct(Symfony\Component\Security\Core\Authorization\AuthorizationChecker $securityChecker)
{
$this->securityChecker = $securityChecker;
}
...
}
服务.yml
services:
my_class_service:
class: Acme\DemoBundle\MyClass
arguments:
- @security.authorization_checker
但是就你的情况而言you should not use traits like you're doing .
关于symfony - 如何在特征中使用authorizationChecker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30981816/