๐๐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>
@endforelseMaster 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>
@endsectionFooter ํ๊ทธ๋ฅผ 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 ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค.