[Laravel] Laravel 템플릿에서 데이터 전달 및 렌더링

Devbaul·2021년 8월 5일
0

Laravel

목록 보기
3/22
post-thumbnail

Laravel 템플릿에서 데이터 전달 및 렌더링

  • 이전에 blade를 통한 개발을 했었습니다. 지금 하려고 하는 것은 데이터를 blade에 전달하여 렌더링을 하려합니다.

실습 예제

  • 우선 전달하고자 하는 값들을 먼저 Route를 통하여 정의 합니다.
  • 아래와 같이 $posts에 id의 값이 1이 되었을 때의 값과 2였을 때의 값을 title, content에 값을 정하여 배열 형식으로 정의 합니다.
<?php
// routes/web.php

Route::get('/posts/{id}', function ($id) {
    
    $posts = [
        1 => [
            'title' => 'Intro to Laravel',
            'content' => 'This is a short intro to Laravel'
        ],
        2 => [
            'title' => 'Intro to PHP',
            'content' => 'This is a short intro to PHP'
        ]
    ];

    return view('posts.show', ['post' => $posts[$id]]);
})->name('posts.show');
  • 이전에 사용 했던 resources/layouts/app.blade.php를 사용할 생각입니다.
  • 블레이드의 {{ }} 구문은 XSS 공격을 방지하기 위해서 자동으로 PHP의 htmlspecialchars 함수를 실행하게 됩니다
// resources/views/posts/show.blade.php

@extends('layouts.app')

@section('title', $post['title'])

@section('content')
<h1>{{ $post['title'] }}</h1>
<p>{{ $post['content'] }}</p>
@endsection

실행 결과

1

2

만약 다른 값을 주면?

  • 아래와 같은 에러 메시지가 나오고 어디서 문제인지가 나오게 됩니다.
  • 하지만 정확한 에러의 메시지를 출력하고자 할 땐
  • abort_if()라는 collection-method를 이용해 주는 것이 좋다.

abort_if() 함수

  • abort_if 함수는 주어진 조건식이 true 일때 HTTP exception을 발생시킵니다.
  • !isset(posts[posts[id]) 설정된 변수가 아니라고 한다면 404 메시지를 보여준다.
<?php
// routes/web.php
Route::get('/posts/{id}', function ($id) {
    
    $posts = [
        1 => [
            'title' => 'Intro to Laravel',
            'content' => 'This is a short intro to Laravel'
        ],
        2 => [
            'title' => 'Intro to PHP',
            'content' => 'This is a short intro to PHP'
        ]
    ];
	
   	// abort_if() 추가
    abort_if(!isset($posts[$id]), 404);

    return view('posts.show', ['post' => $posts[$id]]);
})->name('posts.show');

결과

부족한 설명 봐주셔서 감사합니다.

profile
자유로운 개발을 공부중

0개의 댓글