【问题标题】:Uncaught exception 'Twig_Error_Syntax' with message 'Unknown "trans" filter'未捕获的异常 'Twig_Error_Syntax' 带有消息'未知“反式”过滤器'
【发布时间】:2018-04-25 08:11:24
【问题描述】:

我遇到了 Twig 和 Symfony Form 组件的问题。我在我的项目中集成了 Form 和 Twig(我使用 PHP 5.5.9,没有计划更新,所以我在 3.4.4 版本中使用了所有 Symfony 所需的组件)

我遵循本指南:https://symfony.com/doc/3.4/components/form.html

在页面渲染时出现以下错误:

致命错误:未捕获的异常“Twig_Error_Syntax”和消息“未知“反式”过滤器。”在 /symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig:158 堆栈跟踪

这是我的代码:

使用部分:

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Forms; 
use Symfony\Component\Form\FormRenderer;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage;
use Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator;
use Symfony\Component\Security\Csrf\CsrfTokenManager;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Validator\Validation;
use Symfony\Bridge\Twig\Extension\FormExtension;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Bridge\Twig\Form\TwigRendererEngine;
use Symfony\Component\Translation\Loader\XliffFileLoader;
use Symfony\Bridge\Twig\Extension\TranslationExtension;
use Symfony\Component\Translation\Translator;

用于呈现表单的代码:

$defaultFormTheme = 'bootstrap_4_layout.html.twig';

$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDirectory = dirname($appVariableReflection->getFileName());
$viewsDirectory = realpath(__DIR__."/../../app/template/html");

$csrfGenerator = new UriSafeTokenGenerator();
$csrfStorage = new SessionTokenStorage($this->session);
$csrfManager = new CsrfTokenManager($csrfGenerator, $csrfStorage);

$validator = Validation::createValidator();

// Set up the Translation component
$translator = new Translator('it');
$translator->addLoader('xlf', new XliffFileLoader());
$translator->addResource('xlf', $this->libDir.'/symfony/form/Resources/translations/validators.it.xlf', 'it', 'validators');
$translator->addResource('xlf', $this->libDir.'/symfony/validator/Resources/translations/validators.it.xlf', 'it', 'validators');

$loader = new \Twig_Loader_Filesystem(array($viewsDirectory,$vendorTwigBridgeDirectory.'/Resources/views/Form'));
$twig = new \Twig_Environment($loader,array(
    'cache' => realpath(__DIR__."/../../app/template/cache"),
    'debug' => true,
));

$twig->addExtension(new FormExtension());

$formEngine = new TwigRendererEngine(array($defaultFormTheme), $twig);

$twig->addRuntimeLoader(new \Twig_FactoryRuntimeLoader(array(
FormRenderer::class => function () use ($formEngine,$csrfManager) {
    return new FormRenderer($formEngine,$csrfManager);
},
)));

$formFactory = Forms::createFormFactoryBuilder()
   ->addExtension(new HttpFoundationExtension())
   ->addExtension(new CsrfExtension($csrfManager))
   ->addExtension(new ValidatorExtension($validator))
   ->getFormFactory();

$form = $formFactory->createBuilder(FormType::class, null, array(
    'action' => 'index.php',
    'method' => 'POST'
))
->add('username',TextType::class,array(
    'constraints' => array( new NotBlank())
))
->add('password',TextType::class,array(
    'constraints' => array( new NotBlank())
))
->add('remember',CheckboxType::class)
->getForm();

$request = Request::createFromGlobals();
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $data = $form->getData();
    var_dump($data);
    die();
}

echo $twig->render('login.html.twig', array(
   'form' => $form->createView()
));

树枝模板:

<!doctype html>
<html lang="it">
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
   <meta name="description" content="">
   <meta name="author" content="">
   <link rel="icon" href="../../../../favicon.ico">

   <title>Test</title>

   <!-- Bootstrap core CSS -->
   <link href="app/template/asset/css/bootstrap.min.css" rel="stylesheet">

   <!-- Custom styles for this template -->
   <link href="app/template/asset/css/signin.css" rel="stylesheet">
</head>

<body class="text-center">

    {{ form_start(form) }}
      {{ form_widget(form) }}

      <input type="submit" />
    {{ form_end(form) }}

</body>
</html>

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    只需阅读错误,您就可以知道究竟是什么错误:

    致命错误:未捕获的异常“Twig_Error_Syntax”和消息“未知“反式”过滤器。”在 /symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig:158 堆栈跟踪

    这意味着文件 bootstrap_4_layout.html.twig - 实际上来自 symfony twig-bridge- 有类似 {{ string|trans ...}} 的东西,这主要用于多语言,因为你得到这个错误,所以这意味着你的 trans 过滤器没有启用,你需要启用它!

    从您正在遵循的同一教程中,它说:

    翻译

    如果您将 Twig 集成与其中一个 默认表单主题文件(例如 form_div_layout.html.twig),有 2 个 用于翻译的 Twig 过滤器(trans 和 transChoice) 表单标签、错误、选项文本和其他字符串。

    所以只要按照接下来的步骤,你的问题应该会得到解决

    • composer require symfony/translation symfony/config
    • 接下来,将 TranslationExtension 添加到您的 Twig_Environment 实例中

    参考这个: https://symfony.com/doc/3.4/components/form.html#component-form-intro-install-translation

    【讨论】:

    • 我通过添加 $twig->addExtension(new TranslationExtension($translator)); 解决了
    • 这意味着你添加了翻译扩展,但我只是解释了为什么会这样,因为你会多次遇到这个错误,现在你知道它的含义了 ;)
    【解决方案2】:

    我认为您忘记将过滤器添加到新环境:

    $getTextdomain = new \Twig_SimpleFilter('trans',function ($string){
    
        return $this->container->get('translator')->trans($string);    
    
     });
    
    $twig->addFilter($getTextdomain);
    

    【讨论】:

      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 2012-07-08
      相关资源
      最近更新 更多