Laravel - установка префикса маршрута по умолчанию - PullRequest
1 голос
/ 31 января 2020

Я бы хотел установить префикс маршрута по умолчанию для всех моих маршрутов в зависимости от компании пользователя, например:

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

});

Есть ли какой-нибудь способ, которым я могу установить это значение через middleware et c, поэтому я не могу Не нужно делать что-то подобное на каждом методе, и пользователь имеет доступ только к своей собственной компании.

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

Использование Laravel 6.x

Ответы [ 4 ]

1 голос
/ 31 января 2020
  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,
    
  2. в маршруте применить промежуточное ПО:

    Route::group(['prefix' => '/{company}', 'middleware' => 'company'], function(){
      Route::get('/', 'CompaniesController@index')->name('company.index');
    });
    
  3. получить $ company в методах маршрута, которые определяют промежуточное ПО компании для него:

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

Надеюсь полезно для вас.

1 голос
/ 31 января 2020

Вам не нужно никакого специального промежуточного программного обеспечения, для этого вы можете достичь этого с помощью политик и встроенного can промежуточного программного обеспечения laravel.

В вашем случае это будет что-то вроде следующего:

// 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 голос
/ 31 января 2020

Вы можете использовать промежуточное ПО на уровне маршрута следующим образом:

1) Создайте свое промежуточное ПО:

<?php

namespace App\Http\Middleware;

use App\Models\Company;
use Closure;

class CheckUserCompany
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(auth()->user()->company == $request->company) {
            return $next(;
        }
         abort(404);
     }
}

Возможно, вам здесь не нужна модель Company, поскольку вы получение значения компании из переменной маршрута.

2) Зарегистрируйте ваше промежуточное ПО в App\Http\Kernel.php:

protected $routeMiddleware = [
'company.check' = \App\Http\Middleware\CheckUserCompany::class
 ];

3) Тогда ваш маршрут должен выглядеть следующим образом:

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

});
0 голосов
/ 01 февраля 2020

Если вы спрашиваете о регистрации маршрутов внутри класса связующего ПО , то это на самом деле невозможно, поскольку само промежуточное ПО применяется на уже зарегистрированных маршрутах.


Однако вы можете использовать группы маршрутов и применять промежуточное программное обеспечение, которое перенаправляет на "компанию" аутентифицированного пользователя.

маршруты. php

<?php

use App\Http\Middleware\RedirectToCompany;

// 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

Примечание: Вы также можете зарегистрировать несколько групп маршрутов внутри представленной группы маршрутов, если у ваших компаний разные маршруты.

RedirectToCompany . php

<?php

namespace App\Http\Middleware;

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); 
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...