Как сделать Laravel Нова как Поля - PullRequest
0 голосов
/ 16 января 2020

Я хочу создать класс для создания полей, но в Laravel Nova этот класс называется как Text::make()->placeholder() и т. Д. c. Это означает, что методы внутри этого класса имеют статус c.

Это мой класс поля:

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 () для каждого элемента в этом массиве, чтобы получить массив, каждый элемент возвращает имя и заполнитель последнего элемента, потому что это stati c. Как я могу решить это.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Вы можете сделать 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');
    }

    // ...
}
0 голосов
/ 16 января 2020

Я нашел решение. На самом деле мой друг Ниджат нашел))

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();
   }
}

Вам просто нужно создать конструктор, а затем вызвать его в методе stati c.

...