我已经创建了中间件
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())
但不起作用
感谢任何帮助
答案 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 } ?>";
});
}
}