질문을 삭제하지 말아주세요.!
 
1
0
-1

블레이드에서 아래와 같이 하면 커멘트를 삭제할 수 있는 권한이 있는 사람에게만 삭제 버튼을 보여줄 수 있다고 하는데요,

@can('delete', $comment)
    <form action="{{ route('comments.destroy') }}" method="post">
    ... 생략 ...
@endcan

DB::query 를 모니터링 해보니 매 @can 마다 아래의 쿼리를 요청하고 있더라구요.

select * from `users` where `users`.`id` = ? limit 1

사용자 정보는 한 번만 조회해서 계속 쓰면 되는데 저렇게 되면 쓸데 없이 DB에 무리만 주는 것 같아요. 원래 그런가요? 아니면 제가 뭔가 설정을 잘못했기 때문인가요?


--------------------------

아 @can 때문에 저 쿼리가 계속 나오는게 아니었습니다. 저 코드 상단에 eager 로드 되지 않은 관계 로드가 있었는데 제대로 파악을 못했었네요. 혹시 이 문제로 시간 쓰신 분들께 죄송합니다. ㅠ

    CommentAdd your comment...

    2 answers

    1.  
      4
      3
      2

      guard 에서 돌려주는 user 데이터는 캐쉬 되어 빈번한 디비 호출을 줄여줍니다. 


      https://github.com/laravel/framework/blob/5.4/src/Illuminate/Auth/SessionGuard.php

      라인 117

      // If we've already retrieved the user for the current request we can just

      // return it back immediately. We do not want to fetch the user data on

      // every call to this method because that would be tremendously slow.

      if (! is_null($this->user)) {

              return $this->user;

      }

      권한 변경이 일어났을 경우는 관리를 해 주셔야 하구요 ^^

        CommentAdd your comment...
      1.  
        2
        1
        0

        코드를 좀 살펴봤는데 이 부분을 항상 타게 되어있네요. DB를 타지 않는 Guard를 만들고 config/auth.php에 guards 배열에 등록하면 될 것 같은데, 1만 동접 아니면 성능에 큰 영향 없으니 지금대로 써도 아무 문제 없을 듯 합니다.


        https://github.com/laravel/framework/blob/5.4/src/Illuminate/Auth/AuthManager.php#L53-L55

          CommentAdd your comment...