Php Zend Framework 2-用于条令和注释表单的神奇Getter和Setter
我读到一个神奇的getter-and-setter函数,它取代了大量的标准getter和setter。() 我更改了Miles的函数,因为我使用的是Php Zend Framework 2-用于条令和注释表单的神奇Getter和Setter,php,doctrine-orm,zend-framework2,zend-db,magic-methods,Php,Doctrine Orm,Zend Framework2,Zend Db,Magic Methods,我读到一个神奇的getter-and-setter函数,它取代了大量的标准getter和setter。() 我更改了Miles的函数,因为我使用的是注释表单,不希望在变量中使用下划线,如$\u name。我更新了魔法函数,但当尝试调用例如getName()时,我得到: 致命错误:调用未定义的方法。。。实体::getName() 这是我的密码: <?php namespace Entity; use Doctrine\ORM\Mapping as ORM; use Zend\Form\Ann
注释表单
,不希望在变量中使用下划线,如$\u name
。我更新了魔法函数,但当尝试调用例如getName()
时,我得到:
致命错误:调用未定义的方法。。。实体::getName()
这是我的密码:
<?php
namespace Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation as Form;
/**
* @ORM\Entity
* @ORM\Table(name="masterdata_entity")
* @Form\Name("entity")
* @Form\Attributes({ "class": "form-horizontal" })
* @Form\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
*/
class Entity
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Form\Exclude()
*/
protected $id;
/**
* @ORM\Column(type="string")
* @Form\Filter({"name":"StringTrim"})
* @Form\Validator({"name":"StringLength", "options":{"min":1, "max":50}})
* @Form\Attributes({"type":"text"})
* @Form\Options({"label":"Name"})
*/
protected $name;
public function __get($property) {
return (isset($this->{$property}) ? $this->{$property} : null);
}
public function __set($property, $value) {
if (isset($this->{$property})) {
$this->{$property} = $value;
}
}
public function __isset($property) {
return isset($this->{$property});
}
}
我想我的评论是对的。检查,您将看到它基本上使用。查看
extract()
-函数,您可以看到所有类方法都将在
看一看,您会发现只有默认的gettergetX、hasX、isX
才是有效的:
if (!preg_match('/^(get|has|is)[A-Z]\w*/', $method)) {
continue;
}
这最终意味着,你将永远要写你的二传手和后传手。即使文件大小可能会变大一点。这对于普通的IDE更好,而且它也是一个性能提升,即使文件大小也是如此。请提供您的实体代码,这是需要的部分:D实际上,我刚刚想到的是,我认为水合器不适用于神奇的功能。他们需要实际的getter和setter才能调用。Iirc,他们检查函数是否存在请查看更新的注释,但我会检查它,因为您需要定义
\u set()
和\u get()
魔术方法。这也不是Zend或条令式的方法,而是。谢谢。实现了自己的setter后,编辑变量时会出现以下错误:致命错误:无法访问受保护的属性
。我的属性受到保护,几乎每个示例都显示了这一点。。。你知道我做错了什么吗?当然,你使用的是\Zend\Stdlib\Hydrator\ObjectProperty
。由于您使用的是DoctrineTities,因此要使用的正确水合器应该是\DoctrineModule\Stdlib\Hydrator\DoctrineObject
谢谢。。。但现在我得到了以下信息:Catchable致命错误:传递给DoctrineModule\Stdlib\Hydrator\DoctrineObject的参数1::\uu construct()必须实现接口条令\Common\Persistence\ObjectManager,未给出,在第566行的…\vendor\zendframework\zendframework\library\Zend\Form\Factory.php中调用,并在第63行的…\vendor\doctrine\DoctrineModule\src\DoctrineModule\Stdlib\Hydrator\DoctrineObject.php中定义。我的教义版本至少应该设置为v2.1Ah是的,关于这个,呃。。。DoctrineObject或需要ObjectManager/EntityManager作为参数。我不知道如何使用AnnotationForms实现这一点。也许可以尝试使用classor方法。它可能也有用,但我真的不太了解注释形式。我手工创建表格我在这里新开了一期:
if (!preg_match('/^(get|has|is)[A-Z]\w*/', $method)) {
continue;
}