Фильтр промежуточного программного обеспечения для всей моей группы маршрутов, кроме одной

У меня проблема с активацией промежуточного программного обеспечения в группе маршрутов на laravel 5.7. Это простое промежуточное программное обеспечение для поста фильтра (в моем случае в центре), которое принадлежит или нет зарегистрированному пользователю.

Я активирую промежуточное ПО на группе из 4 маршрутов (редактировать, удалять, показывать и уничтожать), и оно подходит для всех, но не для обновления. Для обновления это сделать никто не может.

У меня есть это промежуточное ПО в Centrepolicy

<?php

namespace App\Policies;
use Illuminate\Support\Facades\Auth;
use App\Models\Auth\User;
use App\models\Centre;
use Illuminate\Auth\Access\HandlesAuthorization;

class CentrePolicy
{
    use HandlesAuthorization;






    public function manage(User $user, Centre $centre)
    {
        if(!Auth::user()->hasRole('administrator')) {
            return $user->id === $centre->user_id;
        }
        return true;

    }

Мой маршрут

/*
 * All route names are prefixed with 'admin.auth'.
 */
Route::group([
    'prefix'     => 'auth',
    'as'         => 'auth.',
    'namespace'  => 'Auth',
    'middleware' => ['permission:voir liste centre']
], function () {

    Route::group(['namespace' => 'Centre'], function () {


        Route::get('centres/create', 'CentreController@create')->name('centre.create');
          Route::get('centres', 'CentreController@index')->name('centre.index');
        Route::post('centres/store', 'CentreController@store')->name('centre.store');
    });
        Route::group(['prefix' => 'centres/{centre}', 'namespace' => 'Centre', 'middleware' => ['can:manage,centre']], function () {
       Route::get('/edit', 'CentreController@edit')->name('centre.edit');
        Route::get('/show', 'CentreController@show')->name('centre.show');
            Route::put('/update', 'CentreController@update')->name('centre.update');
        Route::get('/delete', 'CentreController@destroy')->name('centre.destroy');

    });

мой контроллер

<?php

namespace App\Http\Controllers\Backend\Auth\Centre;


use Illuminate\Http\Request;
use App\Models\Centre;
use App\Models\Auth\user;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;


class CentreController extends Controller
{


    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index(Guard $auth)
    {
       /// $centres = centre::get()->paginate(5);
        $centres = DB::table('centres')->paginate(10 );
        if(!Auth::user()->hasRole('administrator')) {
            $centres = $auth->user()->centre()->paginate(10);
        }
        return view('backend.centre.index', compact('centres'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $centre = new Centre;
        return view('backend.centre.createcentre', ['centre' => $centre ]);
      /// return view('backend.centre.createcentre');

    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store(Request $request)
    {

        $centres = new Centre($request->all());
        $centres->user_id = Auth::user()->id;
        $centres->save();

        return redirect()->route('admin.auth.centre.index');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show(Centre $centre)
    {


        return view('backend.centre.show', compact('centre'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit(Centre $centre)
    {


            return view('backend.centre.editcentre', compact('centre'));

    }

    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id, Request $request)
    {

        $centres = Centre::find($id);
        $centres->update($request->all());
        return redirect()->route('admin.auth.centre.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy(Centre $centre)
    {

        $centre->delete();
        return redirect()->route('admin.auth.centre.index');
    }





}

И моя модель

<?php

namespace App\Models;
use App\Models\Auth\user;
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;


class Centre extends Model
{


    protected $fillable = ['titre', 'description', 'enligne', 'user_id', 'capacite', 'slug'];

/*
    public function setSlugAttribute($value)
    {
        if (empty($slug)) {
            $this->attributes['slug'] = str_slug($this->titre);
        }
    }
*/
    public function user()
    {
        return $this->belongsTo(User::class);
    }

Моя форма для редактирования маршрута

<?php
///dd($centre);

if($centre->id){
    $options = ['method' =>'put', 'route' =>['admin.auth.centre.update', $centre]];
} else {
    $options = ['method' =>'post', 'route' => ['admin.auth.centre.store']];
}

?>


{!! Form::model($centre, $options) !!}
<div class="form-group">
    {{ Form::label('Titre', 'Titre', ['class' => 'control-label']) }}
    {!! Form::text('titre', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
    {{ Form::label('description', 'description', ['class' => 'control-label']) }}
    {!! Form::textarea('description', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
    {{ Form::label('capacité maximum', 'capacite', ['class' => 'control-label']) }}
    {!! Form::textarea('capacite', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
    {!! Form::hidden('enligne', '0') !!}
    {!! Form::checkbox('enligne', '1' , null) !!}

</div>

{!!Form::submit("Envoyer", ['class' => 'btn btn-primary'])!!}
{!! Form::close() !!}

Когда я прихожу на страницу обновления в admin / auth / center / 13 / update, у меня ошибка 403, и в панели отладки у меня есть 3 ворот, 2 первые в порядке и последние:

success
array:4 [▼
  "ability" => "view backend"
  "result" => true
  "user" => 1
  "arguments" => "[]"
]
success
array:4 [▼
  "ability" => "voir liste centre"
  "result" => true
  "user" => 1
  "arguments" => "[]"
]
error
array:4 [▼
  "ability" => "manage"
  "result" => null
  "user" => 1
  "arguments" => "[0 => 13]"
]

Я думаю, что есть проблема с аргументом, но этот маршрут такой же, как удаление / отображение / уничтожение, поэтому я не понимаю

отредактируйте сегодня, я пытаюсь написать промежуточное программное обеспечение следующим образом:

public function manage(User $user, Centre $centre)
    {

        return true;

    }

Но делать нечего, не работай. Какое действие может отключить это промежуточное ПО только на маршруте обновления, потому что оно активно и нормально на 3 других маршрутах?


person chris tophe    schedule 28.01.2019    source источник


Ответы (1)


Я думаю, проблема в том, что вы пытаетесь получить доступ к id в качестве первого параметра функции и Request в качестве второго. Предполагается, что с Laravel он работает так: если вам нужен Request внутри функции, он всегда должен быть first parameter inside the function, а затем могут следовать все другие параметры, если по какой-то причине Request вам не нужен, и вы не включаете это как function parameter, тогда вы можете использовать other parameter as first one, но как только вы добавите Request в качестве одного из параметров, это должно быть first parameter.

Я думаю, что простое исправление будет:

...
public function update(Request $request, $id) {
...

РЕДАКТИРОВАТЬ: После того, как вы обновили свой ответ, показывая нам, как вы отправляете id модели, которую вы обновляете, мне кажется, что вы отправляете его неправильно. Это должно быть что-то вроде этого:

...
$options = ['method' =>'put', 'route' => ['admin.auth.centre.update', $centre->id]];
...

РЕДАКТИРОВАТЬ: Еще одна вещь, которая пришла мне в голову, - почему вы используете Auth::user() из Policy, когда у вас уже есть Authenticated user в $user переменной?

Попробуйте изменить свой if statement код на этот:

...
    if(!$user->hasRole('administrator')) {
        return $user->id === $centre->user_id;
    }
...
person Nikola Gavric    schedule 28.01.2019
comment
пробовал, но не работает. Я не думаю, что проблема в контроллере, потому что, когда я хочу обновить, я не прибываю к контроллеру. Я заблокирован непосредственно промежуточным программным обеспечением маршрута. - person chris tophe; 28.01.2019
comment
Тогда нам нужно увидеть ваше permission промежуточное ПО. - person Nikola Gavric; 28.01.2019
comment
Промежуточное ПО для разрешений просто основано на github.com/spatie/laravel-permission. Я добавил одно простое разрешение ['permission: voir liste center'] и добавил его в маршрут - person chris tophe; 28.01.2019
comment
Это определенно ошибка в вашем middlewares, мое безумное предположение состоит в том, что вы не приняли во внимание какой-то логический случай с permissions/roles, но я не могу сказать из кода, который вы указали, что это такое, поскольку все выглядит нормально, вы должен отлаживать, если permissions и roles верны, когда вы достигаете manage и centre промежуточного программного обеспечения - person Nikola Gavric; 28.01.2019
comment
Я добавил отладочную панель / результат ворот. Я думаю, что проблема в параметре в URL-адресе, но не нашел, почему - person chris tophe; 28.01.2019
comment
Да, это то, что я сделал сначала, но это решение тоже не работает - person chris tophe; 28.01.2019
comment
Да, есть, это в Centrepolicy, первом файле в моем посте. И это нормально, когда я использую его с удалением / показом / уничтожением. - person chris tophe; 28.01.2019
comment
Да это ошибка. Я новичок, поэтому мой код не оптимизирован. Но не работай. Это большая проблема. Я не понимаю, почему я могу использовать весь свой маршрут, и промежуточное ПО в порядке, а не для маршрута обновления. Для меня это очень странно. - person chris tophe; 28.01.2019
comment
Ваш manage метод возвращает null по какой-то причине вам нужно отладить и посмотреть, что происходит, если у вас есть before метод в вашем Policy, также попробуйте отладить и посмотреть, не сломается ли он там - person Nikola Gavric; 28.01.2019
comment
да, я понимаю, но не знаю, как это отладить. Я думаю, что логика хороша, но промежуточное ПО очень плохо выполняет свою работу. Он отлично справляется с другим маршрутом, но не с этим. Благодарность - person chris tophe; 28.01.2019