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的人一起分享你们的使用建议。