如何快速上手 Laravel ?100 个实用小技巧分享

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

如何快速上手 Laravel ?100 个实用小技巧分享

给大家提供一些 Laravel 使用的小技巧, 当然你有任何想法欢迎 PR !

Github 地址:https://github.com/LaravelDaily/laravel-tips

控制器单行为控制器

当你的控制器仅有一个方法的时候,不妨尝试下 __invoke() 方法来,让当前控制器变身为 “invokable” 控制器。

想要了解单行为控制器的好处以及用法请参考:

翻译:Laravel 应用设计:单行为控制器的魅力翻译:如何更好地使用单行为控制器

单行为控制器的简单使用:

定义路由,如下:

Route::get('user/{id}', 'ShowProfile');
登录后复制

通过命令创建单行为控制器:

php artisan make:controller ShowProfile --invokable
登录后复制

修改控制器代码,如下:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}
登录后复制重定向到指定控制器的指定方法

你可以通过 redirect() 重定向到某个路由或者某个链接,但是当你希望重定向到一个特定方法,并且需要携带一些参数的时候,action 方法可以帮你实现,代码如下:

return redirect()->action('SomeController@method', ['param' => $value]);
登录后复制接口操作成功而无返回的简单处理

当你在接口执行了某些逻辑,但是不需要返回内容的时候,你可以直接返回 204 状态码。 在 Laravel 中这很容易实现:

Tips: 204 状态码说明

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}
登录后复制模型Eloquent 的日期筛选

Laravel 的 Eloquent Orm 提供了 whereDay(), whereMonth(), whereYear(), whereDate()whereTime() 供你对日期进行筛选。简单例子:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();
登录后复制Inter 类型数据的便捷操作 Increments(增加) 和 decrements(减少)

你如果仅仅是操作数字类型字段的增加(减少),你可以尝试下 increment()decrement()) 方法:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);
登录后复制获取设置当前用户登录的信息

你可以使用 make:observer 来创建一个观察者,然后通过修改模型事件 creating() 来设定当前用户的信息,代码如下 :详细使用可以查阅 Laravel 中的模型事件与 Observer

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}
登录后复制软删除后的数据批量恢复

当使用软删除删除数据之后,你可以通过以下方法批量恢复删除的数据:

Post::withTrashed()->where('author_id', 1)->restore();
登录后复制特定模型字段的返回

默认的 Model::all() 会返回所有字段,不管你是否有需要,当然你也可以通过给 all() 传递参数来指定返回的列。如下:

$users = User::all(['id', 'name', 'email']);
登录后复制失败或者成功的查询

findOrFail() 方法,可以在查询没有符合条件数据的时候直接抛出异常。

php artisan make:controller ShowProfile --invokable0
登录后复制数据返回的列名称的自定义

在 Eloquent 查询中使用 select 可以设置查询的字段,然后你可以通过 “as” 给字段重命名为你想要的名称:

php artisan make:controller ShowProfile --invokable1
登录后复制查询结果的 Map 处理

由于 Eloquent 中,get 方法将返回 Collection 类型的数据,所以在通过 get 方法获取数据之后,你可以直接通过 map() 方法来处理:

php artisan make:controller ShowProfile --invokable2
登录后复制不使用 timestamps 相关字段

默认的,laravel 会在 migration 以及 model 中添加 timestamps 相关字段(created_at,updated_at),如果你不想使用他,你可以在migrate 中移除相关字段,或者在 model 中设置 timestamps属性,将该属性设置为 false 即可实现:

php artisan make:controller ShowProfile --invokable3
登录后复制修改默认时间字段

当你想要在已存在的数据库中使用 Laraevl 的 Eloquent Orm的时候,你的时间字段又不同于 Laravel 默认字段,这时候怎么处理呢?你可以通过给以下常量重新赋值来设置当前使用的时间戳字段:

php artisan make:controller ShowProfile --invokable4
登录后复制快速通过 created_at 排序

在此之前你是这样实现的:

php artisan make:controller ShowProfile --invokable5
登录后复制

当然,你也可以使用更简单的方式:

php artisan make:controller ShowProfile --invokable6
登录后复制

默认 latest() 会通过 created_at 进行排序。

这里还有个反方法可以用: oldest() 将会通过 created_at 字段进行升序排序。

php artisan make:controller ShowProfile --invokable7
登录后复制

当然你也可以通过传递参数来执行想要进行排序的字段,如下:

php artisan make:controller ShowProfile --invokable8
登录后复制创建记录时的自增

当你在创建记录的时候,你同时希望对某个字段进行自增操作的时候,你可以在 boot() 方法中注册 creating 方法来实现。举个例子,现在你有个 “position” 字段,你希望在你完成新增操作的时候同时对该字段 +1 ,实现代码如下:

php artisan make:controller ShowProfile --invokable9
登录后复制使用 whereRaw() 使查询效率更快

使用 whereRaw() 方法,通常可以使查询效率更高。例如你想获取 30+ 天未登录的用户,你可以通过以下实现:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}0
登录后复制多个作用域

你可以同时创建多个作用域,当然可以在一个查询中使用多个作用域。

模型中定义:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}1
登录后复制

controller 中使用:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}2
登录后复制Carbon自动转换

如果你想使用 whereDate() 查询今天的记录,你可以通过直接 now() 而无需进行 ->toDateString(),因为他会自动转换。

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}3
登录后复制通过首字符分组

你可以通过任意你想实现的方式进行分组,下面是通过对姓名首字符的分组方法:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}4
登录后复制限制数据列的更新

如果你希望设置一个不可更新的列,你可以通过以下方式实现:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}5
登录后复制查询多个

Eloquent 方法 find() 可以通过传递数组参数实现多个记录的查询:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}6
登录后复制使用 UUID 替代 自增列

如果你不想在数据表中使用自增列要怎么办?下面叫你如何实现

数据迁移:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}7
登录后复制

模型:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}8
登录后复制模型关联可排序的模型关联

你可以在你的关联中使用 orderBy对关联进行排序:

class ShowProfile extends Controller{    public function __invoke($id)    {        return view('user.profile', [            'user' => User::findOrFail($id)        ]);    }}9
登录后复制有条件的模型关联

如果你在使用模型关联的时候经常需要额外的进行 where 查询,你可以直接通过对关联进行条件查询,实现方式如下:

Model:

return redirect()->action('SomeController@method', ['param' => $value]);0
登录后复制对结果的筛选:havingRaw()

你可以在各种地方使用 RAW DB 查询,包括 groupBy()havingRaw() 后面:

return redirect()->action('SomeController@method', ['param' => $value]);1
登录后复制Eloquent has() 方法可以作用于深层的关联

Eloquent has() 方法可以通过 books.ratings 的方式,而使查询可以做用于更深层的关联上!

return redirect()->action('SomeController@method', ['param' => $value]);2
登录后复制通过 Has 方法对 hasMany 数据限制

在一对多关联中, hasMany() 允许通过 has() 方法进行关联数据条数的限制:

return redirect()->action('SomeController@method', ['param' => $value]);3
登录后复制模型默认值

你可以通过 belongsTo 关联, to avoid fatal errors when calling it like {{ $post->user->name }} if $post->user doesn’t exist.

return redirect()->action('SomeController@method', ['param' => $value]);4
登录后复制一次性创建多条关联记录

如果你定义了 hasMany() 关联,你可以通过 saveMany() 来一次性创建多条关联数据:

return redirect()->action('SomeController@method', ['param' => $value]);5
登录后复制快速且精确的加载

通过 with 你可以获取关联表甚至特定字段信息:

return redirect()->action('SomeController@method', ['param' => $value]);6
登录后复制

你可以使用他获取更深一层次的关联:

return redirect()->action('SomeController@method', ['param' => $value]);7
登录后复制上级信息的级联更新

例如你想在更新评论信息的时候想同时更新上级关联的帖子信息的 updated_at 字段,你可以通过指定 $touch 属性实现:

return redirect()->action('SomeController@method', ['param' => $value]);8
登录后复制总是检测关联是否存在

