在我看来,为什么Laravel会覆盖我在控制器中使用模型中的变量声明的变量?

时间:2014-10-18 02:44:40

标签: php laravel scope blade

我是否错误地理解了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模型中的$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";

为什么会这样?控制器是否处理请求,从模型中获取信息,对其进行操作,然后将其传递到可以输出的视图中?如果是这种情况,为什么以及如何模型似乎正在跳跃'介于两者之间用自己的?

覆盖我的控制器编写的变量

2 个答案:

答案 0 :(得分:1)

我知道这已经过时了,但我今天刚刚在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 :(得分:0)

看看使用演示者,请Jeffery Way's Presenter Package。正常安装,然后您可以将$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>

这真的有助于保持这种&#34;演示&#34;逻辑超出您的视图和控制器。你应该努力保持你的控制器只是为了它的预期目的,处理路线和基本守卫,并保持你的观点逻辑无。

至于你的问题,你可能正在经历Laravel操作的自然顺序。