【问题标题】:'Twig_Error_Syntax' with message Unknown "form_start" function带有消息未知“form_start”函数的“Twig_Error_Syntax”
【发布时间】:2016-07-02 19:43:26
【问题描述】:

是否可以用 symfony3 和 twig 制作一个 独立 表单?我无法克服这个错误:

致命错误:未捕获的异常“Twig_Error_Syntax”,第 1 行“new.html.twig”中的消息“未知“form_start”函数

3.1 documentation 引用了this example,效果很好,但实际上使用的是 2.7

我的简单项目是这样组织的:

.
├── composer.json
├── composer.lock
├── src
│   └── form.php
├── vendor
│   └── ...
└── views
    └── new.html.twig

form.php

<?php
require_once __DIR__.'/../vendor/autoload.php';

use Symfony\Component\Form\Forms;
use Symfony\Bridge\Twig\Extension\FormExtension;
use Symfony\Bridge\Twig\Form\TwigRenderer;
use Symfony\Bridge\Twig\Form\TwigRendererEngine;

// the Twig file that holds all the default markup for rendering forms
// this file comes with TwigBridge
$defaultFormTheme = 'form_div_layout.html.twig';

$vendorDir = realpath(__DIR__.'/../vendor');
// the path to TwigBridge library so Twig can locate the
// form_div_layout.html.twig file
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDir = dirname($appVariableReflection->getFileName());
// the path to your other templates
$viewsDir = realpath(__DIR__.'/../views');

$twig = new Twig_Environment(new Twig_Loader_Filesystem(array(
    $viewsDir,
    $vendorTwigBridgeDir.'/Resources/views/Form',
)));
$formEngine = new TwigRendererEngine(array($defaultFormTheme));
$formEngine->setEnvironment($twig);

// create your form factory as normal
$formFactory = Forms::createFormFactoryBuilder()
    ->getFormFactory();

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;

$form = $formFactory->createBuilder()
    ->add('task', TextType::class)
    ->add('dueDate', DateType::class)
    ->getForm();

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

new.html.twig

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

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

composer.json

{
    "require": {
        "symfony/form": "^3.1",
        "symfony/twig-bridge": "^3.1",
        "twig/twig": "^1.24"
    }
}

完整的错误堆栈跟踪

Fatal error: Uncaught exception 'Twig_Error_Syntax' with message 'Unknown "form_start" function in "new.html.twig" at line 1.' in /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php:574
Stack trace:
#0 /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php(351): Twig_ExpressionParser-&gt;getFunctionNodeClass('form_start', 1)
#1 /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php(144): Twig_ExpressionParser-&gt;getFunctionNode('form_start', 1)
#2 /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php(84): Twig_ExpressionParser-&gt;parsePrimaryExpression()
#3 /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php(41): Twig_ExpressionParser-&gt;getPrimary()
#4 /var/www/a/forms/vendor/twig/twig/lib/Twig/Parser.php(144): Twig_ExpressionParser-&gt;parseExpression()
#5 /var/www/a/forms/vendor/twig/twig/lib/Twig/Parser.php(100): Twig_Parser-&gt;subparse(NULL, false)
#6 /var/www/a/forms/vendor/twig/twig/lib/Twig/Environment.php(619): Twig_Parser-&gt;parse(Object(Twig_TokenStream))
#7 /var/www/a/forms/ in /var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php</b> on line 574

【问题讨论】:

    标签: php forms twig symfony-forms symfony


    【解决方案1】:

    as per the exemple you provided,您是否尝试将扩展名 FormExtension 添加到 Twig_Environment?

    在初始化 $twig 和 $formEngine 变量后,立即添加以下 sn-p:

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

    然后您会收到关于 trans() 未知的错误消息。通过添加 symfony/translation 包更正此问题:$ composer require symfony/translation。

    然后以与上述相同的方式让 Twig 了解这个新扩展:

    $twig->addExtension(
        new TranslationExtension(new Translator('en'))
    );
    

    别忘了用途:

    use Symfony\Bridge\Twig\Extension\TranslationExtension;
    use Symfony\Component\Translation\Translator;
    

    【讨论】:

    • 嗯,谢谢,这可能会有所帮助,但实际上会引发一个新错误:'Twig_Error_Syntax' with message 'Unknown "trans" filter in "form_div_layout.html.twig"
    • 是的,我想这意味着form_start() 未知的问题已经解决。但确实是另一朵玫瑰。
    • 我不确定这是否修复它,因为它在form_start() 之前引入了一个新错误,所以它在遇到该错误之前就死了。
    • 很公平。我会深入研究的。
    • @JeffPuckettII:我修正了你的错误。请参阅我的更新答案。
    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多