【问题标题】:How to make Laravel Nova like Fields如何让 Laravel Nova 像 Fields
【发布时间】:2020-05-03 14:53:32
【问题描述】:

我想创建类来创建字段,但在 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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以让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');
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 2019-02-22
      • 2019-10-25
      • 1970-01-01
      • 2019-04-06
      • 2021-01-10
      • 2021-01-20
      • 2021-11-27
      相关资源
      最近更新 更多