Laravel 6 мутатор не преобразует ноль в пустую строку - PullRequest
0 голосов
/ 24 января 2020

Я запускаю интеграционный тест и получаю следующую ошибку:

array:5 [
  "message" => "Argument 1 passed to App\Models\Order::getPhoneAttribute() must be of the type string, null given, called in /Users/bigweld/Sites/restaurantbe/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php on line 454"
  "exception" => "Symfony\Component\Debug\Exception\FatalThrowableError"
  "file" => "/Users/bigweld/Sites/restaurantbe/app/Models/Order.php"
  "line" => 87
  "trace" => array:44 [

Так что, похоже, это связано с моими мутаторами:

public function setPhoneAttribute(string $phone) : void
{
    $this->attributes[self::ORDER_PHONE] = empty($phone) ? "" : preg_replace("/[^A-Za-z0-9 ]/", '', $phone);
}

public function getPhoneAttribute(string $phone) : string
{
    return is_null($phone) ? "": preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~',
            '($1)-$2-$3', $phone);
}

мой тест не передает Order::ORDER_PHONE, что означает, что пустая строка должна храниться в базе данных. Если я объявлю поле в массиве данных вместе с другими полями, даже если оно пустое (ie: [ Order::ORDER_PHONE => "" ]), эта ошибка не появится.

Есть идеи, почему?

1 Ответ

0 голосов
/ 24 января 2020

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

public function getPhoneAttribute(?string $phone) : string
    {
        return preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~',
            '($1)-$2-$3', $phone);
    }
...