Динамическое добавление методов доступа в класс модели Laravel


Динамическое добавление методов доступа в класс модели Laravel

20.09.2020 10:02:48 Просмотров 5 Источник

У меня есть имена функций построенные так как я хочу в массиве которые являются динамическими по своей природе то есть они могут быть 2 или 10 примерно так:

enter image description here

Результат

Я хочу, чтобы они находились в классе модели (например, пользователь), как это:

public function getEmailVerifiedAtAttribute($value)
{
  // ...
}

public function getCreatedAtAttribute($value)
{
  // ...
}

public function getUpdatedAtAttribute($value)
{
  // ...
}

// ... If there were more in array they would have been constructed dynamically as well.

Если мы можем избежать эвала, пожалуйста!!

У вопроса есть решение - Посмотреть?

Ответы - Динамическое добавление методов доступа в класс модели Laravel / Dynamically add accessor methods in Laravel Model Class

Является ответом!
apokryfos

20.09.2020 01:05:14

Вы можете иметь некоторый ограниченный успех, делая что-то подобное в своей модели:

public function hasGetMutator($key) {
   return parent::hasGetMutator($key) || in_array('get'.Str::studly($key).'Attribute', $youArratOfDynamicMutators);
}

protected function mutateAttribute($key, $value)
{
        if (parent::hasGetMutator($key)) {
           return parent::mutateAttribute($key, $value);
        }
        // Mutate your value here
        return $value;
}

Это переопределяет метод hasGetMutator, который обычно просто проверяет, существует ли функция 'get'.Str::studly($key).'Attribute' в классе, чтобы также вернуть true, если это имя функции существует в вашем массиве, а также изменяет функцию mutateAttribute для выполнения вашей пользовательской мутации (в дополнение к выполнению стандартных).

Однако если ваша мутация является стандартной, то я рекомендую использовать вместо нее пользовательское приведение:

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class MyCustomCast implements CastsAttributes
{

    public function get($model, $key, $value, $attributes) {
        // Do the cast
        return $value;
    }

    //Optional
    public function set($model, $key, $value, $attributes)
    {
        // Reverse the cast 
        return $value;
    }
}

Чтобы заставить это работать для динамических атрибутов, вы можете добавить это в свою модель:

protected function __construct(array $attributes = [])
{
    parent::__construct($attributes);
    $this->casts = array_merge($this->casts, [
        'customCastColumn1' => MyCustomCast::class,
         // ...
    ]);
}

Это добавит необходимые приведения к модели, когда она будет построена.

Помочь в развитии проекта:
Закрыть X