Как разделить атрибуты модели для вьюхи и для другого использования?

У меня есть модель Tariff для такой таблицы
Schema::create('tariffs', function(Blueprint $table) {
  $table->increments('id');
  $table->string('title');
  $table->integer('salary')->unsigned()->default(0);
});

Поле salary отвечает за зарплату и может быть с копейками и его я в базе храню целым числом (умножаю на 100)
У меня есть вьюха
{{Form::model($tariff, ['method' => 'PATCH', 'route' => ['tariffs.update', $tariff->id]])}}
  {{ Form::text('salary', null, ['class' => 'form-control']) }}
{{Form::close()}}

В ней пользователь вводит сумму с копейками.
Для того чтобы в вьюхе показывало сумму в виде "10,45руб" я сделал
public function getSalaryAttribute() {
  return formatRubles($this->attributes['salary']);
}

Но теперь простое обращение к атрибуту salary обьекта модели Tariff мне возвращает отформатированное значение
Я сделал метод, но считаю этот выход некрасивым
public function salary() {
  return $this->attributes['salary'];
}

Есть другие решение моей проблемы?
  • Вопрос задан
  • 2253 просмотра
Пригласить эксперта
Ответы на вопрос 2
@miki131 Автор вопроса
Подумал, подумал и... чтобы в модель не кидать не связанные с ней вещи такие как formatRubles, надо вынести все в вьюху получилось такое
{{Form::model($tariff, ['method' => 'PATCH', 'route' => ['tariffs.update', $tariff->id]])}}
  {{ Form::text('salary', isset($tariff) ? formatRubles($tariff->salary) : null, ['class' => 'form-control']) }}
{{Form::close()}}

Думаю, максимум что можно расширить в этой ситуации расширить возможности Form Model Binding для автоматической проверки isset($tariff)
Ответ написан
Комментировать
ajaxtelamonid
@ajaxtelamonid
Laravel
Так действительно не стоит делать. Модель должна отдавать чистые данные, а для отображения во вьюхах юзайте добавочные функции. Уберите getSalaryAttribute() и сделайте в модели метод displaySalaryInRoubles() для использования во вьюхах, где форматируйте сумму как хотите.
Если из идеологических соображений не хотите нагружать ActiveRecord-модель лишними методами, сделайте через такой презентер, например - https://github.com/laracasts/Presenter . Будет $object->present()->displaySalary . Хотя я бы сделал первый вариант.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы