Symfony 2.3/2.4 独立表单组件
Posted
技术标签:
【中文标题】Symfony 2.3/2.4 独立表单组件【英文标题】:Symfony 2.3/2.4 Standalone Form Component 【发布时间】:2013-09-07 13:57:55 【问题描述】:我正在尝试使用 Symfony 2.3 Form Standalone 组件在 Symfony 框架之外使用。
我尝试了以下网址http://n.clavaud.free.fr/blog/index.php?article31/symfony2-standalone-form-component-tutorial
上面的url代码不错,但它是基于旧版本的symfony框架。
我在使用 Symfony 2.3 时遇到问题
我希望 url 中的代码与上面相同,但它应该适用于 Symfony 2.3 或任何其他建议?
我正在使用下面的代码
<?php
use Symfony\Component\ClassLoader\UniversalClassLoader;
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\FormRenderer;
use Symfony\Component\Form\FormRendererInterface;
use Symfony\Component\Form\Extension\Core\CoreExtension;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\TemplateNameParserInterface;
use Symfony\Component\Templating\TemplateReference;
use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Translation\MessageSelector;
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Validator\DefaultTranslator;
use Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper;
use Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper;
// validation
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Validator\Validator;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\Constraints as Constraints;
use Symfony\Component\Validator\Validation;
/**
* Load and configure autoloader
* @see http://symfony.com/doc/2.0/cookbook/tools/autoloader.html
*/
require_once 'Symfony/Component/ClassLoader/UniversalClassLoader.php';
$loader = new UniversalClassLoader();
$loader->register();
$loader->registerNamespace('Symfony', __DIR__.'/');
/**
* Parameters
*/
$locale = null;
/**
* Entity
*/
class Message
public $sender;
public $recipient;
public $message;
// validation
public static function loadValidatorMetadata(ClassMetadata $metadata)
$metadata->addPropertyConstraint('sender', new Constraints\NotBlank());
$metadata->addPropertyConstraint('sender', new Constraints\Email());
$metadata->addPropertyConstraint('recipient', new Constraints\NotBlank());
$metadata->addPropertyConstraint('recipient', new Constraints\Email());
$metadata->addPropertyConstraint('message', new Constraints\NotBlank());
$metadata->addPropertyConstraint('message', new Constraints\MinLength(10));
/**
* Form Class
* @see http://symfony.com/doc/2.0/book/forms.html#creating-form-classes
*/
class MessageType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('sender', 'email')
->add('recipient', 'email')
->add('message', 'textarea');
public function getName()
return 'message';
public function getDefaultOptions(array $options)
return array(
'data_class' => 'new\Message',
);
/**
* Template name parser
* @see Symfony\Bundle\FrameworkBundle\Tests\Templating\Helper\Fixtures\StubTemplateNameParser
*
* Needed to load the templates used for rendering form items.
*/
class StubTemplateNameParser implements TemplateNameParserInterface
private $root;
private $rootTheme;
public function __construct($root, $rootTheme)
$this->root = $root;
$this->rootTheme = $rootTheme;
public function parse($name)
list($bundle, $controller, $template) = explode(':', $name);
if ($template[0] == '_')
$path = $this->rootTheme.'/Custom/'.$template;
elseif ($bundle === 'TestBundle')
$path = $this->rootTheme.'/'.$controller.'/'.$template;
else
$path = $this->root.'/'.$controller.'/'.$template;
return new TemplateReference($path, 'php');
/**
* Create an entity
*/
$message = new Message();
$message->sender = 'mymail@example.com';
/**
* Build a form from a form factory
*/
/* $form_factory = new FormFactory(array(
new CoreExtension(),
// validation
new ValidatorExtension(
new Validator(
new ClassMetadataFactory(
new StaticMethodLoader()
),
new ConstraintValidatorFactory(),
new DefaultTranslator()
)
)
));*/
$validator = Validation::createValidator();
$form_factory = Forms::createFormFactoryBuilder()
->addExtension(new CoreExtension())
->addExtension(new ValidatorExtension($validator))
->getFormFactory();
$form = $form_factory->create(new MessageType(), $message);
/**
* Create a PHP template engine
*/
$root = realpath(__DIR__ . '/Symfony/Bundle/FrameworkBundle/Resources/views');
$rootTheme = realpath(__DIR__ . '/Symfony/Bundle/FrameworkBundle/Resources');
$templateNameParser = new StubTemplateNameParser($root, $rootTheme);
$loader = new FilesystemLoader(array());
$engine = new PhpEngine($templateNameParser, $loader);
/**
* This helper will help rendering form items
*/
/*$form_helper = new FormHelper($engine, array(
'FrameworkBundle:Form',
));*/
$form_helper = new FormHelper(new FormRendererInterface());
/**
* Bind it to the engine
*/
$engine->setHelpers(array(
$form_helper,
new TranslatorHelper(new Translator($locale, new MessageSelector())),
));
/**
* Bind submitted data
*/
$submitted = false;
$valid = null;
if (isset($_POST[$form->getName()]))
$form->bind($_POST[$form->getName()]);
$submitted = true;
// validation
if ($valid = $form->isValid())
// you may want to redirect at this state
$data = $form->getData();
echo 'validated success';
var_dump($data);
/**
* Create the form view
*/
$form_view = $form->createView();
/**
* Now, it's time to render HTML!
*/
header('Content-type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<body>
<form action="" method="post"
<?php print $form_helper->enctype($form_view) ?>
novalidate="novalidate">
<?php print $form_helper->widget($form_view) ?></div>
<input type="submit" />
</form>
<?php if ($submitted && $valid) : ?>
<p><strong>Submitted form is valid.</strong></p>
<?php endif; ?>
<p><em>Message object:</em></p>
<pre><?php print print_r($message, true); ?></pre>
</body>
</html>
我收到了这个错误
致命错误:无法在第 193 行的 /var/www/new/test.php 中实例化接口 Symfony\Component\Form\FormRendererInterface
【问题讨论】:
到底是什么问题?有任何错误信息吗? 【参考方案1】:您正在尝试实例化一个接口:
$form_helper = new FormHelper(new FormRendererInterface());
接口不是类,您不能实例化它们(请参阅http://php.net/interface 并阅读有关 OOP 的内容)。
查看独立使用表单组件的示例:https://github.com/bschussek/standalone-forms
【讨论】:
您好 Jakub Zalas,感谢您的回复,但它无法正常工作,它遵循 Symfony 2.1 给出错误致命错误:Class 'Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider' not在第 26 行的 /Library/WebServer/Documents/eeee/src/setup.php 中找到 嗨,有人有这方面的更新吗?我尝试了不同的方法,现在我收到错误 Uncaught exception 'Symfony\Component\Form\Exception\LogicException' 并显示消息“无法呈现表单,因为以下块都不存在:“_message_enctype”、“message_enctype” , "form_enctype" 我刚刚尝试了 bschussek/standaolne-forms 并且它可以工作(只需克隆存储库并运行 composer install - 安装,而不是更新)。它基于 2.1,您必须弄清楚如何将其更新到最新版本。 实际上,您需要为 2.3 修复一件小事 - 在 index.php 中将 MinLength 替换为 Length。此约束的名称已更改。 您好 Jakub Zalas,感谢您的回复。我想使用 PHP 作为模板引擎我该怎么做。另一个也是我的主要要求是构建自定义字段类型以上是关于Symfony 2.3/2.4 独立表单组件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Symfony Routing 作为独立组件来调试路由?
在 Symfony Messenger 组件中使用独立的发件人
Symfony3 表单组件试图将 null 传递给 PHP 7 中的类型提示方法