Laravel 开发规范摘要

澳门新葡亰娱乐在线 1

1. 定义关联模型

在Laravel里面,我们可以通过定义以下Model来完成关联查询。

class MyPost extends Eloquent {
    public function myPostInfo () {
        return $this->hasOne('MyPostInfo');
    }
}

class MyPostInfo extends Eloquent {}

环境说明

一般情况下,一个项目 应该 有以下三个基本的项目环境:

  • Local – 开发环境
  • Staging – 线上测试环境, develop 分支
  • Production – 线上生产环境, master 分支

2. 使用关联模型

这里myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:

$post = MyPost::find(1);
$post_info = $post->myPostInfo; // example 1
$post_info = $post->my_post_info; // example 2

Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。

开发专用扩展包

3. 缓存失效

如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如

$post_info = $post->myPostInfo; 
// $post->relations = [‘myPostInfo’ => ..];

$post_info = $post->my_post_info;
// $post->relations = [‘myPostInfo’ => …, ‘my_post_info’ => …];

所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel
Case.

安装

安装开发专用扩展包时 必须 使用 --dev 参数,如:

composer require laracasts/generators --dev

4. toArray() 方法失效

如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake
Case命名的关联模型,没有的话才去看Camel Case的。

所以如果用到了toArray()方法来转换Model,切忌同时使用两者。

加载

开发专用的 provider 绝不在 config/app.php 里面注册,必须在

app/Providers/AppServiceProvider.php 文件中使用如以下方式:

public function register()
{
    if ($this->app->environment() == 'local') {
        $this->app->register('LaracastsGeneratorsGeneratorsServiceProvider');
    }
}

5. 容易犯错的位置

最容易犯错的代码是这样的:

MyPost::with(‘myPostInfo’)->get();

在使用With去eagerLoad关联模型时,必须使用和定义方法同名的key去读取,那么这样读取出来的方法只能是Camel
Case的key。其他地方就只能用

$my_post->myPostInfo;

来保证不出问题。

配置信息与环境变量

在此统一规定:所有程序配置信息 必须 通过 config() 来读取,所有的
.env 配置信息 必须 通过 config() 来读取,绝不
在配置文件以外的范围使用 env()

Show
Detail

辅助函数

必须 把所有的『自定义辅助函数』存放于 bootstrap 文件夹中。

澳门新葡亰娱乐在线,并在 bootstrap/app.php 文件的最顶部进行加载:

<?php

require __DIR__ . '/helpers.php';

...

代码风格

代码风格 必须 严格遵循 PSR-2
规范。所以使用代码格式化插件要配置为PSR-2

路由器

路由闭包

绝不
在路由配置文件里书写『闭包路由』或者其他业务逻辑代码,因为一旦使用将无法使用
路由缓存

路由器要保持干净整洁,绝不 放置除路由配置以外的其他程序逻辑。

Restful 路由

必须 优先使用 Restful 路由,配合资源控制器使用,见
文档。

澳门新葡亰娱乐在线 1

Alt text

使用 resource 方法时,如果仅使用到部分路由,必须 使用 only
列出所有可用路由:

Route::resource('photos', 'PhotosController', ['only' => ['index', 'show']]);

使用 except,对于新增方法没有保护作用,而 only
相当于白名单,相对于 except
更加直观。路由使用白名单有利于养成『安全习惯』。

路由模型绑定

在允许使用路由 模型绑定 的地方 必须 使用。

模型绑定代码 必须 放置于 app/Providers/RouteServiceProvider.php
文件的 boot 方法中:

public function boot()
{
    Route::bind('user_name', function ($value) {
        return User::where('name', $value)->first();
    });

    Route::bind('photo', function ($value) {
        return Photo::find($value);
    });

    parent::boot();
}

全局路由器参数

出于安全考虑,应该 使用全局路由器参数限制,详见
文档。

必须RouteServiceProvider 文件的 boot 方法里定义模式:

/**
 * 定义你的路由模型绑定,模式过滤器等。
 *
 * @param  IlluminateRoutingRouter  $router
 * @return void
 */
public function boot(Router $router)
{
    $router->pattern('id', '[0-9]+');

    parent::boot($router);
}

模式一旦被定义,便会自动应用到所有使用该参数名称的路由上:

Route::get('users/{id}', 'UsersController@show');
Route::get('photos/{id}', 'PhotosController@show');

只有在 id 为数字时,才会路由到控制器方法中,否则 404 错误。

路由命名

除了 resource 资源路由以外,其他所有路由都 必须 使用 name
方法进行命名。

Route::post('users/{id}/follow', 'UsersController@follow')->name('users.follow');

数据模型

放置位置

所有的数据模型文件,都 必须 存放在:app/Models/ 文件夹中。
命名空间:

namespace AppModels;

忽略此块

User.php 初始化模型处理

Laravel 5.5 默认安装会把 User 模型存放在 app/User.php必须
移动到 app/Models 文件夹中,并修改命名空间声明为 App/Models
为了不破坏原有的逻辑点,必须 全局搜索 App/User 并替换为
App/Models/User

使用基类

所有的 Eloquent 数据模型 都 必须 继承统一的基类
App/Models/Model,此基类存放位置为
/app/Models/Model.php,内容参考以下:

<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel as EloquentModel;

class Model extends EloquentModel
{
    public function scopeRecent($query)
    {
        return $query->orderBy('created_at', 'desc');
    }
}

以 Photo 数据模型作为例子继承 Model 基类:

namespace AppModels;

class Photo extends Model
{
    protected $fillable = ['id', 'user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图