아~~
암시적 라우트 모델 바인딩(Implicit Route Model Binding)이 작동해서 그런 겁니다.
라우팅에서 라우트 파라미터 이름을 {article}로 해 줬기때문에, {article}로 받은 ID를 가진 Article 모델을 찾은 후 컨트롤러의 인자로 넘겨주기 때문입니다.
250페이지 25.1 라우트 모델 바인딩을 참고해주세요.
14번에 담긴 내용이 "Hello, Laravel"인데, HTML 뷰나 debug 함수의 출력 값은 "실용적인 이벤트 등록"이란 잘못된 데이터가 출력된다는 질문이죠?
tinker에서 사용한 환경(서버+코드+데이터)와 브라우저에서 사용한 환경이 서로 다른 환경이 아닌 지 확인해보세요.
환경은 같이 환경에서 진행하였습니다.
tinker 에서는 ID 를 14 로 지정하셨네요, show($id) 를 호출하는 $id 값을 확인해보시면 될것 같습니다.
네. show($id)에서 $id값이 14로 들어가는 것을 확인했습니다.
그런데도 저렇게 나와서 질문 드렸습니다.
첫번째 이미지의 조회되는 ID 값이 11 인데 14로 들어간다는 거죠. ? 흠.. 이상하긴하네요;;
코드상에서 $ID 말고 14로 넣어보셔도 11이 출력되나요. ?
songc 님 말대로 코드에 14를 그냥 입력하니깐 정상적으로 나오네요.
git 소스랑 비교해서 뭐가 잘못되었는지 역추적해야겠네요.
show 호출 하는 곳에서 $id 찍어보시고
$article = \App\Article::findOrFail($id);
요거 위에서 $id 찍어보시고,
request 에서 받아오는 $id 값을 보시면 원인을 파악하기 쉬울것 같내요~
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 객체로 읽어 들이나 봅니다.
따라하다가 어디서 꼬여서 이렇게 된 건지....
아 그럼 var_dump($id) 로 객체에 id 항목이 어떤건지 확인해보시면 될것 같네요
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 함수가 구분할 수 있는지
의문입니다.
아래로 하면 진짜 id 값이 나올것 같내요.
$id = $id->id;
혹시 라우트에서 컨트롤러로 Request 를 받을때 아래처럼 받으신건가요. ?
public function sample(Request $id){ }
$id = $id->id; 로 하니깐 정상적으로 나옵니다.
Articlecontroller.php에서는
public function show($id)
{
}
로 받고 있습니다.
web.php
에서는
Route::resource('articles', 'ArticlesController');
이렇게 되어 있구요
show($id) 함수에서 받은 $id는 Article 객체라고 생각하고 있습니다만, Request 객체인건가요?
App\Article 객체입니다. dd(get_class($id))로 확인해 보세요.
$id라고 쓰신 파라미터는 함수 안에서만 사용할 수 있는 로컬 변수입니다. 실제로 담겨 있는 녀석은 App\Article 객체이므로 $article로 바꾸시고, 타입 힌트도 써주시는게 좋습니다. public function show(\App\Article $article) {...}
먼저 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로 입력한 값들은 잘 나옵니다만,
제가 직접 신규로 입력한 아티클만 다른 값을 불러오고 있습니다.
디버깅을 어떻게 해야 할까요?