Я правильно понимаю шаблон проектирования MVC? Почему Laravel, по-видимому, перезаписывает переменные, которые я объявляю в контроллере, и перехожу в мои представления с теми из моей модели? Скажи, что я передаю переменную $journey
с моего контроллера на мой взгляд так:
class JourneyController extends BaseController {
public function journey($id) {
$journey = Journey::find($id);
// I overwrite one of the attributes from the database here.
$journey->name = "Overwritten by the Controller";
return View::make('journey', array(
'journey' => $journey,
'bodyClass' => 'article'
));
}
}
Но я использую средство доступа, чтобы также изменить $journey->name
атрибут в моей модели путешествия:
class Journey extends Eloquent {
protected $table = 'journeys';
protected $primaryKey = 'id';
public $timestamps = false;
public function getNameAttribute($value) {
return 'Overwritten by the Model';
}
}
Поэтому, когда мое представление создано, и я отображаю $journey->name
вот так:
{{ $journey->name }}
Я остался с:
"Overwritten by the Model";
Почему это происходит? Разве контроллер не обрабатывает запрос, не извлекает информацию из моей модели, не обрабатывает ли ее, а затем передает ее в представление, где ее можно вывести? Если это так, то почему и как модель «прыгает» между ними, чтобы перезаписать мою переменную, записанную в контроллере, своей собственной?
Я знаю, что это старо, но я только что нашел решение на Laravel 4.2 сегодня.
class Journey extends Eloquent {
protected $table = 'journeys';
protected $primaryKey = 'id';
public $timestamps = false;
public function getNameAttribute($value = null) {
if($value)
return $value;
return 'Overwritten by the Model';
}
}
Вы должны обновить функцию getNameAttribute, как указано выше, чтобы она возвращала установленное значение (если оно есть) вместо того, чтобы всегда возвращать строку. Ранее вызов этого значения всегда выполнял функцию и игнорировал установленное значение, но теперь функция сначала проверяет значение, которое вы установили.
Надеюсь, 2 года еще не слишком поздно, чтобы помочь некоторым людям!
Взгляните на использование Presenters, Take Пакет презентера Джеффри Уэя. Установите его как обычно, а затем вы можете добавить $presenter
переменная для вашей модели.
Например:
use Laracasts\Presenter\PresentableTrait;
class Journey extends Eloquent {
use PresentableTrait;
protected $presenter = "JourneyPresenter";
}
Затем вы можете создать свой класс JourneyPresenter:
class JourneyPresenter {
public function journeyName()
{
return "Some Presentation Name";
}
}
На ваш взгляд, вы можете назвать это так:
<h1>Hello, {{ $journey->present()->journeyName }}</h1>
Это действительно помогает скрыть такую логику представления от вашего взгляда и контроллера. Вы должны постараться сохранить свой контроллер исключительно по его прямому назначению, обрабатывать маршруты и основные средства защиты и не допускать логических представлений.
Что касается вашей проблемы, вы можете просто испытывать естественный порядок операций Laravel.