Twig_Error_Syntax:函数“is_granted”不存在

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Twig_Error_Syntax:函数“is_granted”不存在相关的知识,希望对你有一定的参考价值。

我正在使用Silex,不能在模板中使用is_granted函数。我在文档中找不到有关为什么这不起作用的任何内容。任何提示?

$app->register(new SilexProviderSecurityServiceProvider());

$app->register(new SilexProviderTwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../templates',
    'twig.options' => array('cache' => __DIR__.'/../cache'),
));

$app['debug'] = true;

$app['security.firewalls'] = array(
    'login' => array(
                'pattern' => '^/login$',
        ),
        'secured' => array(
                'pattern' => '^.*$',
                'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
                'users' => array(
                        'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='),
                ),
        ),
);

$app->get('/', function() use ($app) {
    return $app['twig']->render('index.html.twig');
});

$app->get('/login', function(Request $request) use ($app) {
    return $app['twig']->render('login.html.twig', array(
            'error'                 => $app['security.last_error']($request),
            //'last_username' => $app['session']->get('_security.last_username'),
    ));
});
答案

显然,我还需要添加symfony / bridge组件:

将其添加到composer.json并更新。

"symfony/twig-bridge": "2.1.*",

嘿......它会像预期的那样工作。

另一答案

我不得不使用这种解决方法(不知道是否有任何缺点)

$function = new Twig_SimpleFunction('is_granted', function($role) use ($app){
    return $app['security']->isGranted($role);
});
$app['twig']->addFunction($function);
另一答案

根据SymfonyComponentSecurityCoreSecurityContextInterfacewewe必须提供我们试图评估的权利的第二个参数。第二个参数将被发送给选民(例如用户)

$function = new Twig_SimpleFunction('is_granted', function($role, 
$object = null) use ($app){
    return $app['security']->isGranted($role, $object);
});
$app['twig']->addFunction($function);
另一答案

问题很可能是由注册类的顺序引起的。顺序应该是SecurityServiceProvider,然后启动你的应用程序,然后注册TwigServiceProvider。 TwigServiceProvider检查$ app ['security']以设置Twig SecurityExtension。订单很重要

// Security service
$app["security.firewalls"] = array();
$app->register(new SilexProviderSecurityServiceProvider());

// Boot your application to call SecurityServiceProvider()->boot()
$app->boot();

// Twig service
$app->register(new SilexProviderTwigServiceProvider(), array(
  'twig.path' => sprintf("%s/../views", __DIR__),
));
另一答案

如果您使用Symfony 2.6组件,它将成为security.authorization_checker而不是安全性,如:

$function = new Twig_SimpleFunction('is_granted', function($role,$object = null) use ($app){
    return $app['security.authorization_checker']->isGranted($role,$object);
});
$app['twig']->addFunction($function);

以上是关于Twig_Error_Syntax:函数“is_granted”不存在的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》

8InfluxDB常用函数聚合函数,count()函数,DISTINCT()函数,MEAN()函数,MEDIAN()函数,SPREAD()函数,SUM()函数

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

1.19.9.函数概览函数引用精确函数引用模糊函数引用函数解析顺序精确函数引用模糊函数引用自定义函数准备工作概述开发指南函数类求值方法标量函数表值函数聚合函数