라라벨로 배우는 실전 PHP 웹 프로그래밍
PART 1 라라벨 입문
1.1 새로운 라라벨 프로젝트 만들기
라라벨 설치
1
2
--verbose 옵션은 생략 가능
$ composer create-project laravel/laravel myapp --prefer-dist --verbose
라라벨 설치 확인
1
2
$ cd myapp
$ php artisan --version
로컬 서버 구동
1
$ php artisan serve --port=8080
1.2 라라벨 프로젝트 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|- .evn # 글로벌 설정
|- app
| |-Console # 콘솔 명령어 담는 디렉터리
| | |- Kernel.php #
| |
| |- Exceptions
| | |- Handler.php
| |
| |-Http
| | |- Controllers
| | | ㄴ Auth
| | |- Kernel.php
| | |- Middleware
| |
| |-Providers
| | |- AppServiceProvider.php
| | |- AuthServiceProvider.php
| | |- BroadcastServiceProvider.php
| | |- EventServiceProvider.php
| | |- RouteServiceProvider.php
| |
| |- User.php
|
|- bootstrap
|- composer.json
|- composer.lock
|- config
|- database
| |- factories
| |- migrations
| |- seeds
|
|- gulpfile.js
|- pakage.json
|- phpunit.xml
|- public
|- resources
| |- assets
| |- lang
| |- views
|
|- routes
| |- api.php
| |- console.php
| |- web.php
|
|- server.php
|- storage
|- tests
|- vendor
1.3 라라벨 작동 원리
- 사용자는 브라우저에서
http://example.com/about
페이지 요청을 한다. - 사용자의 요청은
example.com
이라는 이름을 가진 서버에 도착한다. - 웹 브라우저가 HTTP 프로토콜로 요청했으므로
example.com
서버의 웹 서버가 요청을 처리한다.- 웹 서버는 URL을 해석하고 자신이 해결할 수 있는 파일이면, 파일을 읽어서 곧바로 응답한다.(CSS , 이미지등 정적 데이터)
- 자신이 해결할 수 없는 파일이면 웹 서버 설정에 따라 작업을 PHP에게 넘긴다.
- PHP에게 작업을 넘길 때는
index.php
를 향하도록 URL 경로를 변경하여 넘긴다.
- index.php에는 라라벨의 부팅 시퀀스가 담겨 있다.
- 라라벨은 routes/web.php에 정의한
라우팅 테이블
에서about
을 찾는다 (라우팅)- 일치하는 라우트가 없다면 웹 서버에게 적절한 오류 응답을 반환한다.(전역 예외 처리기)
- 일치하는 라우트가 있다면 전역
미들웨어
와about 라우트
에 정의한 라우트 미들웨어가 HTTP 요청을 필터링한다.(미들웨어)
- 미들웨어를 통과하지 못하면
예외
가 발생한다. 전역 예외 처리기는 웹 서버에게 적절한 HTTP 응답을 반환한다. - 미들웨어를 통과하면 비소로
about
요청을 처리할 컨트롤러에게 작업이 도달한다.(컨트롤러) - 컨트롤러는
HTTP 요청
을 처리한다. 이때 라라벨 컴포넌트, 외부 컴포넌트의 기능, 우리가 만든 기능 등을 이용한다. 처리가 끝나면HTTP 응답
을 만들고 반환한다. - 컨트롤러는 요청을 처리하는 과정에
데이터베이스와 통신
을 하기도 한다(엘로퀀트) - 컨트롤러는 웹 서버에게 돌려줄
HTTP 응답 본문
을 만들 때템플릿 엔진
을 이용하기도 한다.(블레이드) - 웹 서버는 PHP/라라벨 측으로부터 넘겨받은 HTTP 응답을 브라우저에 돌려준다
- 라라벨은 routes/web.php에 정의한
2. 전역 환경 설정
2.1 dotenv 파일이 하는 일
.gitignore
1
2
3
4
/verdor
/node_modules
/pulbic/storage
.env
설정 정보(.env)
를 저장하시는 않지만, 설정 정보를 처리하는 파일(config/*)
은 git으로 관리한다
.env
1
2
3
4
5
6
7
8
9
10
...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
...
config/database.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
...
위 소스에서 보듯이, 설정파일
정보(전역변수)를 가져와 설정 처리에서 그 값을 사용한다
2.2 APP 환경 설정
.env
1
2
3
4
5
6
7
8
9
10
11
12
13
14
APP_ENV=local
# 어플리케이션 실행 환경을 선언한다. 현재 값인 local은 임의의 값이다. 통상적으로 local, staging, testing, production 등의 값을 사용한다. local은 로컬 컴퓨터, pordution은 운영 서버에서 사용한다
APP_DEBUG=true
디버그 옵견 활성화 여부를 정의한다. true는 로컬 환경에서만 사용해야 한다. true로 설정하면 예외에 관한 상세한 역추적 로거가 화면에 출력된다. 운영 환경에서 이 새용이 표시되면 해커의 공격 대상이 될 수 있으니 주의
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxxx
프레임워크 전반에 걸쳐 암호화 알고리즘의 키 값으로 사용되는 값이다. 예를 들면 브라우저와 주고받는 암호화된 쿠키를 만들거나 해독할 때 사용한다.
SomeRandomString으로 값이 채워져 있거나 비어있다면, 다음 명열으로 새로운 암호화 키를 만들다. 또한, 다른 실행환경에 코드를 처음 배포했을 때도 다음 명령으로 암호화 키를 만들 수 있다.
$ php artisan key:generate
APP_URL=http://localhost
콜솔에서는 $_SERVER['HTTP_HOST'] 값이 없다. 아티등 녈령줄 인터페이스는 이 설정을 대체 값(fallback)으로 사용한다.
3. 라우팅
3.1 URL
라벨에서는 .php가 없는 URL을 사용한다.
3.2 라우팅 만들기
index 페이지를 수정해 본다
resources/views/welcome.blade.php
1
<h1>hello, Laravel</h1>
설정 파일 변경시, 서버 재부팅
이 필요하다
웹 서버의 루트 다렉터리는 public 이다. 다음을 확인 해보자
routes/web.php
1
2
3
Route::get('/', function () {
return view('welcome');
});
/
요청이 들어오면 , view()
함수를 실행하며, 해당 'welcome'
이라는 인자가 resources/views/welcome.blade.php
로 매핑된다.
3.3 URL 파라미터
파라미터 처리를 위해선 중괄호를 사용한다
routes/web.php
1
2
3
4
# http://127.0.0.1:8000/파라미터
Route::get('/{foo}', function ($foo) {
return $foo;
});
기본값 설정
routes/web.php
1
2
3
4
# http://127.0.0.1:8000/파라미터
Route::get('/{foo?}', function ($foo = '기본값') {
return $foo;
});
파라미터 중간 설정
routes/web.php
1
2
3
4
# http://127.0.0.1:8000/파라미터/test
Route::get('/{foo?}/test', function ($foo = '기본값') {
return $foo;
});
정규 표현식 사용하여 필터링이 가능하다
routes/web.php
1
2
3
4
5
Route::pattern('foo','[0-9a-zA-z]{3}');
Route::get('/{foo?}', function ($foo = '기본값') {
return $foo;
});
메서드 체인
routes/web.php
1
2
3
Route::get('/{foo?}', function ($foo = '기본값') {
return $foo;
})->where('foo','[0-9a-zA-Z]{3}');
3.4 라우트 이름
Route::get() 메서드의 두 번째 인자를 배열로 전달하는데, 배열 원소에 'as' => '라우트_이름'
을 정의하면 사용 가능
routes/web.php
1
2
3
4
5
6
7
8
9
10
Route::get('/', [
'as' => 'home',
function () {
return '메인 화면 입니다';
}
]);
Route::get('/home', function(){
return redirect(route('home'));
});
위 redirect()
와 route()
는 도우미 함수다
Comments powered by Disqus.