如何在路线中使用助手的功能?
How to use a function from helper in routes?
我在 helpers.php 中有一个函数,我在任何 blade 中使用它来检查管理员是否有权查看某些按钮,它在 Controllers 中也有效,但在路由,忽略它的路由。
function can($permission)
{
$userCheck = auth()->guard('admin')->check();
$user = '';
if ($userCheck === false) {
return redirect('admin/login');
} else {
$user = auth()->guard('admin')->user();
}
if ($user->id === 1) {
return true;
}
$minutes = 5;
$permissions = Cache::remember('permissions_'.$user->id, $minutes, function () use ($user) {
return explode(',', $user->permission->permission);
});
$permissions = array_flatten($permissions);
return in_array($permission, $permissions);
}
我在blade/view.
中是这样用的
@if(can('admins'))
<a href="{{ url(getLocal().'/admin/admins') }}" class="nav-link nav-toggle">
@endif
但是routes忽略了这个功能,打开了所有的routes。我在如下路线中使用该功能。有什么想法吗?
if (can('admins')) {
Route::get('home', 'Admin\AdminController@index')->name('admin.home');
Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
}
您的路线不需要有条件。定义您需要的所有路由,然后您可以使用中间件之类的东西限制对它们的访问。您可以创建一个简单的中间件,它接受一个参数并在 app/Http/Middleware/CanDoIt.php
:
中调用您的 can
函数
namespace App\Http\Middleware;
use Closure;
class CanDoIt
{
public function handle($request, Closure $next, $permission)
{
if (! can($permission)) {
// redirect to some where else
}
// allow the request to pass through
return $next($request);
}
}
您可以进入 app/Http/Kernel.php
并将您的中间件添加到那里的 $routeMiddleware
数组:
protected $routeMiddleware = [
...
'check' => \App\Http\Middleware\CanDoIt::class,
];
然后您可以将该中间件分配给您要通过 can('admins')
限制的路由组
Route::middleware('check:admins')->group(function () {
Route::get('home', 'Admin\AdminController@index')->name('admin.home');
Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
});
我没有命名中间件 can
,因为可能已经有一个名为 can
的中间件注册了授权。
我在 helpers.php 中有一个函数,我在任何 blade 中使用它来检查管理员是否有权查看某些按钮,它在 Controllers 中也有效,但在路由,忽略它的路由。
function can($permission)
{
$userCheck = auth()->guard('admin')->check();
$user = '';
if ($userCheck === false) {
return redirect('admin/login');
} else {
$user = auth()->guard('admin')->user();
}
if ($user->id === 1) {
return true;
}
$minutes = 5;
$permissions = Cache::remember('permissions_'.$user->id, $minutes, function () use ($user) {
return explode(',', $user->permission->permission);
});
$permissions = array_flatten($permissions);
return in_array($permission, $permissions);
}
我在blade/view.
中是这样用的@if(can('admins'))
<a href="{{ url(getLocal().'/admin/admins') }}" class="nav-link nav-toggle">
@endif
但是routes忽略了这个功能,打开了所有的routes。我在如下路线中使用该功能。有什么想法吗?
if (can('admins')) {
Route::get('home', 'Admin\AdminController@index')->name('admin.home');
Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
}
您的路线不需要有条件。定义您需要的所有路由,然后您可以使用中间件之类的东西限制对它们的访问。您可以创建一个简单的中间件,它接受一个参数并在 app/Http/Middleware/CanDoIt.php
:
can
函数
namespace App\Http\Middleware;
use Closure;
class CanDoIt
{
public function handle($request, Closure $next, $permission)
{
if (! can($permission)) {
// redirect to some where else
}
// allow the request to pass through
return $next($request);
}
}
您可以进入 app/Http/Kernel.php
并将您的中间件添加到那里的 $routeMiddleware
数组:
protected $routeMiddleware = [
...
'check' => \App\Http\Middleware\CanDoIt::class,
];
然后您可以将该中间件分配给您要通过 can('admins')
Route::middleware('check:admins')->group(function () {
Route::get('home', 'Admin\AdminController@index')->name('admin.home');
Route::get('/admins/{id}/edit', 'Admin\AdminController@edit')->name('admins.edit');
});
我没有命名中间件 can
,因为可能已经有一个名为 can
的中间件注册了授权。