【问题标题】:How to change which template is extended based on user authentication如何根据用户身份验证更改扩展哪个模板
【发布时间】:2021-01-19 19:13:40
【问题描述】:

我使用的是 Laravel 6.20.11,并且我已经发布了 Laravel 刀片错误模板。我需要发生的是,如果用户通过身份验证,错误消息会扩展内部布局,如果没有,它会扩展公共布局,如下所示:

@auth
    @extends ('int-layouts.partials.wrapper')
    @section ('error')
        <div class="be-content">
            <div class="main-content container-fluid">
                <div class="container py-5">
                    <div class="row">
                        <div class="col-lg-8">
                            <div class="text-block">
                                 <h1>404 - Not Found</h1>
                                  <p class="text-muted text-uppercase mb-4">Sorry, we couldn't find the page you were looking for.
                                  Please contact the administrator<br/>
                                  Or go back to the <a class="navbar-brand py-1" href="/controlpanel/">Dashboard</a></p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    @endsection
@endauth
@guest
    @extends ('ext-layouts.master')
    @section('error')
        <div class="container py-5">
            <div class="row">
                <div class="col-lg-8">
                    <div class="text-block">
                         <h1>404</h1>
                          <p class="text-muted text-uppercase mb-4">Sorry,You are trying to reach the page that does not exist.<br>
                           Please contact the administrator <br/> Or go back to the <a class="navbar-brand py-1" href="/">Home Page</a></p>
                    </div>
                </div>
            </div>
        </div>
    @endsection
@endguest

我遇到的问题是,当我使用 abort(404) 测试 404 错误或尝试访问不存在的路由时,错误消息显示两次并且页面继承了 int-layouts.partials.wrapper即使用户未通过身份验证。

这是预期的行为还是我在刀片文件中做错了什么?

【问题讨论】:

    标签: laravel laravel-blade laravel-6


    【解决方案1】:

    您可以尝试在一个@extends 指令中使用条件:

    @extends (auth()->check() ? 'int-layouts.partials.wrapper' : 'ext-layouts.master')
    

    然后你可以在你的部分中使用这个之后的条件。

    @section('error')
        @auth
        @else
        @endif
    @endsection
    

    @extends 指令实际上并没有像大多数指令那样将输出直接返回到编译结果中。为此编译的 PHP 保存在一个数组中,以便稍后添加。

    指令的( ) 内的所有内容都被用作在视图工厂上调用make 的文字:

    "<?php echo \$__env->make({$expression}, \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?>"
    

    如果您找到此 Blade 模板的编译视图,您会看到:

    <?php echo \$__env->make(auth()->check ? 'int-layouts.partials.wrapper' : 'ext-layouts.master', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?>
    

    make 的第一个参数最终成为执行此编译视图时的视图名称。

    【讨论】:

    • 太棒了!我不知道您可以向@extends 指令添加参数。谢谢!
    【解决方案2】:

    在控制器功能中: $layouts = Auth::user->admin ? 'view.admin' : 'view.student'; // view.admin 或 view.student 是要渲染的刀片文件 动态的。

    return view('welcome',compact('layouts'));
     
    

    写入刀片文件:

    @extends($layouts)
    @section('...')
    ...
    @endsection
    

    【讨论】:

    • 请在您的答案中添加一些解释,以便其他人可以从中学习
    猜你喜欢
    • 2017-07-05
    • 2012-01-26
    • 2012-06-22
    • 2022-09-29
    • 2017-05-07
    • 2012-05-10
    • 1970-01-01
    • 2020-07-16
    • 2013-10-01
    相关资源
    最近更新 更多