我想创建用于创建字段的类,但是在Laravel Nova中,该类称为Text::make()->placeholder()
等。这意味着该类中的方法是静态的。
这是我的领域课:
class Field
{
private $field = [];
public function set($key, $value)
{
$this->field[$key] = $value;
}
public function get()
{
return $this->field;
}
}
class Text
{
private static $field;
public static function make($name)
{
self::$field = new Field;
self::$field->set('@saturn_type', 'string');
self::$field->set('@saturn_key', $name);
self::$field->set('@saturn_field', 'text');
return new Text;
}
public function placeholder($value)
{
self::$field->set('placeholder', $value);
return $this;
}
public function required()
{
self::$field->set('required', true);
return $this;
}
public function translate()
{
self::$field->set('translate', true);
return $this;
}
public function wysiwyg()
{
self::$field->set('wysiwyg', true);
return $this;
}
public function get()
{
return (array) self::$field->get();
}
}
这就是我所说的:
$fields = [
Text::make('name')->placeholder('Full Name'),
Text::make('email')->placeholder('Email'),
Text::make('password')->placeholder('Password'),
]
$lastArray = $fields->map(function ($field) {
return $field->get();
}
);
但是当我为该数组中的每个项目调用get()方法以获取数组时,每个项目都会返回最后一个项目的名称和占位符,因为它是静态的。我该如何解决。
我找到了解决方案。其实我的朋友Nijat找到了))
class Field
{
private $field = [];
public function set($key, $value)
{
$this->field[$key] = $value;
}
public function get()
{
return $this->field;
}
}
class Text
{
private $field;
public function __construct($name)
{
$this->field = new Field;
$this->field->set('@saturn_type', 'string');
$this->field->set('@saturn_key', $name);
$this->field->set('@saturn_field', 'text');
}
public static function make($name)
{
return new Text($name);
}
public function placeholder($value)
{
$this->field->set('placeholder', $value);
return $this;
}
public function required()
{
$this->field->set('required', true);
return $this;
}
public function translate()
{
$this->field->set('translate', true);
return $this;
}
public function wysiwyg()
{
$this->field->set('wysiwyg', true);
return $this;
}
public function get()
{
return (array) $this->field->get();
}
}
您只需要创建构造函数,然后在静态方法中调用它即可。
您可以使Text
继承自Field
,并具有更简单的make
方法:
class Field
{
public static function make(...$arguments)
{
return new static(...$arguments);
}
// ...
}
这将实例化父类(例如Text
)并返回它,使您可以保持链接。在这些方法中,您可以照常使用$this->
(而不是self::
)。并将Text::make
的内容移到构造函数中:
class Text extends Field
{
public function __construct($name)
{
$this->set('@saturn_type', 'string');
$this->set('@saturn_key', $name);
$this->set('@saturn_field', 'text');
}
// ...
}