Laravel-设置默认路由前缀



我想根据用户公司为所有路由设置默认路由前缀,例如

Route::group(['prefix' => '/{company}'], function() {
Route::get('/', 'CompaniesController@index')->name('company.index');
});

有没有办法通过中间件等设置此值,这样我就不必在每种方法上都做这样的事情,用户只能访问他们自己的公司。

public function index(Company $company)
{
if(auth()->user()->company == $company) {
return $company;
}
abort(404);
}

使用拉拉维尔 6.x

你不需要任何自定义中间件,你可以通过策略和Laravel的内置can中间件来实现这一点。

在您的情况下,它将如下所示:

// app/Policies/CompanyPolicy.php
class PostPolicy
{
public function view(User $user, Company $company)
{
return $user->company->getKey() === $company->getKey();
}
}

// web.php
Route::group(['prefix' => '/{company}'], function() {
Route::get('/', 'CompaniesController@index')->name('company.index');
})->middleware('can:view,company');

// Controller
public function index(Company $company)
{
return 'magic';
}

有关此内容的更多信息,您可以观看以下文档:
https://laravel.com/docs/6.x/authorization#creating-policies
https://laravel.com/docs/6.x/authorization#via-middleware

您可以在路由级别使用中间件,如下所示:

1( 构建中间件:

<?php
namespace AppHttpMiddleware;
use AppModelsCompany;
use Closure;
class CheckUserCompany
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
*
* @return mixed
*/
public function handle($request, Closure $next)
{
if(auth()->user()->company == $request->company) {
return $next(;
}
abort(404);
}
}

可能您不需要Company模型,因为您要从路由变量中获取公司值。

2( 在您的AppHttpKernel.php中注册您的中间件:

protected $routeMiddleware = [
'company.check' = AppHttpMiddlewareCheckUserCompany::class
];

3(那么你的路线应该看起来像:

Route::group(['prefix' => '/{company}', 'middleware' => 'company.check'], function() {
Route::get('/', 'CompaniesController@index')->name('company.index');
});
  1. 使用命令php artisan make:middleware CompanyMiddleware制作一个中间件,在内核中为其设置名称(我将其命名为"公司".php并处理 公司中间件中的方法必须如下所示:

    public function handle($request, Closure $next) {
    $request->attributes->add(['company' => auth()->user()->company]);
    return $next($request);
    }
    

    在内核中.php :

    'company' => CompanyMiddleware::class,
    
    1. 在路由中应用中间件:

      Route::group(['prefix' => '/{company}', 'middleware' => 'company'], function(){
      Route::get('/', 'CompaniesController@index')->name('company.index');
      });
      
    2. 在为其定义公司中间件的路由方法中获取$company:

      public function index() {
      $company = request()->company;
      }
      

我希望对您有用。

如果您询问在中间件类中注册路由,那么这实际上是不可能的,因为中间件本身就应用于已经注册的路由。


但是,您可以使用路由组并应用重定向到经过身份验证的用户的"公司"的中间件。

路线.php

<?php
use AppHttpMiddlewareRedirectToCompany;
// Use the auth middleware before the RedirectToCompany middleware to make sure users are authenticated
Route::middleware('auth', RedirectToCompany::class)->name('company.')->prefix('/{company}')->group(function () {
Route::get('/', ....)->name('index');
//Your routes here
})->where('company', '(google|microsoft|yahoo)'); //Here i supposed that your company is not really bound, you can omit this

注意:如果您的公司有不同的路线,您还可以在显示的路线组中注册多个工艺路线组。

重定向到公司.php

<?php
namespace AppHttpMiddleware;
use Closure;
public function handle($request, Closure $next)
{
if ($user->company != $request->route('company')) {
return redirect()->route('company.index'); //or even abort(404);
}
return $next($request); 
}

最新更新