Laravel 编码技巧 视图

2023-02-16 17:10 更新

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')


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号