日志记录参数
我们可以使用 Log::info(),或使用更短的 info() 额外参数信息,来了解更多发生的事情
Log::info('User failed to login.', ['id' => $user->id]);
更方便的 DD
我们可以在 Eloquent 句子或者任何集合结尾添加 ->dd(),而不是使用 dd($result)。
// 以前 $users = User::where('name', '小明')->get(); dd($users); // 现在 $users = User::where('name', '小明')->get()->dd();
使用 context 日志
在最新的 Laravel 8.49 中:Log::withContext() 将帮助我们区分不同请求之间的日志消息。
如果我们创建了中间件并且设置了 context,所有的长消息将包含在 context 中,我们搜索会更容易。
举例:
public function handle(Request $request, Closure $next) { $requestId = (string) Str::uuid(); Log::withContext(['request-id' => $requestId]); $response = $next($request); $response->header('request-id', $requestId); return $response; }
API 资源:带不带 “data”?
如果我们使用 Eloquent API 去返回数据,它们将自动封装到 data 中。
如果要将其删除,需要在app/Providers/AppServiceProvider.php
中添加 JsonResource::withoutWrapping()
;
class AppServiceProvider extends ServiceProvider { public function boot() { JsonResource::withoutWrapping(); } }
API 返回一切正常
如果我们有 API 端口执行某些操作但是没有响应,我们只想返回 “一切正常”: 我们可以返回 204 状态代码 “No content”。
在 Laravel 中,这就很简单: return response()->noContent();.
public function reorder(Request $request) { foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent(); }
一次检查多个权限
除了 @can Blade 指令外,还可以用 @canany 指令一次检查多个权限:
@canany(['update', 'view', 'delete'], $articles) // 当前用户可以修改,查看,或者删除文章 @elsecanany(['create'], \App\Article::class) // 当前用户可以创建文章 @endcanany
更多关于用户注册的事件
希望在新用户注册后执行一些操作怎么优雅的实现呢? 我们可以转到 app/Providers/EventServiceProvider.php
和 添加更多的监听类, 然后在 $event->user 对象中实现 handle() 方法。
class EventServiceProvider extends ServiceProvider { protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, // 我们可以在这里添加任何Listener类 // 在该类中使用handle()方法 ], ];
Auth::once () 的使用
使用方法 Auth::once(),可以用用户登录一个请求。 Auth::once () 不会使用任何会话或 cookie,这意味着该方法在构建无状态 API 时可能很有帮助。
if (Auth::once($credentials)) { // }
更改用户密码更新的 API 令牌
当用户的密码更改时,可以方便地更改用户的 API 令牌。这个实现非常重要
模型:
public function setPasswordAttribute($value) { $this->attributes['password'] = $value; $this->attributes['api_token'] = Str::random(100); }
覆盖超级管理员的权限
如果你已经定义了网关(Gates)但是又想要覆盖超级管理员的所有权限。
给超级管理员所有权限,我们可以在 AuthServiceProvider.php 文件中用 Gate::before() 语句拦截网关(Gates)。
// 拦截任何一个网关,检查它是否是超级管理员 Gate::before(function($user, $ability) { if ($user->is_super_admin == 1) { return true; } }); // 或者你使用一些权限包 Gate::before(function($user, $ability) { if ($user->hasPermission('root')) { return true; } });