박주니 개발 정리

middleware 기본 적용 및 등급에 따른 간단한 화면전환 본문

라라벨

middleware 기본 적용 및 등급에 따른 간단한 화면전환

박주니 2022. 3. 21. 16:16
728x90
반응형

middleware 기본 적용 

우선 저는 middleware을 통해서 회원일경우에는 적용하고자하는 페이지에 이동하고 아닐 경우에는 home으로 돌아갈 수 있게 적용을 해볼려고합니다. 

 

1. php artisan make:middleware [미들웨어 명] 진행해서 새로 미들웨어를 만들어주시길 바랍니다. 저는 CheckRole로 미들웨어 명을 했습니다.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        return redirect()->route('home');
    }
}
  • 생성하면 Http\Middleware에서 만든 미들웨어를 확인하시면 상단에 코드가 생성된 것을 볼 수 있습니다.

2. App\Middleware\Kernel.php에서 $routeMiddleware에 미들웨어 생성한 것을 연결해주시길 바랍니다.

Kernel.php 위치

    protected $routeMiddleware = [
        ...
        'role' => \App\Http\Middleware\CheckRole::class
    ];
  • 참고사항▶ 'role' 은 web.php에서 route에 CheckRole이라는 middleware을 요청할 때 middleware('role')로 해서 연결하는 걸로 이해하시면 됩니다. 

3. web.php에서 middleware 사용하는 루트에 middleware('role')을 사용하시면 됩니다.

Route::get('/role/{user}', [App\Http\Controllers\UserController::class, 'checkRole'])
    ->name('users.role')
    ->middleware('role');

 

여기까지가 기본적인 middleware 연결 방법입니다. 그럼 아까 말씀드린 것처럼 role이 user일 때는 적용 페이지에 이동 아닐 경우에는 home으로 이동하게 진행을 해보겠습니다. 

기본 페이지를 하나 만들어주시길 바랍니다. 저는 이동된 페이지에서 등급에 따른 화면 전환도 할 것이기 때문에 감안해서 프론트를 만들었습니다.

@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">Role</div>
                    <div>브론즈</div>
                    <div>실버</div>
                    <div>골드</div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
  • 참고사항▶
  • ①저는 만든 페이지를 web.php에서 3번에 올린 코드처럼 루트를 연결 했습니다. /role/{user}로 맞춰서 연결해주시길 바랍니다.
  • ②조건문을 적용하기 위해서는 먼저 값을 controller에서 내보내야하는데 셋팅 전단계여서 조건문은 초기에는 설정하지 않았습니다.

4. web.php에서 middleware role에 user라는 value가 전달될 수 있게 셋팅합니다.

Route::get('/role/{user}', [App\Http\Controllers\UserController::class, 'checkRole'])
    ->name('users.role')
    ->middleware('role:user');

5. Middleware 에서 CheckRole에 web.php에 전달한 인자를 받을 매개변수를 생성하고 제대로 전달되는 지 확인합니다.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, $role)
    {
		dd($role);

        return $next($request);
    }
}
  • 참고사항▶ 저는 받을 인자의 매개변수를 $role로 했고 dd($role);을 했을 때 정상적으로 연결이 되었다면 아까 value로 설정한 'user'가 전달되는 것을 확인할 수 있습니다.

6. 미들웨어에서 전달된 값이 user일 때 적용페이지, 아닐 경우에는 home 루트로 이동할 수 있게 조건문을 작성합니다.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, $role)
    {
        if($role == 'user'){
            return $next($request);
        }

        return redirect()->route('home');
    }
}

참고사항▶

  • $role == 'user' 일 경우에 그대로 진행될 수 있게 return $next($request)로 합니다.
  • return redirect()->route('home') 은 if가 아닐 경우 즉 미들웨어가 user을 전달받지 않을 때 진행됩니다.

7. web.php에서 middleware('role:user') or middleware('role:admin')일 경우 어떻게 나오는 지 확인하시길 바랍니다. 정상적으로 하셨다면 role이 admin으로 했을 때에는 home으로 이동되어야합니다. 

 


등급에 따른 화면 전환

기본적으로 구성된 user DB에 role을 추가해주시길 바랍니다. 저는 role 적용을 미들웨어 테스트할 때 설명한 프론트 코드로 이어서 진행하겠습니다. 

참고사항▶

  • role은 임의적으로 브론즈, 실버, 골드로 세가지 등급으로 나뉘었습니다.

1. 먼저 view에서 데이터를 받아서 조건에 따라 화면을 전환하기 위해서는 controller에서 user 데이터를 compact해서 보내줍니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Log;

class UserController extends Controller
{
    public function __construct(){
        $this->middleware('auth');
    }

    public function checkRole($user){
        $checkUser = User::find($user);

        return view('users.role', compact('checkUser'));
    }
}

 

참고사항▶

  • ①미들웨어하실 때 연결한 web.php가 곧 view를 가지고 오는 controller이기 때문에 저는 등급에 따라 다르게 보이게 하기 위해서는 상세로 보내야하기 때문에 /role/{user}로 연결했고 class에는 $user로 받아서 진행했습니다.
  • ②User::find($user);로 해서 해당되는 queryString에 데이터를 가지고 와서 view에 compact로 보내줬습니다. 

2. compact로 내보낸 데이터 중 role만 가지고 와서 해당 유저의 role에 따라 if~else문으로 다르게 적용해주시길 바랍니다.

@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">Role</div>
                    @if ($checkUser->role == '브론즈')
                        <div>브론즈</div>
                        @elseif ($checkUser->role == '실버')
                        <div>실버</div>
                        @elseif ($checkUser->role == '골드')
                        <div>골드</div>
                    @endif
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

3. 제대로 전환되는 지 경로 검색 후 확인하시길 바랍니다.

 

728x90
반응형
Comments