永远不要在未检测关联是否存在的情况下使用 $model->relationship->field

It may be deleted for whatever reason, outside your code, by someone else’s queued job etc.

可以通过 if-else,在 Blade 中使用 {{ $model->relationship->field ?? '' }} , 或者 {{ optional($model->relationship)->field }} 进行检测。

使用 withCount() 获取记录条数

如果你定义了 hasMany() 关联,当你想要统计关联数据的数量的时候,尝试下 withCount 吧。例子, 假如你有一个 Post 模型,该模型会有多个 Comments 关联,看下如何使用 withCount() 吧:

return redirect()->action('SomeController@method', ['param' => $value]);9
登录后复制

然后在模板文件中使用 {relationship}_count 属性就可以获取相应的数据统计了:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}0
登录后复制关联查询的筛选条件

如果你想要在加载关联的时候做一些条件限制,可以通过回调函数实现。例如你想获取国家的前3个城市,可以通过以下代码实现:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}1
登录后复制始终加载关联

你即可以通过 $with 属性设置模型始终会加载的关联,也可以在构造函数中动态处理加载项:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}2
登录后复制belongsTo 和 hasMany 的使用

定义 belongsTo 关联和 hasMany 关联,这样可以在创建关联数据的时候有由系统填充关联字段信息:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}3
登录后复制自定义归属关联名称

使用 as 可以重命名您的关联:

模型中定义:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}4
登录后复制

控制器中使用:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}5
登录后复制数据迁移迁移执行顺序

通过修改迁移文件的时间戳前缀可以达到排序迁移执行数据的目的。例如:将2018_08_04_070443_create_posts_table.php 修改为 2018_07_04_070443_create_posts_table.php ( 修改 2018_08_042018_07_04 ).

Migration 设定时间戳时区

迁移中 timestamps()timestampsTz() 都可以设定时区。

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}6
登录后复制

另外还有 dateTimeTz(), timeTz(), timestampTz(), softDeletesTz().

数据 Migrations 类型

一些特定值得迁移类型:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}7
登录后复制

更多类型查阅: official documentation.

默认时间戳

通过 timestamp() 设定列为时间戳类型,通过useCurrent() 设定该列的默认值。

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}8
登录后复制视图foreach 中 $loop 的使用

通过 $loop 判断该数据是否是最先/最后的数据:

public function reorder(Request $request){    foreach ($request->input('rows', []) as $row) {        Country::find($row['id'])->update(['position' => $row['position']]);    }    return response()->noContent();}9
登录后复制

当然他还有其他可用属性例如: $loop->iteration$loop->count.详情阅读: official documentation.

如何判断 View 是否存在?

在你加载 view 之前你可以判断 view 是否存在,从而避免不必要的错误显示。

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();0
登录后复制

你可以提供多个 view 供选择:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();1
登录后复制错误模板页面

快速创建特定错误的页面,你只要以该错误code命名并创建相应的 blade 即可。例如: 500(resources/views/errors/500.blade.php)/403(resources/views/errors/403.blade.php),系统会通过相应的 code 自动匹配错误显示页面。

直接使用 view

可以直接在路由中绑定需要显示的 view:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();2
登录后复制Blade @auth

在 Blade 中直接使用 auth() 可以判断以及获取当前登录的用户信息:

例子:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();3
登录后复制

或者更简单的方式:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();4
登录后复制

相反的方法 @guest

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();5
登录后复制Blade中循环嵌套中使用 $loop

Blade 循环嵌套,可以通过 $loop 获取上层数据:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();6
登录后复制自定义 Blade 指令

Laravel 提供了简单的方式自定义 Blade 指令,只需在 app/Providers/AppServiceProvider.php 注册自己的指令即可。例子:你想要使用新的标签替换 <br> 标签:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();7
登录后复制

将该指令添加到 AppServiceProvider 的 boot() 方法中:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();8
登录后复制Blade 指令说明: IncludeIf, IncludeWhen, IncludeFirst

当你不确定 Blade 的组件是否存在的时候可以使用一下方法:

仅仅在存在时加载该组件:

$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();9
登录后复制

