【问题标题】:Proper Use of Accessors in Laravel在 Laravel 中正确使用访问器
【发布时间】:2014-10-26 13:28:03
【问题描述】:

我是 Laravel 的新手,正在构建一个简单的 CRUD 应用程序来了解有关该框架的更多信息。我很好奇正确使用访问器。

我认为访问器非常适合格式化模型的属性以在视图中显示,就像 Angular 中的过滤器一样。目前,我设置了一些访问器来将 char(1) 字段转换为视图中的完整值,例如将“c”转换为现金或将“f”转换为融资。这是访问器的预期(或可接受的)用途吗?如果是这样,有什么好方法可以防止访问者格式化绑定到表单的属性,例如在编辑路径中。

例如,我在 db 中将货币金额存储为小数,但使用字符 ($150,00) 对其进行格式化,以便在显示路线中显示。如何防止访问者在填充编辑表单时更改值? (验证将失败,因为输入仅限于数值)。

http://laravel.com/docs/4.2/eloquent#accessors-and-mutators

http://laravel.com/docs/4.2/html#form-model-binding

【问题讨论】:

    标签: laravel eloquent accessor


    【解决方案1】:

    一切都取决于您的需求。关键是您不需要为实际的列/属性创建访问器。例如,让我们在 DB 中假设您有价格字段。

    使用以下代码:

    $model = Model::find(1);
    echo $model->price;
    

    您可以显示行价格只是为了显示数据库中的数据。

    但您也可以为不存在的属性创建访问器:

    public function getCurPriceAttribute($value)
    {
         return '$ '.($this->price * 1.08); // for example adding VAT tax + displaying currency
    }
    

    现在你可以使用了:

    $model = Model::find(1);
    echo $model->price;
    echo $model->cur_price;
    

    现在,如果您想将数据放入表单中,您将使用$model->price 以允许用户在不使用货币的情况下更改它,而在您希望使用货币显示产品价值的其他地方,您将使用$model->cur_price

    【讨论】:

    • 请注意,您也可以反过来...如果您希望price通常$150,00 的格式返回,但只需要未格式化的版本几个地方,您可以设置类似public function getPriceRawAttribute($value) { return ($this->price); } 并致电$model->price_raw 获取您的表格。
    • @damiani - 实际上你可以通过 $model->getOriginal('price') 强制 Eloquent 在任何格式化之前返回原始值。无需为它设置其他功能。
    • 那么这与仅在 Model 类上使用方法有什么不同,例如 $model->currentPrice ?这样做有什么好处?
    • 不确定我做错了什么,但我无法让它在 laravel 5.1 上运行。公共函数 getMyTitleAttribute($value) { return strtoupper($this->title);我在我的视图中得到了未定义的属性:stdClass::$my_title 错误。
    • 很高兴知道这一点。我认为 Laravel 文档并没有很好地说明这种能力。
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2013-03-20
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2014-03-04
    • 2015-04-01
    • 2015-01-31
    相关资源
    最近更新 更多