首页 > 作文

Laravel 最佳实践

更新时间:2023-04-07 13:08:49 阅读: 评论:0

单一职责原则

一个类和一个方法应该只有一个责任。

例如:

public function getfullnameattribute(){    if (auth()->ur() && auth()->ur()->hasrole('client') && auth()->ur()->isverified()) {        return 'mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;    } el {        return $this->first_name[0] . '. ' . $this->last_name;    }}

更优的写法:

public function getfullnameattribute(){    return $this->isverifiedclient() ? $this->getfullnamelong() : $this->getfullnameshort();}public function isverifiedclient(){    return auth()->ur() && auth()->ur()->hasrole('client') && auth()->ur()->isverified();}public function getfullnamelong(){    return 'mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this无缘的牵挂->last_name;}public function getfullnameshort(){    return $this->first_name[0] . '. ' . $this->last_name;}

保持控制器的简洁

如果您使用的是查询生成器或原始sql查询,请将所有与数据库相关的逻辑放入eloquent模型或repository类中。

例如:

public function index(){    $clients = client::verified()        ->with(['orders' => function ($q) {            $q->where('created_at', '>', carbon::today()->subweek());        }])        ->get();    return view('index', ['clients' => $client像的比喻句s]);}

更优的写法:

public function index(){    return view('index', ['clients' => $this->client->getwithneworders()]);}class client extends model{    public function getwithneworders()    {        return $this->verified()            ->with(['orders' => function ($q) {                $q->where('created_at', '>', carbon::today()->subweek());            }])            ->get();    }}

使用自定义request类来进行验证

把验证规则放到 request 类中.

例子:

public function store(request $request){    $request->validate([        'title' => 'required|unique:posts|max:255',        'body' => 'required',        'publish_at' => 'nullable|date',    ]);    ....}

更优的写法:

public function store(postrequest $request){        ....}class postrequest extends request{    public function rules()    {        return [            'title' => 'required|unique:posts|max:255',            'body' => 'required',            'publish_at' => 'nullable|date',        ];    }}

业务代码要放到服务层中

控制器必须遵循单一职责原则,因此最好将业务代码从控制器移动到服务层中。

例子:

public function store(request $request){    if ($request->hasfile('image')) {        $request->file('image')->move(public_path('images') . 'temp');    }        ....}

更优的写法:

public function store(request $request){    $this->articlervice->handleuploadedimage($request->file('image'));    ....}class articlervice{    public function handleuploadedimage($image)    {        if (!is_null($image)) {            $image->move(public_path('images') . 'temp');        }    }}

dry原则 不要重复自己

尽可能重用代码,srp可以帮助您避免重复造轮子。 此外尽量重复使用blade模板,使用eloquent的 scopes 方法来实现代码。

例子:

public function getactive(){    return $this->where('verified', 1)->wherenotnull('deleted_at')->get();}public function getarticles(){    return $this->wherehas('ur', function ($q) {            $q->where('verified', 1)->wherenotnull('deleted_at');        })->get();}

更优的写法:

public function scopeactive($q){    return $q->where('verified', 1)->wherenotnull('deleted_at');}public function getactive(){    return $this->active()->get();}public function getarticles(){    return $this->wherehas('ur', function ($q) {            $q->active();        })->get();}

使用orm而不是纯sql语句,榆荫使用集合而不是数组

使用eloquent可以帮您编写可读和可维护的代码。 此外eloquent还有非常优雅的内置工具,如软删除,事件,范围等。

例子:

lect *from `articles`where exists (lect *              from `urs`              where `articles`.`ur_id` = `urs`.`id`              and exists (lect *                          from `profiles`                          where `profiles`.`ur_id` = `urs`.`id`)               and `urs`.`deleted_at` is null)and `verified` = '1'and `active` = '1'order by `created_at` desc

更优的写法:

article::has('ur.profile')->verif自由交配ied()->latest()->get();

集中处理数据

例子:

$article = new article;$article->title = $request->title;$article->content = $request->content;$article->verified = $request->verified;// add category to article$article->category_id = $category->id;$article->save();

更优的写法:

$category->article()->create($request->validated());

不要在模板中查询,尽量使用惰性加载

例子 (对于100个用户,将执行101次db查询):

@foreach (ur::all() as $ur)    {{ $ur->profile->name }}@endforeach

更优的写法 (对于100个用户,使用以下写法只需执行2次db查询):

$urs = ur::with('profile')->get();...@foreach ($urs as $ur)    {{ $ur->profile->name }}@endforeach

注释你的代码,但是更优雅的做法是使用描述性的语言来编写你的代码

例子:

if (count((array) $builder->getquery()->joins) > 0)

加上注释:

// 确定是否有任何连接if (count((array) $builder->getquery()->joins) > 0)

更优的写法:

if ($this->hasjoins())

不要把 js 和 css 放到 blade 模板中,也不要把任何 html 代码放到 php 代码里

例子:

let article = `{{ json_encode($article) }}`;

更好的写法:

<input id="article" type="hidden" value="@json($article)">or<button class="js-fav-article" data-article="@json($article)">{{ $article->name }}<button>

在javascript文件中加上:

let article = $('#article').val();

当然最好的办法还是使用专业的php的js包传输数据。

在代码中使用配置、语言包和常量,而不是使用硬编码

例子:

public function isnormal(){    return $article->type === 'normal';}return back()->with('message', 'your article has been added!');

更优的写法:

public function isnormal(){    return $article->type === article::type_normal;}return back()->with('message', __('app.article_added'));

使用社区认可的标准laravel工具

强力推荐使用内置的laravel功能和扩展包,而不是使用第三方的扩展包和工具。
如果你的项目被其他开发人员接手了,他们将不得不重新学习这些第三方工具的使用教程。
此外,当您使用第三方扩展包或工具时,你很难从laravel社区获得什么帮助。 不要让你的客户为额外的问题付钱。

想要实现的功能标准工具第三方工具权限policientrust, ntinel 或者其他扩展包资源编译工具laravel mixgrunt, gulp, 或者其他第三方包开发环境homesteaddocker部署laravel forgedeployer 或者其他解决方案自动化测试phpunit, mockeryphpspec页面预览测试laravel duskcodeceptiondb操纵eloquentsql, doctrine模板bladetwig数据操纵laravel集合数组表单验证request class他第三方包,甚至在控制器中做验证权限built-in他第三方包或者你自己解决api身份验证laravel passport第三方的jwt或者 oauth 扩展包创建 apibuilt-indingo api 或者类似的扩展包创建数据库结构migrations直接用 db 语句创建本土化built-in第三方包实时消息队列laravel echo, pusher使用第三方包或者直接使用websockets创建测试数据eder class, model factories, faker手动创建测试数据任务调度laravel task scheduler脚本和第三方包数据库mysql, postgresql, sqlite, sql rvermongodb

遵循laravel命名约定

来源 psr standards.

另外,遵循laravel社区认可的命名约定:

对象规则更优的写法应避免的写法控制器单数articlecontrollerarticlescontroller路由复数articles/1article/1路由命名带点符号的蛇形命名urs.show_activeurs.show-active, show-active-urs模型单数ururshasone或belongsto关系单数articlecommentarticlecomments, article_comment所有其他关系复数articlecommentsarticlecomment, article_comments表单复数article_commentsarticle_comment, articlecomments透视表按字母顺序排列模型article_urur_article, articles_urs数据大学毕业几月份表字段使用蛇形并且不要带表名meta_titlemetatitle; article_meta_title模型参数蛇形命名$model->created_at$model->createdat外键带有_id后缀的单数模型名称article_idarticleid, id_article, articles_id主键–idcustom_id迁移–2017_01_01_000000_create_articles_table2017_01_01_000000_articles方法驼峰命名getallget_all资源控制器storesavearticle测试类驼峰命名testguestcannotearticletest_guest_cannot_e_article变量驼峰命名$articleswithauthor$articles_with_author集合描述性的, 复数的$activeurs = ur::active()->get()$active, $data对象描述性的, 单数的$activeur = ur::active()->first()$urs, $obj配置和语言文件索引蛇形命名articles_enabledarticlenabled; articles-enabled视图短横线命名show-filtered.blade.phpshowfiltered.blade.php, show_filtered.blade.php配置蛇形命名google_calendar.phpgooglecalendar.php, google-calendar.php内容 (interface)形容词或名词authenticatableauthenticationinterface, iauthenticationtrait使用形容词notifiablenotificationtrait

尽可能使用简短且可读性更好的语法

例子:

$request->ssion()->get('cart');$request->input('name');

更优的写法:

ssion('cart');$request->name;

更多示例:

常规写法更优雅的写法ssion::get('cart')ssion('cart')$request->ssion()->get('cart')ssion('cart')ssion::put('cart', $data)ssion(['cart' => $data])$request->input('name'), request::get('name')$request->name, request('name')return redirect::back()return back()is_null($object->relation) ? null : $object->relation->idoptional($object->relation)->idreturn view('index')->with('title', $title)->with('client', $client)return view('index', compact('title', 'client'))$request->has('value') ? $request->value : 'default';$request->get('value', 'default')carbon::now(), carbon::today()now(), today()app::make('class')app('class')->where('column', '=', 1)->where('column', 1)->orderby('created_at', 'desc')->latest()->orderby('age', 'desc')->latest('age')->orderby('created_at', 'asc')->oldest()->lect('id', 'name')->get()->get(['id', 'name'])->first()->name->value('name')

使用ioc容器来创建实例 而不是直接new一个实例

创建新的类会让类之间的更加耦合,使得测试越发复杂。请改用ioc容器或注入来实现。

例子:

$ur = new ur;$ur->create($request->validated());

更优的写法:

public function __construct(ur $ur){    $this->ur = $ur;}....$this->ur->create($request->validated());

避免直接从 .env 文件里获取数据

将数据传递给配置文件,然后使用config()帮助函数来调用数据

例子:

$apikey = env('api_key');

更优的写法:

// config/api.php'key' => env('api_key'),// u the data$apikey = config('api.key');

使用标准格式来存储日期,用访问器和修改器来修改日期格式

例子:

{{ carbon::createfromformat('y-d-m h-i', $object->ordered_at)->todatestring() }}{{ carbon::createfromformat('y-d-m h-i', $object->ordered_at)->format('m-d') }}

更优的写法:

// modelprotected $dates = ['ordered_at', 'created_at', 'updated_at'];public function getsomedateattribute($date){    return $date->format('m-d');}// view{{ $object->ordered_at->todatestring() }}{{ $object->ordered_at->some_date }}

其他的一些好建议

永远不要在路由文件中放任何的逻辑代码。

尽量不要在blade模板中写原始 php 代码。

原文作者:

原文链接:https://github.com/alexeymezenin/laravel-best-practices/

本文发布于:2023-04-07 13:08:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/066df4d4ef6f1ff1c15de08d65655841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Laravel 最佳实践.doc

本文 PDF 下载地址:Laravel 最佳实践.pdf

标签:写法   第三方   例子   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图