如何制作Laravel Nova像田地一样

问题描述 投票:0回答:2

我想创建用于创建字段的类,但是在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()方法以获取数组时,每个项目都会返回最后一个项目的名称和占位符,因为它是静态的。我该如何解决。

php laravel class static
2个回答
0
投票

我找到了解决方案。其实我的朋友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();
   }
}

您只需要创建构造函数,然后在静态方法中调用它即可。


0
投票

您可以使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');
    }

    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.