Laravel 建议写法指南

Laravel 优雅的框架,同时提供了大量灵活并且神奇的写法。但越灵活,在一些方面可能会存在小问题。

以下列出 Laravel 不太建议的写法,仅大家讨论与参考。如果可能的话在评议区说出你的看法吧。

Request 问题

Request 参数可以通过动态属性获取,如以下写法:

$name = $request->name;

该写法非常不建议,原因是如果属性名称为 query 或者 content 之类原本类的属性,就会产生非预期效果。除非你把所有该类的所以关键词都记住(就算你记住所有的属性,你也保证不了下个版本会不会加新的属性),否则你早晚会遇到这个坑。比较不建议使用,建议使用如下方式:

// 可以用这种方式
$name = $request->input('name');

// 或用这种方式
$input = $request->all();
$name = $input['name'];

总结:不使用 request 动态属性。

Model appends

class User extends Model
{
  protected $appends = ['is_adult'];

  public function getIsAdultAttribute()
  {
      return $this->attribute['age'] > 18;
  }
}

getXxxAttribute是一个很用的特性,但如果model中自动append就会产生很多问题,如你在select的时候,没有age字段,依然会帮你加上append的字段,这有时会带来很多问题。建议不使用$append这个属性。在需要的时候,在controller层加载这个属性。

// model
class User extends Model
{
  public function getIsAdultAttribute()
  {
      return $this->attribute['age'] > 18;
  }
}

// controller
$user = User::first();
$user->append('is_adult');

总结:不使用 model 的 appends。

Model 的动态属性

// 第1种写法
$user = User::first();
// ?? 此动态属性如果是表字段名称是如 exists 等就会出问题。
$name = $user->name;

// 第2种写法更安全
$user = User::first()->toArray();
$name = $user['name'];

Model 在使用对象时也有动态属性,也同样会产生冲突问题(一般不太可能触发到),但数据表字段尽可能不出现下关键词。(虽然第2种写法更安全,但相信更多人更喜欢第一种写法吧,我们避免数据库字段如下关键词就好了。我也喜欢用第1种写法。)

// /vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php 
exists,
incrementing
timestamps
wasRecentlyCreated

本文会不定期更新,希望用Laravel的人一起分享你们的使用建议。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

第二点学习到了

1周前 评论

第一点建议:

$request->input('name', 'default');

如果参数中没有name字段,你那种直接用数组的方式会报错的。

第二点赞同

1周前 评论
Y90 (楼主) 1周前

file
原因是如果属性名称为 query 或者 content 之类原本类的方法
都是方法多 属性成员就这几个
url /?content=1 $request->content会优先拿路由的content

1周前 评论
Tsukasa_Kanzaki 6天前
Y90 (楼主) 1周前
ShiKi

最后一个好用 :smirk:

1周前 评论

请教一下,这里的append是单个记录使用,如果查询是多个集合的,怎么使用append?
例如:

Customer::query()->get(); // 这里怎么给每一个数据都加上append? 查询出来写一个each?
1周前 评论
Y90 (楼主) 6天前
nff93 5天前
nff93 6天前
Y90 (楼主) 5天前
Y90 (楼主) 5天前

这个很赞 最佳实践的最佳实践 虽然laravel已经算是很有约束的php框架了 但还是太灵活了

1周前 评论
蔺焕然

赞成第二条

6天前 评论
class User extends Model
{
  public function getIsAdultAttribute()
  {
      return $this->attribute['age'] ?? 0 > 18;
  }
}
6天前 评论

借个楼问下,laravel的model里可以显示声明字段属性吗? 比如 public $id; public $title; 这样 不然 Property accessed via magic method 这个提示好烦。。

2天前 评论
Y90 (楼主) 2天前

我是新手,一直都是用$id = $request->id;这个方式获取路由中的参数,请问有其它的好办法么?

2天前 评论
Y90 (楼主) 2天前
芝麻开门 (作者) 6小时前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
5
收藏
5
排名:1453
访问:779
私信
所有博文