라라벨은 풀스택 프레임워크이기에 프론트엔드도 어느정도 개발할 수 있고, 뷰나 리액트같은 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/ 를 참고해보자.