"Twig_Error_Syntax",显示消息未知"form_start";功能 [英] 'Twig_Error_Syntax' with message Unknown "form_start" function

查看:102
本文介绍了"Twig_Error_Syntax",显示消息未知"form_start";功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用symfony3和twig创建独立表单?我无法克服此错误:

致命错误:在第1行的"new.html.twig"中出现消息未知的"form_start"函数"的未捕获异常"Twig_Error_Syntax"

我的简单项目的组织方式如下:

 .├──composer.json├──composer.lock├──src│└──form.php├──供应商│└... ...└──意见└──new.html.twig 

form.php

 <?phprequire_once __DIR __.'/../vendor/autoload.php';使用Symfony \ Component \ Form \ Forms;使用Symfony \ Bridge \ Twig \ Extension \ FormExtension;使用Symfony \ Bridge \ Twig \ Form \ TwigRenderer;使用Symfony \ Bridge \ Twig \ Form \ TwigRendererEngine;//Twig文件,其中包含用于呈现表单的所有默认标记//此文件随附TwigBridge$ defaultFormTheme ='form_div_layout.html.twig';$ vendorDir = realpath(__ DIR __.'/../vendor');//TwigBridge库的路径,以便Twig可以找到//form_div_layout.html.twig文件$ appVariableReflection =新的\ ReflectionClass('\ Symfony \ Bridge \ Twig \ AppVariable');$ vendorTwigBridgeDir =目录名($ appVariableReflection-> getFileName());//其他模板的路径$ viewsDir = realpath(__ DIR __.'/../views');$ twig =新的Twig_Environment(新的Twig_Loader_Filesystem(array($ viewsDir,$ vendorTwigBridgeDir.'/资源/视图/表格',)));$ formEngine =新的TwigRendererEngine(array($ defaultFormTheme));$ formEngine-> setEnvironment($ twig);//正常创建表单工厂$ formFactory = Forms :: createFormFactoryBuilder()-> getFormFactory();使用Symfony \ Component \ Form \ Extension \ Core \ Type \ TextType;使用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

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


全错误堆栈跟踪

 致命错误:在行1的"new.html.twig"中出现消息未知的"form_start"函数"的未捕获异常'Twig_Error_Syntax'.在/var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php:574中堆栈跟踪:#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-> getFunctionNode('form_start',1)#2/var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php(84):Twig_ExpressionParser-& 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-& 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-& gtseparse(Object(Twig_TokenStream))#7/var/www/a/forms//var/www/a/forms/vendor/twig/twig/lib/Twig/ExpressionParser.php中的</b>在第574行 

解决方案

您是否尝试过

The 3.1 documentation cites this example, which works fine, but it's actually using 2.7

My simple project is organized like this:

.
├── 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"
    }
}


Full Error Stack Trace

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

解决方案

Have you tried, as per the exemple you provided, to add the extension FormExtension to Twig_Environment?

Add the following snippet right after you've initialized $twig and $formEngine variables:

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

You'll then get an error about trans() being unknown. Correct this by adding symfony/translation package : $ composer require symfony/translation.

Then let Twig know about this new extension in the same way as above:

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

Don't forget the uses:

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

这篇关于"Twig_Error_Syntax",显示消息未知"form_start";功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