Атрибут по умолчанию со случайными значениями в модели laravel - PullRequest
0 голосов
/ 04 января 2019

В моем проекте laravel я хочу установить случайное значение по умолчанию для каждой новой созданной записи.

Согласно этому документу , я пытаюсь это:

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class User extends Authenticatable
{
    protected $fillable = [
       'access_token'
    ];

    protected $attributes = [
        'access_token' => str::uuid()
    ];
}

Но я получаю ошибку для protected $attributes строки

"Constant expression contains invalid operations"

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Проблема возникает из-за способа, которым вы вызываете функцию uuid.

Поскольку он статический, вам нужно получить к нему доступ, используя

Str::uuid()

И это вернет объект, поэтому, чтобы извлечь из него строку, вам нужно будет привести результат.

(string) Str::uuid()

Следовательно, по сути, ваше свойство атрибутов должно быть;

protected $attributes = [
    'access_token' => (string) Str::uuid()
];

Вы можете взглянуть на документы

0 голосов
/ 04 января 2019
protected $attributes = [
    'access_token' => ''
];

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
    $this->attributes['access_token'] = Str::uuid();
}

В php невозможно вызвать функцию из свойства

0 голосов
/ 04 января 2019

Это потому, что свойства не могут содержать выражения, которые они не могут оценить во время компиляции. Из официальной документации .

Переменные-члены класса называются «свойствами». Вы также можете увидеть их упоминается с использованием других терминов, таких как «атрибуты» или «поля», но для целей этой ссылки мы будем использовать «свойства». Они есть определяется с помощью одного из ключевых слов public, protected или private, сопровождаемый нормальным объявлением переменной. Эта декларация может включить инициализацию, но эта инициализация должна быть постоянной значение - то есть оно должно быть в состоянии быть оценено во время компиляции и не должен зависеть от информации времени выполнения для оценки.

Еще один способ сделать это - события модели . В методе boot() вашей пользовательской модели вы можете подключиться к событию Creating. Если этот метод не существует, создайте его.

public function boot()
{
    parent::boot();

    static::creating(function($user) {
        $user->access_token = (string) Str::uuid();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...