Как загрузить данные с помощью нового самостоятельного построения php - PullRequest
0 голосов
/ 16 июня 2019

Я не могу загрузить данные в свойства, используя эту конструкцию. Я получаю ноль в дампе

<?php

namespace App\Domain\Good;


        class GoodDto
        {

            public $name;
            public $articul;
            public $price;
            public $type;
            public $qnt;
            public $discount;
            public $category;
            public $description;
            public $description2;
            public $color;


            public function load($data)
            {
                $this->name = $data['name'];
                $this->articul = $data['artikul'];
                $this->price = $data['price'];
                $this->type = (isset($data['type'])) ? $data['type'] : null;
                $this->qnt = $data['count'];
                $this->discount = $data['spinner-decimal'];
                $this->category = $data['id_cat'];
                $this->description = $data['editor1'];
                $this->description2 = '';
                $this->color = $data['color'];
                //$this->user_id = Auth::user()->id;
            }

            public static function fromRequest($request)
            {
                dump('inp=>',(new self ())->load($request->input()));
                return (new self ())->load($request->input());

            }
        }

Пожалуйста, объясните мне, почему я получаю null, а request-> input () является массивом, я вызываю его из другого места

$dto=GoodDto::fromRequest($request);

1 Ответ

1 голос
/ 16 июня 2019

Метод цепочки, возвращает последний возврат из цепочки.Другие возвраты используются для вызова следующей ссылки в цепочке.

(new self ())->load()

Так что load() необходимо вернуть $this

 public function load($data)
 {
      ...
     return $this; 
 }

В настоящее время возвращается null, чтоВот почему он возвращает ноль.

Видите, вы не сохраняете экземпляр из конструктора, вместо этого вы передаете его для загрузки, заключая его в (....).Под пропуском я подразумеваю, что вы вызываете метод load для возврата из конструктора.

Вы можете проверить это следующим образом:

class foo{

    function load(){
        return $this;//return this
    }
}

var_dump((new foo)->load());

class bar{

    function load(){
       //return null
    }
}

var_dump((new bar)->load());

Выход

 //return this
object(foo)#1 (0) {
}
//return null
NULL

sandbox

Второй класс в приведенном выше примере class bar, по сути, то, что вы делаете.

PS.забыл прокрутить вниз ваше сообщение сначала ... смеется ... Так что мне пришлось обновить мой ответ.

Бонус

Вы также можете упростить код загрузкинапример:

   public function load($data)
   {
      foreach($data as $prop=>$value){
          if(property_exists($this,$prop)) $this->$prop = $value;
      }
      return $this;
   }

Таким образом, если вы добавляете новые свойства, вам больше не нужно редактировать метод load, вам просто нужно присвоить элементам массива имена, совпадающие со свойствами класса.Вы можете даже выдать ошибку, если свойство не существует, если хотите, добавив else к условию и т.д. ...

Лично, когда я делаю это, я предпочитаю вызывать метод set, подобный этому:

   //eg. $data = ['foo' => '2019-06-16']
   public function load(array $data)
   {
      foreach($data as $prop=>$value){
          $method = 'set'.$prop;  //$method = 'setfoo' using the example above
          if(method_exists($this,$method )){
              $this->$method($value); //calls 'setfoo' with '2019-06-16'
          }else{
              throw new Exception('Unknown method '.$method);
          }
      }
      return $this;
   }

   public function setFoo($date){
       $this->foo = new DateTime($date);
   }

Затем вы можете применить некоторые преобразования к данным и т.д ... Имена методов PHP не чувствительны к регистру.Вы даже можете объединить их, сначала проверив метод, затем свойство, затем выдав ошибку и т. Д.

Cheers.

...