Laravel 07. Form / Validation + git clone laravel project

Form 처리
service_form.blade.php
<html>
<head>
<title>Transportation HTML-5 Template </title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container mt-5">
<h2>Request a Quote</h2>
<!-- form -->
<form action="" method="POST" class="contact-form">
<div class="row ">
<div class="col-lg-6 col-md-6 mb-3">
Name
<div class="input-form">
<input type="text" name="name" placeholder="Name" class="form-control">
</div>
</div>
<div class="col-lg-6 col-md-6 mb-3">
Email
<div class="input-form">
<input type="text" name="email" class="form-control" placeholder="Email">
</div>
</div>
<div class="col-lg-6 col-md-6 mb-3">
<label>Freight Type</label>
<div class="select-items">
<select name="category" class="form-control" id="select1">
<option value="">Freight Type</option>
<option value="">Catagories One</option>
<option value="">Catagories Two</option>
<option value="">Catagories Three</option>
<option value="">Catagories Four</option>
</select>
</div>
</div>
<div class="col-lg-6 col-md-6 mb-3">
<label>Weight</label>
<div class="input-form">
<input type="text" name="weight" class="form-control" placeholder="Weight">
</div>
</div>
<div class="col-lg-6 col-md-6 mb-3">
<label>Departure City</label>
<div class="input-form">
<input type="text" name="departure" class="form-control" placeholder="City of Departure">
</div>
</div>
<div class="col-lg-6 col-md-6 col-sm-6">
<label>Destination</label>
<div class="input-form">
<input type="text" name="destination" class="form-control" placeholder="City of Destination">
</div>
</div>
<!-- Checkbox -->
<div class="col-lg-12">
<div class="radio-wrapper mb-30 mt-15">
<label>Extra services:</label>
<div class="select-radio d-flex gap-3 flex-wrap">
<div class="checkbox d-flex align-items-center">
<input id="checkbox-2" name="service_express" type="checkbox">
<label for="checkbox-2" class="radio-label ms-2 mb-0">Express Delivery</label>
</div>
<div class="checkbox d-flex align-items-center">
<input id="checkbox-4" name="service_insurance" type="checkbox">
<label for="checkbox-4" class="radio-label ms-2 mb-0">Insurance</label>
</div>
<div class="checkbox d-flex align-items-center">
<input id="checkbox-5" name="service_packaging" type="checkbox">
<label for="checkbox-5" class="radio-label ms-2 mb-0">Packaging</label>
</div>
</div>
</div>
</div>
<!-- Button -->
<div class="col-lg-12">
<button name="submit" class="btn btn-primary">Request a Quote</button>
</div>
</div>
</form>
</div>
</body>
</html>
@csrf 필수 (보안)
@csrf
@csrf =>
<input type="hidden" name="_token" value="CU3h53yTARcomovEc4f81QROJAORywMsmNJ7Qnb3" autocomplete="off">
action
라라벨의 route name 을 사용
{{ route('service.store') }}
Validation (유효성 검사)
* DB 에러가 발생하기 전에 에러 발생요소를 차단합니다.
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|min:2|max:20',
'email' => 'required|email',
]);
// Model Create
return redirect()->route('service.request')
->with('success', 'completed');
}
주요 Validation
- required : 필수
- min:2 : 최소 길이
- max:255 : 최대 길이
- email : 이메일 형식
- unique:Request : 중복 방지
에러 표시
@error('name')
<div>{{ $message }}</div>
@enderror
@error('email')
<div>{{ $message }}</div>
@enderror
return redirect()->route('service.result')
->with('success', '등록 완료');
Form Request 분리
validation 을 별도로 분리하여 처리합니다.
php artisan make:request StoreServiceRequest
public function rules()
{
return [
'name' => 'required|min:8|max:20',
];
}
* Controller가 훨씬 깔끔해짐.
* Request 만 수정하에 요건을 변경 가능함.
* 단, 그럼 Store 용 Request 와 Update 용 Request 를 별도로 두는 것이 정석이다.
php artisan make:request StoreServiceRequest
php artisan make:request UpdateServiceRequest
class StorePostRequest extends FormRequest
{
public function authorize()
{
// default 'false'
return true;
}
public function rules()
{
return [
'name' => 'required|min:2|max:20',
'email' => 'required|email',
];
}
}
Controller Modify
use App\Http\Requests\StoreServiceRequest;
.....
// change to StoreServiceRequest $request
public function store(StoreServiceRequest $request)
{
$validated = $request->validated(); // 이미 검증 끝난 데이터
//ServiceModel::create($validated);
return redirect()->route('service.result')
->with('success', '등록 완료');
}
service_result.blade.php
<html>
<head>
<title>Transportation HTML-5 Template </title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container mt-5">
<h2>Request a Quote</h2>
<!-- success message -->
<div class="alert alert-success">
Your request has been submitted successfully!
</div>
</div>
</body>
</html>
** 권한 처리까지 함께 처리 ( 다음시간 이후에 )
public function authorize()
{
return auth()->check();
}
메세지 커스트마이징.
public function messages(): array
{
return [
'name.required' => '이름은 필수입니다.',
'name.min' => '이름은 최소 2자 이상이어야 합니다.',
'name.max' => '이름은 20자를 초과할 수 없습니다.',
];
}
Git Clone
라라벨 프로젝트를 git 으로 clone 하기
// . current dir
git clone https://github.com/{userAccount}/{RepositoryName}.git .
drwxr-xr-x@ 5 b2g staff 160B 4 29 12:32 app
-rwxr-xr-x@ 1 b2g staff 425B 4 29 12:32 artisan
drwxr-xr-x@ 5 b2g staff 160B 4 29 12:32 bootstrap
-rw-r--r--@ 1 b2g staff 2.8K 4 29 12:32 composer.json
-rw-r--r--@ 1 b2g staff 294K 4 29 12:32 composer.lock
drwxr-xr-x@ 12 b2g staff 384B 4 29 12:32 config
drwxr-xr-x@ 6 b2g staff 192B 4 29 12:32 database
-rw-r--r--@ 1 b2g staff 424B 4 29 12:32 package.json
-rw-r--r--@ 1 b2g staff 1.3K 4 29 12:32 phpunit.xml
drwxr-xr-x@ 7 b2g staff 224B 4 29 12:32 public
-rw-r--r--@ 1 b2g staff 3.6K 4 29 12:32 README.md
drwxr-xr-x@ 5 b2g staff 160B 4 29 12:32 resources
drwxr-xr-x@ 4 b2g staff 128B 4 29 12:32 routes
drwxr-xr-x@ 5 b2g staff 160B 4 29 12:32 storage
drwxr-xr-x@ 5 b2g staff 160B 4 29 12:32 tests
-rw-r--r--@ 1 b2g staff 436B 4 29 12:32 vite.config.js
php artisan serve
result :: error
Warning: require(/Users/b2g/Documents/work/hyunjucho/sample2/vendor/autoload.php): Failed to open stream: No such file or directory in /Users/b2g/Documents/work/hyunjucho/sample2/artisan on line 10
Fatal error: Uncaught Error: Failed opening required '/Users/b2g/Documents/work/hyunjucho/sample2/vendor/autoload.php' (include_path='.:/opt/homebrew/Cellar/php@8.3/8.3.21/share/php@8.3/pear') in /Users/b2g/Documents/work/hyunjucho/sample2/artisan:10
Stack trace:
#0 {main}
thrown in /Users/b2g/Documents/work/hyunjucho/sample2/artisan on line 10
checking .gitignore
*.log
.DS_Store
.env ---> important
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
/.fleet
/.idea
/.nova
/.phpunit.cache
/.vscode
/.zed
/auth.json
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor ---> important
_ide_helper.php
Homestead.json
Homestead.yaml
Thumbs.db
".env" and "vendor" are security sensitive files and are not uploaded to cloud services such as github.
1) copy or make .env
2) down load vendor
checking composer.json
composer.json :: 프로젝트가 필요로 하는 패키지목록
"require": {
"php": "^8.3",
"laravel/framework": "^13.0",
"laravel/tinker": "^3.0"
},
composer.lock :: 실제로 설치된 패키지목록
composer.json 기준으로 패키지를 설치
composer install
php artisan serve
* composer update :: composer.json 기준으로 패키지들을 최신버젼으로 업데이트
* 로컬에서 composer update 하고 서버/배포환경에서 composer install 이 기본
특정 패키지만 업데이트
composer update laravel/framework
특정 패키지 설치
composer require guzzlehttp/guzzle
** 새로운 패키지를 설치하면 서버에서 composer install 을 해주어 패키지가 다운로드 되도록 해주어야 합니다.
"laravel/framework": "^10.0"
// >= 10.0.0 < 11.0.0
// 10.x.x는 허용
// 11은 안됨
"laravel/framework": "~10.0"
// >= 10.0.0 < 10.1.0
// 10.0.x만 허용
// 10.1부터는 안됨
** php 버젼등 다른환경에서
## 과제.
위 내용을 참고해서 트럭 신청을 디비에 저장하고, 목록을 볼 수 있도록 해주세요.
## 다음시간
다음시간에는 드디어 회원인증 부분을 다루겠습니다.