๐๐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 ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ค.