Uppgift: Användare och middleware - osadi/yrgo GitHub Wiki

Från start så får vi med användarhantering i Laravel 5 så vi använder oss av den.

Vi börjar med att sätta en property på vår AuthController

protected redirectTo = 'movies';

Sen sätter vi upp relationen mellan vår användare och vår film. Från vår användare så blir det en One To Many. Så i User:

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function movies()
{
    return $this->hasMany('App\Movie');
}

På vår inverse side så blir det en belongs to. Så i vår Movie:

/**
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function user()
{
    return $this->belongsTo('App\User');
}

Sen behöver vi fixa relationen i vår db:

php artisan make:migration add_user_id_to_movies --table=movies

Så i vår up lägger vi till en integer som är unsigned. Och i vår down så droppar vi kolumnen:

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('movies', function(Blueprint $table)
    {
        $table->integer('user_id')->unsigned();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('movies', function(Blueprint $table)
    {
        $table->dropColumn('user_id');
    });
}

Glöm inte att köra den.

Det sista vi behöver göra för att det ska fungera är att lägga till i vår store()-metod:

/**
 * @param MovieRequest|Request $request
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function store(MovieRequest $request)
{
    $movie    = new Movie($request->all());
    $genreIds = $request->input('genre_list');

    Auth::user()->movies()->save($movie);
    $movie->genres()->attach($genreIds);

    return redirect('movies');
}

Och fixa till så att vi slipper se knapparna om vi inte är ägare. index.blade.php:

            @if(Auth::user() == $movie->user)
                <div class="btn-group">
                    {!! Form::submit('Radera', ['class' => 'btn btn-danger']) !!}
                    <a href="{{ action('MoviesController@edit', $movie->slug) }}" class="btn btn-success">Redigera</a>
                </div>
            @endif

Sen så sätter vi upp begränsningarna i vår app mha middleware. Det är detta som gör att vi inte kan se annat än listan och en enskild film om vi inte är inloggade: Så i vår MoviesControllerlägger vi till en construct.

/**
 *
 */
public function __construct()
{
    $this->middleware('auth', ['except' => ['show', 'index']]);
}

Ok. Allt är väl. Förutom att man fortfarande kan redigera filmer som man inte är ägare till. Det skulle vi kunna fixa genom att skapa en egen middleware och där göra vår begränsning:

php artisan make:middleware MovieOwner

Vi registrerar vår nya middleware i App\Http\Kernel:

'owner' => 'App\Http\Middleware\MovieOwner'

och så fixar vi till handle-metoden i vår middleware:

use App\Movie;

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */

public function handle($request, Closure $next)
{
    $slug  = $request->route('slug');
    $movie = Movie::where(['slug' => $slug])->firstOrFail();


    if(\Auth::user() != $movie->user) {
        return redirect('movies');
    }

    return $next($request);
}

och så lägger vi till den i vår constructor på MoviesController:

public function __construct()
{
    $this->middleware('auth', ['except' => ['show', 'index']]);
    $this->middleware('owner', ['only' => ['edit', 'update', 'destroy']]);
}
⚠️ **GitHub.com Fallback** ⚠️