Как ограничить редактирование только при отображении данных в индексе в laravel - PullRequest
0 голосов
/ 25 октября 2019

У меня проблема с моим edit.blade.php. В представлении шоу я ограничил его только для пользователей, вошедших в систему, как вы можете видеть в моем контроллере

 public function index()
    {
        $animal = Auth::user()->animals;
        return view('farms.index', compact('animal'));
    }

И в моем представлении индекса

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">Farm Dashboard</div>

                    <div class="card-body">
                        @if (session('status'))
                            <div class="alert alert-success" role="alert">
                                {{ session('status') }}
                            </div>
                        @endif

                        You are logged in! {{ Auth::user()->name }}
                            <br>
                        <a href="farms/create">Add animal</a>

                            @foreach( $animal as $animal)
                                <div class="row">
                                    <div class="col-2">{{ $animal->id }}</div>
                                    <div class="col-4"><a href="/farms/{{ $animal->id }}">{{ $animal->type->category }}</a></div>
                                    <div class="col-4">{{ $animal->created_at }}</div>
                                </div>
                            @endforeach


                        </div>
                </div>
            </div>
        </div>
    </div>
@endsection

Но у меня все еще естьпроблема, если я изменю в своем URL-адресе идентификационный номер объекта другого пользователя, я все еще могу редактировать и обновлять.

Что я могу изменить в своем контроллере, чтобы предотвратить это

 public function show($id)
    {
        $animal = Animal::query()->findOrFail($id);
        return view('farms.show', compact('animal'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param $id
     * @return void
     */
    public function edit($id)
    {
        $type = Type::all();
        $user = Auth::user();
        $animal = Animal::query()->findOrFail($id);

        return view('farms.edit', compact('animal', 'type', 'user'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param $id
     * @return void
     */
    public function update($id)
    {
        $animal = Animal::query()->findOrFail($id);
        $animal->update($this->validateRequest());

        return redirect('farms/' . $animal->id)->with('message', 'Animal Details Updated');
    }

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете следовать этому базовому / простому методу

Для шоу

public function show($id)
{
   try {
      $user = auth()->user();
      $animal = Animal::where('user_id', $user->id)->findOrFail($id);
      return view('farms.show', compact('animal'));
   } catch(\Exception $ex) {
      //return exception or any other page
      abort(404, 'Not allowed');
      //or return back()->withErrors(['Not allowed']);
   }
}

Для редактирования

public function edit($id)
{
   try {
     $type = Type::all();
     $user = auth()->user();
     $animal = Animal::where('user_id', $user->id)->findOrFail($id);

     return view('farms.edit', compact('animal', 'type', 'user'));
   } catch(\Exception $ex) {
      //return exception or any other page
   }

} 

Для обновления

public function update($id)
{
   try {
     $user = auth()->user();
     $animal = Animal::where('user_id', $user->id)->findOrFail($id);
     $animal->update($this->validateRequest());

     return redirect('farms/' . $animal->id)->with('message', 'Animal Details Updated'); //use route for redirect instead of url
   } catch(\Exception $ex) {
      //return exception or any other page
   }
}

Используйте try catch для исключения

Убедитесь, что вы определили, что животное имеет user_id

или

Вы также можете управлять этой функцией с помощью отношения Larave Eloquent отношениях

Для стандартной практики вы можете использовать политику Laravel Gate Политика Laravel через модель

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