初探Laravel中命名规范

之前一直用Spring+Mybatis做WEB开发,由于公司的需要开始接触Laravel框架。不可否认确实被它所吸引,使用起来太优雅了。在这里不是说SSM这套解决方案不好,每个东西都有它存在的价值。Laravel使用起来这么优雅的原因我认为最大的原因是:约定优于配置

切入正题,使用规范的好处是让你编码更加清晰。

数据库命名

  • 建议使用复数名词作为表名,例如 users。
  • 多对多关系中中间表用单数作为表名,例如 article_image。
  • 数据库以及表名使用均使用小写英文字母,单词之间采用下划线为分割符,例如article_user。
  • 不要使用关键字作为数据库或表的名字,例如null,select等等。

文件命名

  • Migrate

    • 采用:动词 + _Table Name + _table,例如

      • create_users_table
      • alert_users_table
    • 保持上面的Table Name与迁移文件中的表名一致

<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0);">//2017_11_08_155329_create_articles_table.php的文件部分内容如下:</span> Schema::create(<span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">'articles'</span>, <span class="hljs-function" style="margin: 0px; padding: 0px;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">function</span> <span class="hljs-params" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102);">(Blueprint <span class="hljs-variable" style="margin: 0px; padding: 0px;">$table</span>)</span> {</span> <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0);">//注意actions是一样的</span> });<ul class="pre-numbering" style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 6px 0px 40px; list-style: none; line-height: 23.8px; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; border-right: 1px solid rgb(221, 221, 221); text-align: right;"><li style="margin: 0px; padding: 0px 5px; list-style: none; color: rgb(153, 153, 153);">1</li><li style="margin: 0px; padding: 0px 5px; list-style: none; color: rgb(153, 153, 153);">2</li><li style="margin: 0px; padding: 0px 5px; list-style: none; color: rgb(153, 153, 153);">3</li><li style="margin: 0px; padding: 0px 5px; list-style: none; color: rgb(153, 153, 153);">4</li></ul>- Model

  • 一律使用单数,例如 user,article

    • Seeder
  • ModelName + TableSeeder,例如:UserTableSeeder

    • resources目录下文件
  • resource下所有目录命名一律小写,单字间以下划线 “_” 分割.

方法

  • Model中方法体的命名规则
    在一对多与一对一等关联关系中是需要通过外键来建立业务关系的:

情况一:

```

class Post extends Model { /** * 获得此博客文章的评论。 */ public function comments() { return $this->hasMany('App\Comment'); } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
```Eloquent 会自动确定 Comment 模型上正确的外键字段。按照约定,Eloquent 使用父级模型名的「snake case」形式、加上 _id 后缀名作为外键字段。对应到上面的场景,就是 Eloquent 假定 Comment 模型对应到 Post 模型上的那个外键字段是 post_id。这里再次强调模型名(Model)最好用单数形式

情况二:

``` <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model { /** * 获得此评论所属的文章。 */ public function post() { return $this->belongsTo('App\Post'); } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
```在上面的例子中,Eloquent 会尝试用 Comment 模型的 post_id 与 Post 模型的 id 进行匹配。默认外键名是 Eloquent 依据关联名、并在关联名后加上 _id (也就是这里的方法名加上_id)后缀确定的。如果您的数据库没有做到上面的约束,请将相关的列添加上。虽然是可选参数,但是我的建议是最好把参数都写上。这样逻辑更加清晰,不易犯错。

情况三:
如果您没有给Model指定对应的数据库表,那么它默认会用类的【蛇形名称】,复数名称来作为数据表的名称,例如下面的例子中Eloquent 将会假设 Video模型被存储记录在 videos 数据表中,但是你可以在模型上定义一个 table 属性,用来指定自定义的数据表名称”my_videos”,建议加上$table属性:

``` <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Video extends Model { /** * 与模型关联的数据表 * * @var string */ protected $table = 'my_videos'; }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
```情况四:

多态关联中类型字段值最好自定义。

默认,Laravel 会使用完全限定类名作为关联模型保存在多态模型上的类型字段值。比如,在上面的例子中,Comment 属于 Post 或者 Video,那么 commentable_type的默认值对应地就是 App\Post 和 App\Video。但是,您可能希望将数据库与程序内部结构解耦。那样的话,你可以定义一个「多态映射表」来指示 Eloquent 使用每个模型自定义类型字段名而不是类名:

``` use Illuminate\Database\Eloquent\Relations\Relation;

Relation::morphMap([ 'posts' => 'App\Post', 'videos' => 'App\Video', ]);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
```您可以在 AppServiceProvider 中的 boot 函数中使用 Relation::morphMap 方法注册「多态映射表」,或者使用一个独立的服务提供者注册。

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容