- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Company
有很多Employee
s。在我的表单中,我希望用户能够动态添加员工(足够简单)。 EmployeeType
(an AbstractType
) 是复合词,包含名字和姓氏。在提交表单时,Symfony 似乎没有将表单中的数据转移到"new"员工的构造函数中。我有一个错误
ArgumentCountError: Too few arguments to function Employee::__construct() ... 0 passed in ... and exactly 3 expected
class Company
{
protected $employees;
public function __construct()
{
$this->employees = new ArrayCollection();
}
public function addEmployee(Employee $employee)
{
if ($this->employees->contains($employee)) {
return;
}
$this->employees->add($employee);
}
public function removeEmployee(Employee $employee)
{
if (!$this->employees->contains($employee)) {
return;
}
$this->employees->removeElement($employee);
}
}
员工
class Employee
{
// ... firstName and lastName properties...
public function __construct(Company $company, $firstName, $lastName)
{
$this->company = $company;
$this->company->addEmployee($this);
}
// ...getter and setter for firstName / lastName...
}
公司类型
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('employees', CollectionType::class, [
'entry_type' => EmployeeType::class,
'allow_add' => true,
'allow_delete' => false,
'required' => false,
]);
// ...other fields, some are CollectionType of TextTypes that work correctly...
}
}
员工类型
class EmployeeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstName')
->add('lastName');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Employee::class,
]);
}
}
公司主管
class CompanyController
{
// Never mind that this is a show and not edit, etc.
public function showAction()
{
// Assume $this->company is a new or existing Company
$form = $this->createForm(CompanyType::class, $this->company);
$form->handleRequest($this->request);
if ($form->isSubmitted() && $form->isValid()) {
$company = $form->getData();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($company);
$entityManager->flush();
}
// set flash message, redirect, etc.
}
// ...render view...
}
上述内容在修改现有员工时有效,但在创建新员工时无效。从 Symfony 代码中调试,我可以看到新员工不存在数据,因此它试图找到
empty_data
的闭包或定义。在
CompanyType
.我已经尝试过这种方法(通过
configureOptions
和
empty_data
构建
CompanyType::buildForm
表单时的选项),例如
https://symfony.com/doc/current/form/use_empty_data.html .我的直觉告诉我我什至不需要这样做,因为表单数据不应为空(我明确填写了字段)。
new CallbackTransformer
的第二个函数参数)的转换甚至没有命中。
form[employees][1][firstName]
,等等。那不是问题。它还向 Controller 发送正确的数据。我通过
CompanyType::onPreSubmit
检查表单提交数据确认了这一点。 (使用事件监听器)。
CollectionType
的
TextType
s 中的其他内容
CompanyType
,这些工作正常。所以这个问题似乎与
EmployeeType
的事实有关。是复合的(包含多个字段)。
Employee
的实例化供 Symfony 使用。在内部,每个字段都被传递给
Symfony\Component\Form\Form::submit()
.对于现有员工,还有
Employee
传入。对于新的,它是
null
.这就解释了为什么它要寻找
empty_data
,但我不知道为什么我不能得到
empty_data
上类。
最佳答案
解决方案是定义 empty_data
在 复合形式 ,而不是 CollectionType
形式。
我的情况有点奇怪,因为我还需要Company
的实例在我的 EmployeeType
,因为它必须传递给 Employee
的构造函数.我通过将 Company 作为表单选项传入 configureOptions
来完成此操作。 (由 Controller 提供),然后进入entry_options
.我不知道这是否是最佳实践,但它有效:
公司主管
确保我们传入 Company 实例,以便它可以在 EmployeeType
中使用新建时Employee
:
$form = $this->createForm(CompanyType::class, $this->company, [
// This is a form option, valid because it's in CompanyType::configureOptions()
'company' => $this->company,
]);
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('employees', CollectionType::class, [
// ...
// Pass the Company instance to the EmployeeType.
'entry_options' => [ 'company' => $options['company'] ],
// This was also needed, apparently.
'by_reference' => false,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
// Allows the controller to pass in a Company instance.
'company' => null,
]);
}
}
empty_data
从表单数据正确构建一个员工。
class EmployeeType extends AbstractType
{
private $company;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('firstName')
->add('lastName');
// A little weird to set a class property here, but we need the Company
// instance in the 'empty_data' definition in configureOptions(),
// at which point we otherwise wouldn't have access to the Company.
$this->company = $options['company'];
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Employee::class,
'empty_data' => function (FormInterface $form) use ($resolver) {
return new Employee(
$this->company,
$form->get('firstName')->getData(),
$form->get('lastName')->getData(),
);
},
]);
}
}
关于symfony - empty_data 不适用于复合形式,或者实体没有被实例化(ArgumentCountError : too few arguments to function),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52214079/
我只是在学习codeigniter,并且有一个页面可以更新我的数据库。但我收到这样的错误: Type: ArgumentCountError Message: Too few arguments to
自过去两天以来,我面临着非常奇怪的问题,我有两个不同的服务器,一个是Windows(php v5.3),第二个是linux(php v7.1 ngnix)。我有一个项目(由某人编写)已经在 Windo
我希望能帮助理解这个 fatal error 。 看了其他帖子,我认为我理解的是,如果我错了,请纠正我。函数 get_excerpt() 当前正在传递 0 个东西(参数)并且它期望至少传递 1 个?我
有人向我的库提交了一个拉取请求,其中一个参数是可选的,方法是将 function doSomething($var) 替换为 function doSomething($var = 'whatever
我制作了这个在数据库中执行 CRUD 操作的产品类,我在构造函数方法中出错: Fatal error: Uncaught ArgumentCountError: Too few arguments t
帮助我..我收到错误类型:ArgumentCountError消息:函数M_students::get_edit()的参数太少我想显示我的mysql表中的所有条目,但我不断收到错误信息。我是 Code
我有一个 Company有很多Employee s。在我的表单中,我希望用户能够动态添加员工(足够简单)。 EmployeeType (an AbstractType ) 是复合词,包含名字和姓氏。在
我在下面收到一条错误消息。我删除了表单以直接将值添加到 MySQL 中,但没有成功。我还将日期更改为 varchar 并多次计算所有参数。在类里面,我成功获取数据。这是一段代码。 问题出在哪里?提前致
我知道有一些与此相关的问题,但有 C++ 或其他语言的问题。我得到这个错误,我不确定我的功能有什么问题。 我的错误是这样的: Fatal error: Uncaught ArgumentCountEr
我收到以下错误: Fatal error: Uncaught ArgumentCountError: Too few arguments to function wpdb::prepare(), 1
我知道有一些与此相关的问题,但是有c++或其他语言。我收到此错误,但不确定我的功能出了什么问题。这是我的错误 Fatal error: Uncaught ArgumentCountError: Too
我是一名优秀的程序员,十分优秀!