프로그래밍 언어 & 프레임워크/PHP & Laravel

[Laravel] 라라벨 블레이드 템플릿 (보간, 조건문, 반복문)

라라벨은 풀스택 프레임워크이기에 프론트엔드도 어느정도 개발할 수 있고, 뷰나 리액트같은 SPA(Single Page Application) 프레임워크를 사용할 수도 있다. 그러한 프레임워크를 사용하여 컴포넌트를 사용하기 위한 기반 템플릿이 있는데, 라라벨의 블레이드 템플릿이 그러하다. PHP는 언어이면서 자체적으로 템플릿의 역할도 겸할 수 있는데, 블레이드는 템플릿의 역할을 보다 강화시킨 것이다. 많이 알려져 있는데 PHP 템플릿인 Twig, Mustache 랑 같은 개념이다.

블레이드 템플릿

블레이드 템플릿은 라라벨에서 프론트엔드 마크업 및 컴포넌트를 포함하고 작성하기 위한 템플릿이다. 일반적인 PHP 템플릿처럼 if, for 와 같은 제어구조를 사용할 수도 있고, 다른 템플릿을 상속받고 슬릇(Slot)과 같은 개념을 통해 부모 템플릿에 마크업을 삽입할 수도 있다. 이러한 개념들은 사뭇 프론트엔드 프레임워크 중 하나인 Vue.js 와 비슷한 느낌을 주기도 한다.

보간

템플릿에 데이터를 바인딩할 때에는 다른 프레임워크에서 많이본 것처럼 {{ }} 를 사용할 수 있다. 이는 <?= ?> 를 사용한 것과 비슷하지만 완전히 동일하지는 않다. 일부 문자에 대해 이스케이프를 처리하기 때문이다. 만약 이스케이프 처리하지 않는다면 XSS(Cross Site Scripting)과 같은 공격을 당할 위험이 크다.

{{ $variable }}

위와 같은 코드를 일반적인 PHP 에서 기능적으로 똑같이 구현한다면 아래와 같다.

<?=htmlentities($variable)?>

만약 이스케이프 처리를 하고 싶지 않다면, {!! !!} 를 사용할 수 있다. 이를 사용할 때는 주의해야 한다. 보안에 문제가 생길 수 있기 때문에 남용하면 안 된다. 또한 {{ }} 를 문자 그대로 출력하고 싶다면 @{{ }} 와 같이 @ 를 붙여서 사용하면 된다.

조건문

PHP 에서 if 문을 사용하듯 블레이드에서 사용할 수 있는데, 이러한 지시어(Directive)를 사용할 때는 @ 를 붙여서 사용한다. 블레이드에게 조건문은 @if, @elseif, @else, @endif 로 사용한다. 이는 마치 PHP 에서 제공하는 대체 문법(Alternative Syntax)과 사용법이 비슷하다고 볼 수 있다.

@if

@if(true)
  Hello, world
@elseif(false)
  Who are you?
@else
  Bye
@endif

@unless

또 한 가지, @unless, @endunless 가 있는데, 나도 그렇지만, 조건문에 ! 연산자를 사용하여 bool 에 대한 결과를 반전하여 조건처리를 하는 것에 거북함을 느낀다. 조건문에는 옳은 경우에 대해서 처리를 하게하는 것이 더 깨끗한 코드가 되기 때문이다. 따라서 @if !false 로 처리하는 것을 대신하여 @unless false 로 처리할 수 있다. 개인으로는 환영할만한 문법이다.

@unless(false)
  Hello, world
@endunless

반복문

반복문을 처리할 때도 마찬가지로 @for, @foreach, @while 을 사용할 수 있다. 그에 맞게 짝꿍으로 @endfor, @endforeach, @endwhile 이 존재한다. Go 또한 주가 되는 언어로 삼고 있는 내게 반복문이 여러개 있는 것은 그다지 좋아하지 않는다. 그저 for 문 하나만 있어도 되니까 말이다. 추가적으로 @forelse 도 존재한다. 

@for

@for 지시어를 사용하면 클래식한 일반적인 for 을 사용하기 위한 것이다.

@for($i = 0; $i < count($messages); $i++)
  {{ $messages[$i] }}
@endfor

@foreach

Traversable 인터페이스를 만족하는 객체 또는 배열을 순회하기 위해 @foreach 를 사용할 수 있다.

@foreach($messages as $message)
  {{ $message }}
@endforeach

@while

@while($message = array_pop($messages))
  {{ $message }}
@endwhile

@forelse

@forelse 는 기본적으로는 @foreach 와 동일하지만, 배열이 비어있을 때 @empty 지시어를 통해 별도의 행동을 취할 수 있다는 점이 다르다.

@forelse($messages as $message)
  {{ $message }}
@empty
  Messages is empty
@endforelse

$loop 변수 사용하기

$loop 변수는 @foreach, @forelse 내부에서 사용하며 루프에 대한 추가적인 정보를 가지고 있다. 이는 stdClass 타입이고, 예를 들어 $loop->index 는 현재 인덱스 정보를 담고있다. @foreach 에서는 인덱스와 같은 정보에 접근하려면 다소 귀찮았기 때문에 이러한 추가적인 정보를 제공하는 변수가 있다면 사용하기 유용할 것/이다. iteration, count 와 같은 프로퍼티들이 존재하는데, 조금 더 자세한 내용은 https://tutsforweb.com/loop-variable-foreach-blade-laravel/ 를 참고해보자.

더 읽을거리

https://laravel.com/docs/8.x/blade

https://laravel.kr/docs/8.x/views