Черта не срабатывает, когда я использую конструктор - PullRequest
0 голосов
/ 17 марта 2020

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

trait LogUserDB
{
    public static function bootLogUserDB()
    {
        self::creating();

        self::updating(
            function ($model) {
                $user = Auth::user();
                if ($user !== null && $user->id >= 0 && Schema::hasColumn($model->table, 'updated_by')) {
                    $model->updated_by = $user->id;
            }
        });

        self::deleting();
    }
}

abstract class AbstractBaseModel extends Model
{
    use LogUserDB;

    public function loadInfoSchema(){}
}

И это мой класс, который я не могу использовать construtor

class EmailsModel extends AbstractBaseModel
{
    protected $table = 'cad_emails';
    protected $primaryKey = "id";

    public function __construtor($request){
        /**
         * If I create the constructor my field is not updated
         */
    }

}

В моем контроллере

Class XYZController extends BaseModel 
{
    $emailModel = new EmailsModel() 
    $emailEdit  = $emailModel->find(1);
    $emailEdit->email = 'teste@test.com';
    $emailEdit->save() // $emailEdit->update()

    dd('end');
}

Когда я запускаю этот пример без конструктора, мое поле «updated_by» обновляется с идентификатором пользователя, когда я использую конструктор, поле не обновляется

В чем проблема? Я понятия не имею, почему updated_by по полю не обновляется конструктором.

1 Ответ

1 голос
/ 17 марта 2020

Сначала вы должны следовать подписи конструктора в Model.php, которая:

public function __construct(array $attributes = [])
{
    // ...
}

Итак, ваш model должен быть таким:

public function __construtor(array $attributes = [], $request = null)
{
    parent::__construct($attributes); // This is required

    $this->request = $request;
}

Чтобы получить Чтобы вызвать родительский конструктор, необходимо вызвать метод parent::__construct($attributes), потому что traits загрузка выполняется в методе constructor в файле Model.php.

Если вы хотите построить свою модель сейчас, тогда вы может использовать что-то вроде этого:

// Assumed you've $request in the scope
$emailModel = new EmailsModel([], $request);

Для большей ясности отметьте Model.php, вы увидите что-то вроде этого:

public function __construct(array $attributes = [])
{
    $this->bootIfNotBooted();

    $this->initializeTraits();

    $this->syncOriginal();

    $this->fill($attributes);
}

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

Предложение: вам не нужно передавать $request в конструкторе, вы можете получить доступ к Request фасаду из модели если необходимо. Возможно, подумайте о дизайнерском решении ваших моделей. Кроме того, есть методы, доступные для создания, обновления и т. Д. c, вы можете использовать эти методы, не создавая модель вручную.

...