카테고리 없음

Laravel 07. Form / Validation + git clone laravel project

테디아저씨 2026. 4. 28. 22:18

 

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 버젼등 다른환경에서

 

 

## 과제.

위 내용을 참고해서 트럭 신청을 디비에 저장하고, 목록을 볼 수 있도록 해주세요.

 

## 다음시간

다음시간에는 드디어 회원인증 부분을 다루겠습니다.