仅仅在有权限的时候加载该组件

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);0
登录后复制

当该组件不存在时,会加载默认组件:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);1
登录后复制路由路由组嵌套

路由组可以使用嵌套:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);2
登录后复制子域通配符

你可以通过动态子域名创建相应的路由:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);3
登录后复制What’s behind the routes?

Auth::routes() 下包含了那些路由呢?你可以在 /vendor/laravel/ui/src/AuthRouteMethods.php 找到:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);4
登录后复制

Laravel 7 之前, 存在与文件 /vendor/laravel/framework/src/illuminate/Routing/Router.php

路由注入绑定

你可以通过绑定 user 参数 Route::get('api/users/{user}', function (App\User $user) { … } - 不仅仅可以通过自增 ID 字段筛选,也可以使用 {user}username 字段筛选,只要在模型中这样处理即可:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);5
登录后复制快速定义路由控制器

在此之前,你可能这样写:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);6
登录后复制

上面写法在编辑器中无法从 route 直接跳转到相应的 controller 中,尝试一下方法:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);7
登录后复制

现在你可以在编辑器中直接点击 PageController 编辑器会根据路径自动找到相关文件(这需要你的编辑器支持,像 phpstorm)。

路由默认值

如果你你不想在路由匹配失败时显示 404 错误页面,你可以通过回调函数设置默认显示内容,这样在路由匹配失败的时候会直接显示你自定义的内容:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);8
登录后复制使用正则验证路由参数

我们可以直接在路由定义时使用 “where” 方法验证路由参数。一个非常典型的情况是在路由的前面加上语言设置, 像 fr/blogen/article/333 这样。我们如何确保这两个首字母不用于语言以外的其他字符串?

routes/web.php:

Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);9
登录后复制全局,访客,用户的限流

你可以通过 throttle:60,1 来限制单位时间内请求某个可连接的此处:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}0
登录后复制

你可以针对不同用户组进行不同限制:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}1
登录后复制

Also, you can have a DB field users.rate_limit and limit the amount for specific user:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}2
登录后复制路由的Query params 参数设置

你可以通过 route 方法第二个参数,以数组的形式将query 参数绑定到路由:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}3
登录后复制验证图片验证

你可以验证上传图片的尺寸:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}4
登录后复制自定义验证错误消息

可以自定义现有规则的错误消息,只需要创建相应的语言文件即可 resources/lang/xx/validation.php

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}5
登录后复制时间验证中的 “now” 和 “yesterday”关键字

您可以通过 before/after 规则来验证日期,并将各种字符串作为参数传递,例如:tomorrow, now, yesterday。 例如:'start_date' => 'after:now'。 它在底层使用 strtotime() 验证。

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}6
登录后复制有条件的验证规则

如果你的验证规则需要同时满足额外的条件,在 FormRequest 方法中定义 withValidator() 添加你的条件即可:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}7
登录后复制自定义验证消息

通过FormRequestmessages() 方法,你可以自定义验证错误提示信息:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}8
登录后复制验证前置操作

验证前置操作,如果你需要在验证之前对某些字段做一些处理, prepareForValidation() 可以实现该功能:

class PostObserver{    public function creating(Post $post)    {        $post->user_id = auth()->id();    }}9
登录后复制遇到错误时终止验证

默认情况下,laraevl 会在处理完成所有验证规则之后,将错误信息一并返回;当然如果你想在遇到第一个错误的时候就终止继续往下的验证你可以通过添加一下规则: bail

Post::withTrashed()->where('author_id', 1)->restore();0
登录后复制Policies一次性检测多个权限

@can Blade 指令可以检测当前用户是否有某个权限,但是当场景复杂点要怎么处理?比如当我在同时拥有多个权限才能进行某个操作的时候? @canany 指令了解下:

Post::withTrashed()->where('author_id', 1)->restore();1
登录后复制集合不要在集合过滤中使用 NULL

你可以在 Eloquent 中使用 Null 过滤,但是在集合( collection )中,Null 过滤将不会生效:

Post::withTrashed()->where('author_id', 1)->restore();2
登录后复制在集合上使用自定义 groupBy 回调

