Laravel 编码技巧 视图
foreach 语句中的 $loop 变量
在 foreach 循环中,使用 $loop
变量来查看当前是否是第一次 / 最后一次循环。
@foreach ($users as $user)
@if ($loop->first)
第一次迭代。
@endif
@if ($loop->last)
最后一次迭代。
@endif
<p>该用户id是:{{ $user->id }}</p>
@endforeach
同样也有诸如 $loop->iteration
或 $loop->count
等属性。可以在 官方文档 中查看更多相关内容。
视图是否存在?
你可以在视图实际加载之前确认该视图文件是否存在。
if (view()->exists('custom.page')) {
// 载入视图
}
你甚至可以使用一个数组来加载视图,这样只有第一个视图文件确实存在的视图会被加载。
return view()->first(['custom.dashboard', 'dashboard'], $data);
错误代码视图页面
如果你想为一些特殊的 HTTP 返回码建立特定的错误页面,比如 500 —— 只需要使用该码值创建视图文件,比如 resources/views/errors/500.blade.php
,或者是 403.blade.php
等等,这些视图会在对应的错误码出现时自动被加载。
脱离控制器的视图
如果你想让一个路由仅仅显示某个视图,不需要创建控制器,只需要使用 Route::view()
方法即可。
// 不要这样做
Route::get('about', 'TextsController@about');
class TextsController extends Controller
{
public function about()
{
return view('texts.about');
}
}
// 这样做
Route::view('about', 'texts.about');
视图 @auth 指令
不需要使用 if 来检查用户是否登录,使用 @auth
指令即可。
比较典型的方式是:
@if(auth()->user())
// 该用户已登录
@endif
更短的用法:
@auth
// 该用户已登录
@endauth
与 @auth
相对的是 @guest
指令:
@guest
// 该用户未登录
@endguest
Blade 视图中的二级 $loop 变量
你甚至可以在 Blade 视图的二级 foreach 循环中使用 $loop 变量来表示外层的循环变量。
@foreach ($users as $user)
@foreach ($user->posts as $post)
@if ($loop->parent->first)
这是父级循环中的第一次迭代
@endif
@endforeach
@endforeach
创建你自己的 Blade 指令
你只需要在 app/Providers/AppServiceProvider.php
中添加你自己的方法。举个例子,如果你需要将 <br>
标签替换为换行:
<textarea>@br2nl($post->post_text)</textarea>
然后将这个指令添加到 AppServiceProvider 的 boot()
方法中:
public function boot()
{
Blade::directive('br2nl', function ($string) {
return "<?php echo preg_replace('/\<br(\s*)?\/?\>/i', \"\n\", $string); ?>";
});
}
视图指令: IncludeIf,IncludeWhen,IncludeFirst
如果你不确定 Blade 文件是否存在,你可以使用这些条件指令。
仅当 Blade 文件存在时载入 header:
@includeIf('partials.header')
仅当用户的 role_id == 1
的时候载入 header:
@includeWhen(auth()->user()->role_id == 1, 'partials.header')
尝试加载 adminlte.header
,如果不存在,则加载 default.header
:
@includeFirst('adminlte.header', 'default.header')
更多建议: