2013-06-30 1 views
2

때때로 foreach 태그의 공급에 배열이 포함되어 있지 않기 때문에 예외가 발생합니다.Laravel에서 좋은 연습 방법으로 정의되지 않은 변수와 배열을 처리하는 방법

좋아요; $array 실제로 배열되지 않기 때문에 (공통 if Something model doesn't contain any data이다) Something::all() returns null, foreach는 예외를 발생

//controller 
->with('array', Something::all()); 

//view 
@foreach ($array as $k => $v) 
    {{ $v }} 
@endforeach 

경우는 NULL이다.

나는이 예외를 막을 수있는 방법으로 예방할 수 있음을 알고 있습니다.

값이 설정되지 않은 경우 컨트롤러에서 선택하고 빈 배열을 누릅니다.

->with('array', Something::all() ?: array()); 

또는보기 파일에서도 마찬가지입니다.

@if(!empty($array)) 
    @foreach ($array as $k => $v) 
     {{ $v }} 
    @endforeach 
@endif 

두 가지 모두 정상적으로 작동하지만 둘 다 Laravel에서 이것을 처리하는 가장 좋은 방법이 무엇인지 궁금합니다. 컨트롤러에서? 보기? 다른 곳? 완전히 다른 개념? 이 문제를 해결하기위한 최선의 방법을 배우고 싶습니다.

ps. 나는 Laravel 예제를 주었지만 Laravel이 아닌 응답도 환영합니다.

답변

0

컨트롤러에서 이것을 확인한 결과, 항상 내 견해에서 로직을 최소화하려고 노력했습니다.

하지만 난 아마와이이 같은 웅변을 사용, 이것에 대한 더 Laravelish 스타일이있을 수 있습니다 느낄 수 있었다 : 방법에서 알 수 있듯이, 실패의 경우에 exeption를 throw

$model = User::findOrFail(1); 

$model = User::where('votes', '>', 100)->firstOrFail(); 

합니다.

+0

변수가 null 일 때 이미 예외가 발생합니다. 왜 똑같은 문제가 발생합니까? : p – Aristona

1

또 다른 잠재적 인 옵션은 다음과 같습니다.하지만보기에 너무 많은 논리가 두렵습니다.

@foreach ($array ?: array()) 
    ... 
@endforeach 
+0

이것은 내가 지금까지 그것을 최소화 할 수있는 방법입니다 ...하지만 당신 말이 맞아요. 뷰 파일에 대한 불필요한 논리입니다. – Aristona

1

비록 로직을 뷰에 최소한으로 유지하는 것이 "최상의"습관입니다. 모범 사례를 위해 가독성, 편의성 및 UX를 희생하지 않겠습니다.

데이터 배열이 비어 있다면 사용자에게 몇 가지 메시지를 표시하는 것이 좋습니다. 그래서, 다음과 같은 일을하는 것이 논리적으로 보입니다.

@if(!empty($array)) 
    <table> 
    @foreach ($array as $k => $v) 
    <tr><td>{{ $v }}</tr></td> 
    @endforeach 
    </table> 
@else: 
    <div class="alert">No records found.</div> 
@endif 
+1

나는 보통이 방법으로 그렇게하지만, 나는 내 프로젝트에서 table.js를 사용하고 있으며, "No records found."그 자체로 에있는 데이터의 양은 1보다 적습니다. 따라서 두 번째는 종종 저에게는 불필요합니다. 그러나 if (! empty ($ array))는 종종 나쁜 연습 사용과 같은 느낌을줍니다. 어떻게 든 개선 될 수 있습니다. – Aristona

3

지금까지 가장 좋은 해결책이라고 생각합니다.

@if(!$something->isEmpty()) 
    @foreach($something as $k => $v) 
     ... 
    @endforeach 
@endif 

이유는 응답이 개체 일 때 비어있는/체크섬이 실패하는 것과 같은 검사를하기 때문입니다. 그들은 true로 캐스팅하고 foreach를 중단합니다. 한편,

isEmpty()은 그 문제 자체를 다룹니다.

관련 문제