如果你想根据某些条件对结果进行分组处理,并且该条件列并非数据库字段,你可以通过 GroupBy 回调实现。

例如,如果你想按注册日期对用户进行分组,代码如下:

Post::withTrashed()->where('author_id', 1)->restore();3
登录后复制

⚠️ Notice: User::all() 将返回集合类型数据,因此这是在集合上进行的 GroupBy 操作

集合的复用

当你在查询结果上使用 ->all() 或者 ->get() 方法的时候,该操作是针对结果集合进行的操作,不会再额外的进行查询操作。

Post::withTrashed()->where('author_id', 1)->restore();4
登录后复制鉴权你链接 Auth::once() 吗?

Auth::once() 可以用于构建无状态请求,他不会产生任何 cookie信息,这很有利于接口的开发:

Post::withTrashed()->where('author_id', 1)->restore();5
登录后复制更新密码同时更新用户 token

在更新用户密码的同时更新用户 token 很有必要:

模型:

Post::withTrashed()->where('author_id', 1)->restore();6
登录后复制邮件将测试邮件存储到 laravel.log

开发过程中,你可能需要测试邮件发送,但是你有不希望测试邮件真正发送到客户邮箱,这时候你可以通过配置 .env 参数 MAIL_DRIVER=log 这样,邮件将会以文本的形式存储到 storage/logs/laravel.log ,而不会真正发送出去。

邮件预览

如果你使用 Mailables 为发送邮件提供服务,那么你可以直接在浏览器中浏览邮件预览,而不必真正的发送:

Post::withTrashed()->where('author_id', 1)->restore();7
登录后复制Laravel 通知的默认主题(subject)

如果你在使用 toMail() 发送邮件通知的时候,未指定相关主题(subject)laravel 提供了默认参数可以使用:

因此,你只需要有:

Post::withTrashed()->where('author_id', 1)->restore();8
登录后复制

然后你就可以在注册完成收到一封注册邮件提醒。

发送通知

你可以通过 $user->notify() 发送通知给特定用户,你也可以通过 Notification::route() 发送给任何其他需要通知的地方:

Post::withTrashed()->where('author_id', 1)->restore();9
登录后复制ArtisanArtisan 命令参数

当我们创建我们的 Artisan 命令的时候,可以通过 $this->confirm(), $this->anticipate(), $this->choice() 等方法询问并要求输入参数:

$users = User::all(['id', 'name', 'email']);0
登录后复制维护模式

页面维护模式实现如下:

$users = User::all(['id', 'name', 'email']);1
登录后复制

执行上面命令后,再访问站点的时候会得到 503 错误信息。

你也可以通过提供参数实现而外的效果:

message 参数指定显示信息retry 参数设定页面重载时间allow 允许访问的 IP
$users = User::all(['id', 'name', 'email']);1 --message="Upgrading Database" --retry=60 --allow=127.0.0.1
登录后复制

当维护完成,运行一下命令上线吧!

$users = User::all(['id', 'name', 'email']);3
登录后复制数据工厂Factory 的回调方法

有时候,你某些数据的插入/修改需要基于其他数据的完成,这时你可以通过回调方法实现,例子如下:

$users = User::all(['id', 'name', 'email']);4
登录后复制通过 Seeds/Factories 生成图片

Faker能生成的不仅仅是文本,还可以生成指定大小的图像:

$users = User::all(['id', 'name', 'email']);5
登录后复制日志和调试给日志记录传递参数

你可以通过 Log::info() 来记录日志,或者 info() 快捷方法可以实现同样的效果。

$users = User::all(['id', 'name', 'email']);6
登录后复制更方便的方法 DD

你可以直接通过在查询结果之后的 ->dd() 操作来打印结果。

$users = User::all(['id', 'name', 'email']);7
登录后复制

【相关推荐:laravel视频教程】

以上就是如何快速上手 Laravel ?100 个实用小技巧分享的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。

作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:php7 use用法是什么
下一篇:PHP Fatal error- Call to undefined function imap_open()的解决方法

发表评论

关闭广告
关闭广告