👍👍Lets study Laravel PHP Framework!!👍👍
Laravel Framework는 Front Controller 방식의 라우팅을 사용한다.
사용자의 모든 Request가 라우팅 파일로 넘어온 후 어떤 요청인지에 따라 라우팅 파일에서 다양한 컨트롤러로 요청들을 적절하게 분배한다.
Request -> [Routing File] -> 임의의 컨트롤러
# 컨트롤러는 Laravel에서 제공하는 컨트롤러도 있지만, 직접 만들어서 사용하는 경우가 많다.
# Request가 들어오면 라우팅 파일을 보면 된다라고 생각하자!
Route::get('/' function()
{
return "H4lo, World!";
});
# '/' URL로 접근하면 "H4lo, World!" 라는 문자열을 반환한다.
# Slim PHP Framework 를 사용해보았다면 이해하기가 쉬울 것!
# Route::[Method]('[Resource', function() {[this is call back function]});
# -> Method : get, post, put, delete
# Method URL에 Request가 오면 fuction으로 싸진 Closure가 동작한다는 의미!
Route::get('/', 'WelcomeController@index';);
# 사용자가 '/' URL로 접근하면, WelcomeController의 index라는 메소드를 실행하여 결과를 반환한다.
# /routes/web.php
Route::get('/', function () {
return view('welcome');
});
# view() 는 Helper Function이다.
return View::make('welcome');
# 위와 같이 Laravel에서 제공하는 Facade를 이용할 수도 있다.
# view()-> 까지 입력했을 때 코드힌트가 나와서 Helper Function을 더 선호한다고 하는데,
# "코드 힌트"에 대해 알아볼 필요가 있다!
Route::get('/', function () {
return abort(503);
});
# php artisan down 명령으로 유지보수 상태로 전환하면, 위와 같은 503 Error를 뷰로써 보여준다.
# php artisan up 명령으로 서비스 상태로 복귀할 수 있다.
# php artisan suspend 명령은 서비스를 완전히 종료시킨다.
<p>
{{ $greeting }} {{ $name ?? '' }}. Nice to meet you~~
</p>
# resources/views/ 경로에 hello.blade.php 파일을 생성하였음.
# {{ }} 은 라라벨의 템플릿 엔진인 블레이드에서 사용하는 String interpolation 문법이다.
# PHP로 치면, 뷰 내에서 <?= ?> 과 같은 역할을 해준다.
# 특수문자가 포함된 데이터를 뷰에 바인딩시킬 때에는 {{ }} 대신 {!! !!} 를 사용한다.
# {{ $name ?? '' }} 에서 ??는 PHP7 이후부터 나온 문법으로, $name에 값이 존재하면 $name을,
# 아니라면 공백을 사용하는 삼항연산자의 역할을 한다. PHP5.3 에서는 ?:로 사용하고 있었다.
# or를 사용하는 예제도 있으나 or를 사용할 경우 name 값 대신 1이 출력된다.
데이터를 바인딩 하는 법에는 여러 가지 방법이 있다.
with()
메소드로 뷰에 데이터 바인딩하는 방법, view()
의 2번째 인자로 데이터를 넘기는 방법 등이 있는데,
실전에서는 PHP 내장함수인 compact(mixed $varname)
와 조합하여 데이터 바인딩을 진행하는 편이다.
compact 함수는 변수를 이용하여 연관배열을 만드는 함수이다.
변수명은 Key 값으로, 변수값은 배열값으로 바뀐다.
반대로 연관배열을 변수로 전환해주는 함수는 extract()
이다.
Route::get('/hello', function () {
$greeting = '안녕하세요';
$name = 'h4lo';
return view('hello', compact('greeting', 'name'));
});
routes/web.php 파일에 다음과 같은 라우팅 메소드를 추가한다.
hello.blade.php
에 view 메소드의 두번째 인자에서 compact 함수로 만들어진 연관배열을 파라미터 값으로 넘겨, html 코드에 데이터를 바인딩한다.
Laravel Template Engine, Blade
블레이드 문법은 블레이드 엔진에 의해 PHP 코드로 컴파일된다.
<html>
{{ $example }} # 라우팅에서 리턴한 $example 변수의 데이터를 바인딩 시켜준다.
<html>
# 출력 : Test is good!
---
Route::get('/', function ()
{
$example = "Test is good!"
return view('exam', compact('example'));
});
{{-- count(range(1, 10)) --}} # 함수가 작동하지 않는 미출력 코드.
<!-- {{ count(range(1, 10)) }} -->
# 페이지 소스보기를 하면 count(range(1, 10)) 함수는 실행되어 <!-- 10 --> 과 같이 값이 바뀐 것을 알 수 있다.
<ul>
@foreach($items as $item)
<li>{{ $item }}</li>
@endforeach
</ul>
# blade.php 파일에 다음과 같이 html 코드 상에 @foreach를 사용하게 되면, 리턴받은 연관배열의 크기만큼 foreach 문이 반복된다.
@for
도 사용 가능!
@if(isset($test))
<p>H4lo!!</p>
@else
<p>Null!!</p>
@endif
# if 문은 다음과 같이 사용 가능하다.
# @elseif 도 가능
# @unless (== if(!)) 도 사용 가능
리턴받은 데이터로 ArrayAccess를 할 수 없다면 어떻게 처리하지?
@forelse
를 사용해보자!
forelse는 foreach와 if를 섞은 느낌!
리턴받은 변수에 값이 있고 ArrayAccess가 가능하면, @forelse
문으로 들어가고, 그렇지 않으면 @empty
경로를 타게 된다.
@forelse($items as $item)
<p>{{ $item }}</p>
@empty
<p>Empty..</p>
@endforelse
Master Layout in Laravel
페이지마다 반복되는 Header, Section, Footer를 간편하게 넣기 위해 사용할 수 있는 Blade 문법에 대해 알아보자~
resources/views/master.blade.php
<!DOCTYPE HTML>
<html lang='ko'>
<head>
<meta charset='utf-8'>
<title>Blade 201 example</title>
</head>
<body>
@yield('style')
@yield('content')
@yield('script')
</body>
</html>
resources/views/blade201.blade.php
@extends('master')
@section('style')
<style>
body {background : lightskyblue;}
</style>
@endsection
@section('content')
H4lo~~
@endsection
@section('script')
<script>
alert('H4lo~~ Nice to meet you~~')
</script>
@endsection
Footer 태그를 include 해보자!
resources/views/footer.blade.php
<footer>
<p>This is footer area</p>
</footer>
resources/views/master.blade.php
@yield('style')
@yield('content')
@yield('script')
@include('footer') # footer
@extends
로 명시해놓은 경로의 파일이 존재하지 않을 경우 500 에러가 발생!!
$ php artisan tinker
>>> DB::select('select * from [Table Name]')
=> [
{#(id value)
+"Key1": value,
+"Key2": value,
+"Key3": value,
+"Key4": value.
},
]
$ php artisan tinker
>>> DB::insert('insert into [Table Name] (column1, column2) values (?, ?)', [value1, value2]);
=> true
Laravel
은 PDO
를 이용하기 때문에 데이터 바인딩은 직접 값을 대입하지 않고, ?
를 이용한 뒤, 두번째 파라미터 값으로 데이터를 바인딩 시켜준다.
$ php artisan tinker
>>> DB::update('update [Table Name] set (column1, column2) values (?, ?)', [value1, value2]);
=> 1
etc..
Laravel
내의 .env
파일과 config/database.php
파일의 데이터베이스 정보가 일치하지 않거나 문제가 있을 경우 다음과 같은 에러를 보이고 Artisan Tinker
내에서 정상적으로 DB 쿼리를 수행할 수 없다.
기본적으로 config/database.php
파일 내의 mysql port는 33060으로 설정이 되어있었던 것으로 기억된다.
Homestead
에서 mysql port를 33060으로 사용하기는 하나, 이 문제를 해결하기 위해서는 config.database.php
의 mysql port 설정란에 'port' => env('DB_PORT', '3306')
와 같이 설정해준 후 php artisan cache:clear
로 캐시를 초기화 시켜주면 정상적으로 tinker
내에서 DB 쿼리를 수행할 수 있다.