2024년 6월 17일 월요일

Laravel : Router 에 대해

Laravel : Router 에 대해

Laravel : Route 에 대해 알아보기

Laravel 프레임워크에서는 사용자의 Http 요청에 대해 Http Kernel 을 통해서 Router에 전달하여 컨트롤러와 뷰의 결과를 돌려주는 역활을 한다.

router 는 각 요청에 맞게 분류해서 web 또는 api , sonsole, channel 등 요청형식에 맞는 미들웨어를 거치게 되는데, Laravel의 routes 폴더에 보면 각 요청에 맞게 routing 을 담당하는 4개의 기본 파일들을 볼수있다.

  • web.php : HTTP 요청을 받아서 화면에 표시할때 사용되어진다. laravel 프로그램워크에서는 web.php에 csrf(교차 사이트 요청 위조 공격) 미들웨어가 처리하고 있어서, csrf키가 없이는 외부에서 post, put, delete 등을 할수 없다. 즉, 서버에서 생성한 csrf 키를 이용해서 post,put,delete시에 _token 이라는 이름으로 값은 키값을 전송하지 않으면 등록 거부가 된다.
  • api.php : 외부에서 POST, PUT 등이 가능하며 요청주소에 /api/ 가 포함되어 있을때 api.php 에서 처리하게 된다.

Laravel 프레이워크 중 /app/Http/Kernel.php 파일을 열어보면 아래와 같이 web 와 api 일때 처리하는 미들웨어가 다르다는 것을 알수있따.

  /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

routes/api.php 파일을 수정한 후에는 반드시 php artisan route:cache 해주자.

web route 과 api route 를 확인해 보자.

web route 부터 확인해 보자.

1.먼저 Route 에서 해당 주소로 요청 했을 때, 처리할 Controller 를 추가하자.

php artisan make:controller WebRouteController

2.아래처럼 화면에 보여질 내용을 추가하자.

public function test(Request $request) {
return ‘welcome wep route’
}

3.web.php 에 아래와 같이 과정1과 2에서 만든 Controller 와 함수를 지정한다.

Route::get('webroute', 'WebRouteController@test');

4.localhost/webroute 로 접속해 보면 ‘welcome wep route’ 가 보일것이다.
만일 “Target class [WebRouteController] does not exist.” 메시지가 나타난다면, 컨트롤러의 전체 주소를 적어줘도 된다.

Route::get('webroute', 'App\Http\Controllers\WebRouteController@test');

만일 Router 에서 매번 App\Http\Controllers\ 의 긴 경로를 적기 귀찮다면 app/Providers/RouteServiceProvider.php 의 아래 항목을 주석제거 하면 된다.

// protected $namespace = 'App\\Http\\Controllers';
를
protected $namespace = 'App\\Http\\Controllers';
로 주석제거

이제 과정3에서 처럼 적어줘도 에러없이 메시지가 출력된다.

api route 도 확인해 보자.

api route 는 앞서 말했듯이, post, get, put, delete 메소드에 csrf 가 적용되어 있지않기 때문에 주소만 알면 전부 다 가능하다. post가 되는지 확인해 보자.

1.먼저 Route 에서 해당 주소로 post 했을 때, 처리할 Controller 를 추가하자.

php artisan make:controller ApiRouterController

2.post로 전송받는거기 때문에 받은 내용을 그대로 출력해보자

  function postTest(Request $request)
  {
    return $request;
  }

3.api route에 접속주소와 컨트롤러,함수를 지정해보자

Route::post('/posttest', [App\Http\Controllers\ApiRouterController::class, 'postTest']);

4.주소로 post 메소드를 이용해서 데이터를 보내보자. (PostMan 또는 curl 이용한다.)

curl -X POST -H "Content-Type: application/json" -d '{"haha":"oh"}' http://localhost:80/api/posttest

Laravel에서는 post 값을 json 을 기본으로 하고있다.
일반 text를 전송하고자 한다면 아래처럼 postTest의 내용을 바꾸고

function postTest(Request $request)  
{  
    return response($request->getContent(), 200)  
        ->header('Content-Type', 'text/plain');  
}

curl -X POST -H "Content-Type: text/plain" -d 'poooooost' http://localhost:80/api/posttest

resource route 로 CRUD(create, red, update, delete) 를 쉽게 해보자.

api route 로 post, put, delete을 각각 명시해줘도 좋지만 어차피 get,post,put,delete 를 구현할꺼라면 CRUD 에 직접대응하는 resource route 이용해 보는것도 좋다.

1.먼저 Controller 를 추가하는데 맨뒤에 인자로 --resource를 붙여준다.

   php artisan make:controller ResourceRouteSampleController --resource

2.ResourceRouteSampleController.php를 열어보면 index,create, store, show edit 함수가 미리 정의되어 있다. 이말은 즉, 사용자가 보내는 요청 메소드에 따라서 laravel의 resource라우터가 해당 함수를 실행한다는 의미이다.

   php artisan make:controller ResourceRouteSampleController --api

아래 처럼 생성된다.

  <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class ResourceRouteSampleController extends Controller  
{  
    /**  
 * Display a listing of the resource. * * @return \Illuminate\Http\Response  
 */  
 public function index()  
    {  
        //  
       return response()->make('my message' , 405);
  }  
  
    /**  
 * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request  
  * @return \Illuminate\Http\Response  
 */  
 public function store(Request $request)  
    {  
        //  
  }  
  
    /**  
 * Display the specified resource. * * @param int $id  
  * @return \Illuminate\Http\Response  
 */  
 public function show($id)  
    {  
        // 
        return response()->make($id , 405); 
  }  
  
    /**  
 * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request  
  * @param int $id  
  * @return \Illuminate\Http\Response  
 */  
 public function update(Request $request, $id)  
    {  
        //  
  }  
  
    /**  
 * Remove the specified resource from storage. * * @param int $id  
  * @return \Illuminate\Http\Response  
 */  public function destroy($id)  
    {  
        //  
  }  
}

과정4에서 테스트하기 위해서 함수에 응답을 추가했다.
index() 함수 : return response()->make(‘my message’ , 405);
show() 함수 : return response()->make($id , 405);

3.이제 api.php 에 resource route를 추가하면 된다.
Route::apiResource(’/resources’,‘ResourceRouteSampleController’);

만일 사용자로부터 일부 메소드만 허용하고자 한다면 only 키워드를 사용할수있다.

Route::apiResource('/resources','ResourceRouteSampleController', ['only' => ['index','store', 'show']]);
  • 참고로 Route::resource() 도 있는데, 이는 일반적인 리소스에 대한 것으로 create, edit 등이 추가된 것이다.
  • 일반적으로 RESTful API 에는 create, edit 메소드가 없는것이 정상이므로 Route::apiResource 를 사용한다.
  1. 테스트 해보자
    curl -X GET http://localhost:80/api/resources -> message
    curl -X GET http://localhost:80/api/resources/1 -> 1

0 comments:

댓글 쓰기