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

먼저 URL 호출값은 아래와 같습니다. 14번 아티클을 호출합니다.

http://myapp.dev:8000/articles/14


소스 상에서 debug로 출력한 값입니다.

public function show($id)
{
   $article = \App\Article::findOrFail($id);

   debug(\App\Article::findOrFail($id));

   return view('articles.show', compact('article', $article));

}

위의 출력한 값은 제가 기대하는 값이 아닙니다. 

그래서 tinker로 값을 조회해 봤습니다. 그러면 정상적으로 나타납니다.


db:seed로 입력한 값들은 잘 나옵니다만,

제가 직접 신규로 입력한 아티클만 다른 값을 불러오고 있습니다.

디버깅을 어떻게 해야 할까요?

    CommentAdd your comment...

    3 answers

    1.  
      1
      0
      -1

      아~~
      암시적 라우트 모델 바인딩(Implicit Route Model Binding)이 작동해서 그런 겁니다.

      라우팅에서 라우트 파라미터 이름을 {article}로 해 줬기때문에, {article}로 받은 ID를 가진 Article 모델을 찾은 후 컨트롤러의 인자로 넘겨주기 때문입니다.

      250페이지 25.1 라우트 모델 바인딩을 참고해주세요. 

        CommentAdd your comment...
      1.  
        1
        0
        -1

        14번에 담긴 내용이 "Hello, Laravel"인데, HTML 뷰나 debug 함수의 출력 값은 "실용적인 이벤트 등록"이란 잘못된 데이터가 출력된다는 질문이죠?

        tinker에서 사용한 환경(서버+코드+데이터)와 브라우저에서 사용한 환경이 서로 다른 환경이 아닌 지 확인해보세요. 

        1. 정성화

          환경은 같이 환경에서 진행하였습니다.

        CommentAdd your comment...
      2.  
        1
        0
        -1

        tinker 에서는 ID 를 14 로 지정하셨네요, show($id) 를 호출하는 $id 값을 확인해보시면 될것 같습니다.

        1. 정성화

          네. show($id)에서 $id값이 14로 들어가는 것을 확인했습니다.

          그런데도 저렇게 나와서 질문 드렸습니다.

        2. songc

          첫번째 이미지의 조회되는 ID 값이 11 인데 14로 들어간다는 거죠. ? 흠.. 이상하긴하네요;;


          코드상에서 $ID 말고 14로 넣어보셔도 11이 출력되나요. ? 

        3. 정성화

          songc 님 말대로 코드에 14를 그냥 입력하니깐 정상적으로 나오네요.

          git 소스랑 비교해서 뭐가 잘못되었는지 역추적해야겠네요.

        4. songc

          show 호출 하는 곳에서 $id 찍어보시고 

           $article = \App\Article::findOrFail($id);

          요거 위에서 $id 찍어보시고,

          request 에서 받아오는 $id 값을 보시면 원인을 파악하기 쉬울것 같내요~

        5. 정성화

          route:listㅣ를 확인해 보니

          articles/{article}  | articles.show 로 되어있는데

          -ArticlesController.php 파일에서는

          public function show($id)

          {

             $article = \App\Article::findOrFail($id);

          }

          로 되어 있어서

          http://myapp.dev:8000/articles/14 로 접속해도

          14 정수가 아닌 article 객체로 읽어 들이나 봅니다.


          따라하다가 어디서 꼬여서 이렇게 된 건지....

        6. songc

          아 그럼 var_dump($id) 로 객체에 id 항목이 어떤건지 확인해보시면 될것 같네요

        7. 정성화

          var_dump($id) 결과입니다.

          14번으로 잘 들어가 있는것 같습니다만,

          여기서 제가 제일 궁금한건

          http://myapp.dev:8000/articles/14 로 호출을 했는데

          route에서 

          articles/{article} 이렇게 되어 있으면

          라라벨에서 articles의 id 14번으로 디비를 조회하고 그 결과값으로 아티클 객체를 

          ArticlesController.show($id) 메서드로 알아서 전달해 주는것인가요?

          이게 제가 지금 이해하고 있는 부분인데,

          그리고 show($id)로 값을 받은경우 아래의 문장은

          $article = \App\Article::findOrFail($id);

          $id 값이 article 객체로 들어가버리면 객체내의 id값을 어떻게 findOrFail 함수가 구분할 수 있는지

          의문입니다.

        8. songc

          아래로 하면 진짜 id 값이 나올것 같내요.

          $id = $id->id;

          혹시 라우트에서 컨트롤러로 Request 를 받을때 아래처럼 받으신건가요. ? 

          public function sample(Request $id){
          
          
          }



        9. 정성화

          $id = $id->id; 로 하니깐 정상적으로 나옵니다.

          Articlecontroller.php에서는

          public function show($id)

          {

          }

          로 받고 있습니다.

          web.php

          에서는

          Route::resource('articles', 'ArticlesController'); 

          이렇게 되어 있구요

          show($id) 함수에서 받은 $id는 Article 객체라고 생각하고 있습니다만, Request 객체인건가요?

        10. 김주원

          App\Article 객체입니다. dd(get_class($id))로 확인해 보세요.

          $id라고 쓰신 파라미터는 함수 안에서만 사용할 수 있는 로컬 변수입니다. 실제로 담겨 있는 녀석은 App\Article 객체이므로 $article로 바꾸시고, 타입 힌트도 써주시는게 좋습니다. public function show(\App\Article $article) {...}

        CommentAdd your comment...