Почему аксессор Laravel срабатывает при вставке?

Я не уверен, как они работают, я думал, что аксессор срабатывает при доступе к атрибуту, однако, когда я пытаюсь вставить новую запись, мой аксессор срабатывает. Я храню в своей базе данных только image_name, удаляя URL-адрес, и я использую метод доступа, чтобы включить свой маршрут URL-адреса, когда я получаю имя своего изображения. Я узнал, что мой метод доступа срабатывает при вставке и изменении ввода:

ImageRepository.php

public function save($imageData)
{
    $this->model->owner()->associate(auth()->user());
    $this->model->type       = $imageData->type;
    $this->model->image_name = $imageData->image_url;
    $this->model->save();

    return $this->model;
}

Изображение.php

public function getImageNameAttribute($value)
{
    $filePath = 'my_path';

    // check if method was hit
    logger()->info('getImageNameAttribute: '.$value);

    // return default image if not found
    if ($value == '' || $value == null || Str::contains($value, 'no-image.png') || !File::exists(public_path($filePath))) {
        return asset('img/no-image.png');
    } else {
        return asset($filePath);
    }
}

Входные данные для $imageData->image_url:
https://some-random-image-url/image-name.jpg

Вставленные данные:
img/no-image.png

Исключенный вывод (у меня есть функция, извлекающая имя из URL):
image-name.jpg

Когда я проверяю журнал, я получаю сообщение:

getImageNameAttribute: https://some-random-image-url/image-name.jpg< /а>

Может кто-нибудь объяснить мне, если я делаю что-то не так, или это работает как будто?


person Steve    schedule 29.03.2020    source источник


Ответы (1)


Я решил проблему, я пропустил проверку. На самом деле вставленная запись в моей базе данных верна:

image-name.jpg

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

img/no-image.png

Потому что, когда срабатывает dd(), также срабатывает метод доступа (поскольку мы извлекаем данные), и поскольку изображение не было загружено, оно фактически показывало правильные данные.

person Steve    schedule 29.03.2020