На мой взгляд, почему Laravel объявляет переменные, которые я объявляю в контроллере, переменными из моей модели?

Я правильно понимаю шаблон проектирования 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";

Почему это происходит? Разве контроллер не обрабатывает запрос, не извлекает информацию из моей модели, не обрабатывает ли ее, а затем передает ее в представление, где ее можно вывести? Если это так, то почему и как модель «прыгает» между ними, чтобы перезаписать мою переменную, записанную в контроллере, своей собственной?

0

Решение

Я знаю, что это старо, но я только что нашел решение на 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 года еще не слишком поздно, чтобы помочь некоторым людям!

1

Другие решения

Взгляните на использование 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.

0

По вопросам рекламы [email protected]