2020/01/12
icon Laravel 6.x 構築(Homestead編)

Laravel 6.x Laravel Homestead を利用して Laravel 6.x の環境を構築する。 Homestead は Laravel の vagrant box 版です。

一からコマンドベースで構築するとかなり大変(というか npm の依存とかでエラー多発)なので、公式でも Homestead を推奨しています。

Vagrant バージョンの確認

Download Vagrant から最新の vagrant をインストール(アップデートする) Laravel 6.x Homestead は 2.2.6 以上が必要

$ vagrant --version
Vagrant 2.2.6

プラグインアップデート

Vagrant アップデートした場合は、プラグインもアップデートする必要がある。

$ vagrant plugin update
Updating installed plugins...
Updated 'vagrant-vbguest' to version '0.23.0'!

Vagrant に Homestead を追加

$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://vagrantcloud.com/laravel/homestead
==> box: Adding box 'laravel/homestead' (v9.2.2-alpha1) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/laravel/boxes/homestead/versions/9.2.2-alpha1/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws
...

Vagrant Box の確認

$ vagrant box list
bento/ubuntu-18.04 (virtualbox, 201906.18.0)
centos/7           (virtualbox, 1905.1)
debian/stretch64   (virtualbox, 9.9.1)
laravel/homestead  (virtualbox, 9.2.2-alpha1)
ubuntu/trusty64    (virtualbox, 20190429.0.1)

Homestead 設定

Git から Homestead 設定を cloneする

$ cd
$ git clone https://github.com/laravel/homestead.git Homestead

初期化

$ bash init.sh
Homestead initialized!

SSH鍵ファイルの作成

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yoo/.ssh/id_rsa):                   
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
...

id_rsa と id_rsa.pub が作成される。

Homestead.yaml 編集

Homestead の起動設定ファイル Homestead.yaml を設定する


ip: "192.168.10.10" #プライベートIPを設定する
memory: 2048
cpus: 2
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/vagrant/homestead/projects #ホスト側のプロジェクトパスを設定
      to: /home/vagrant/projects #Vagrant側のプロジェクトパスを設定
      type: "nfs" #nfs を追記する

sites:
    - map: homestead.test #サーバホストを設定する
      to: /home/vagrant/projects/blog/public #Laravel Webルートを設定

databases:
    - homestead

features:
    - mariadb: false
    - ohmyzsh: false
    - webdriver: false

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

上記の設定は、以下のようなパスを設定している


・ホスト側(Mac)
~/vagrant/homestead/projects #プロジェクトパス

・リモート側(Vagrant)
/home/vagrant/projects #プロジェクトパス
/home/vagrant/projects/blog/public #Laravel の public

注意すべくは「folders:」の設定 デフォルトの設定だとNFSマウント(同期)できないので「type: "nfs"」を追記する

vagrant-bindfs プラグインインストール

NFSを利用した場合、ファイルやフォルダへのアクセス権限を維持する為に、vagrant-bindfs プラグインのインストールが必要

$ vagrant plugin install vagrant-bindfs

Vagrant 起動

$ vagrant up

Homestead Vagrant

Vagrant SSHログイン

$ vagrant ssh

各バージョン確認

$ cat /etc/issue
Ubuntu 18.04.3 LTS \n \l
$ laravel -V
Laravel Installer 3.0.1
$ composer -V
Composer version 1.9.1 2019-11-01 17:20:17
$ node --version
v12.14.0
$ yarn --version
1.21.1
$ npm --version
6.13.4
$ php --version
PHP 7.4.1 (cli) (built: Dec 18 2019 14:44:22) ( NTS )
$ psql -V
psql (PostgreSQL) 11.6 (Ubuntu 11.6-1.pgdg18.04+1)

Laravel プロジェクト作成

Vagrant側で Laravel プロジェクトを作成する。 (あらかじめ、~/projects/ ディレクトリ作成済み)

$ cd projects/
$ composer create-project --prefer-dist laravel/laravel blog

ブラウザから Webサーバにアクセス

http://homestead.local にアクセスできるか確認する。 Homestead Laravel

PostgreSQL設定のロケール

en_US.UTF-8 がデフォルトになっているので、ja_JP.UTF-8 に変更する ロケールの再構築 参照

2019/08/09
icon FormRequest を利用したバリデーション
入力フォームからの Request をバリデートする。 FormRequest を利用すると Controller に処理を記述しなくても事前にバリデートしてくれる。

FormRequestファイルの生成

$ php artisan make:request UserStoreRequest
app/Http/Requests/ にファイルが作成される
class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; //デフォルトで false になっている
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        //バリデートのルールを記述
        return [
            'name' => ['required', 'min:3', 'max:64', 'unique:users'],
            'email' => ['required', 'min:4', 'max:255', 'unique:users'],
            'password' => ['required', 'min:4', 'max:16'],
        ];
    }

    public function messages(){
        //rules に対応したメッセージを記述
        return [
            'name.required'  => '名前を入力してください。',
            'name.min'       => '名前は3文字以上で入力してください',
            'name.max'       => '名前が長すぎます',
            'name.unique'       => '名前は既に登録されています',
            'email.required'=> 'Emailを入力してください。',
            'email.min'     => 'Emailが短かすぎます',
            'email.max'     => 'Emailが長すぎます',
            'email.unique'       => 'Emailは既に登録されています',
            'password.required'=> 'パスワード入力してください。',
            'password.min'     => 'パスワードは4文字以上で入力してください',
            'password.max'     => 'パスワードは32文字以内で入力してください',
        ];
    }
}

Controller 設定

引数のクラスを Request から UserStoreRequest に変更すると FormRequest が自動的にバリデート処理をする validate エラーが発生すると、即時に全画面にリダイレクトする
    public function store(UserStoreRequest $request)  //UserStoreRequest にクラス名を変更
    {
        //UserStoreRequest で validate エラーが発生すると、以降の処理は実行されない
        $request->session()->put('request', $request->all());
        try {
            User::create($request->validated());
            return redirect('user');
        } catch (QueryException $e) {
            return back()->withInput();
        }
    }

Blade でエラー表示

FormRequest で発生したエラーは、自動バインドされた $errors で記述する。
@if (count($errors) > 0)
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif

自分自身を除外する

UPDATE で 自分自身はユニークを除外する必要がある場合、Rule::unique() を利用する。
    use Illuminate Validation Rule;
    .....
    public function rules()
    {
        return [
            'name' => [
                'required', 'min:3', 'max:64',
                Rule::unique('users')->ignore($this->id),
            ],
            'email' => [
                'required', 'min:4', 'max:255',
                Rule::unique('users')->ignore($this->id),
            ]
        ];
    }
2019/08/09
icon try-catch で Exception検知
try-catch でエラー検出する場合、namespace内でException を待ち受けするため「 Exception」と記述する必要がある。

Laravel の QueryException を検知する場合

    use  Illuminate Database QueryException;
....
    public function store(Request $request)
    {
        try {
            $user = new User;
            $user->fill($request->all())->save();
        } catch ( QueryException $e) {

        }
    }
QueryException
<< 最初 < 前ページ 次ページ > 最後 >>