Динамическое добавление методов доступа в класс модели Laravel
У меня есть имена функций построенные так как я хочу в массиве которые являются динамическими по своей природе то есть они могут быть 2 или 10 примерно так:
Результат
Я хочу, чтобы они находились в классе модели (например, пользователь), как это:
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

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,
// ...
]);
}
Это добавит необходимые приведения к модели, когда она будет построена.