Laravel:如何检查刀片模板

时间:2018-01-27 15:23:11

标签: laravel laravel-5 laravel-5.3 laravel-middleware

我已经创建了中间件

php artisan make:middleware isTeacher
在App / Http / isTeacher.php中

我已经放了支票:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class isTeacher
{
  public function handle($request, Closure $next)
  {
    $user = Auth::user();

    if($user && $user->capability == 3)
    {
        return $next($request);
    }
    else
        return redirect('/login');
  }
}

,我在app / Http / Kernel.php中定义了中间件

protected $routeMiddleware = [
    ...
    'auth.teacher' => \App\Http\Middleware\isTeacher::class,
    ...
];

问题是:我如何检查刀片模板中的教师功能? 我试着用这个:

@if (Auth::isTeacher())

但不起作用

感谢任何帮助

4 个答案:

答案 0 :(得分:1)

这里有一个问题中间件用于在laravel app中过滤HTTP个请求或洋葱的外层。它没有被定义为在刀片中用来决定应该呈现html的哪个部分。

您可以过滤控制器功能,只有在通过中间件(例如,如果通过身份验证)时才可用,并且控制器仅在传递中间件时运行该功能。

在刀片中使用Auth时,您没有使用中间件,而是facade,您可以根据自己的情况使用Session

在你的中间件中

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class isTeacher
{
  public function handle($request, Closure $next)
  {
    $user = Auth::user();

    if($user && $user->capability == 3)
    {
        \session('isTeacher', true);
        return $next($request);
    }

    return redirect('/login');

}

然后在你的刀片中做:

@if (Session::get('isTeacher', 0));

这将仅向教师显示内容,如果未设置会话,则会回落到0或假。

答案 1 :(得分:1)

在这种情况下,使用中间件并不是真正的解决方案。我宁愿建议使用blade指令,它允许您创建自定义刀片功能,如:

@author
    //Do something
@else
    //Something else
@endauthor

要使用上述语法,您可以在AppServiceProvider.php文件中注册新的刀片指令

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::directive('author', function () {
            $isAuth = false;

            // check if the user authenticated is teacher
            if (auth()->user() && auth()->user()->capability == 3) {

                $isAuth = true;
            }

            return "<?php if ($isAuth) { ?>";
        });

        Blade::directive('endauthor', function () {
            return "<?php } ?>";
        });
    }
}

AppServiceProvider.php文件中进行上述更改后,请运行php artisan view:clear

为了更好地理解,您可以参考文档here

答案 2 :(得分:1)

blade指令仅需要返回true或false。

您可以按照boot()的{​​{1}}方法执行以下操作

AppServiceProdiver.php

然后,您将能够在刀片模板中执行以下操作:

Blade::if('teacher', function () {
    return auth()->user() && $user->capability == 3;
});

答案 3 :(得分:0)

这是Lionel王子的答案的改进版本。注意Blade :: directive回调函数的返回值。

@author
    //Do something
@else
    //Something else
@endauthor

AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::directive('author', function () {
            $isAuth = false;

            // check if the user authenticated is teacher
            if (auth()->user() && auth()->user()->capability == 3) {

                $isAuth = true;
            }

            return "<?php if (" . intval($isAuth) . ") { ?>";
        });

        Blade::directive('endauthor', function () {
            return "<?php } ?>";
        });
    }
}