2019/08/21

構成

centos7 ├ docker-compose.yml ├ docker │  ├ Docker用コンテンツ・設定など └ Vagrantfile

Vagrantインストール

macOS用のdmgをダウンロード Download Vagrant

初期設定

ここでは CentOS7 を作成する

$ mkdir vagrant $ cd vagrant $ vagrant init centos/7

Vagrantfile が作成される 以後はこのディレクトリで操作する

vagrant 起動

$ vagrant up

VirtualBox の CentOS7 が起動 初回はCentOS7イメージをダウンロード&インストール

$ vagrant box list centos/7 (virtualbox, 1905.1)

Vagrant Box

vagrant 停止

$ vagrant halt

vagrant 再起動

$ vagrant reload

仮想マシン破棄

$ vagrant destroy

ネットワークブリッジ

固定IPも設定できるが、とりあえず DHCP でBridgeで設定する

config.vm.network "public_network"

ちなみにIP固定は

config.vm.network "public_network, ip: "IPアドレス"

Vagrant を再起動すると、どのネットーワークか聞かれるので、利用したい番号を入力

$ vagrant reload ==> default: Checking if box 'centos/7' version '1905.1' is up to date... ==> default: Clearing any previously set network interfaces... ==> default: Available bridged network interfaces: 1) en0: Wi-Fi (AirPort) 2) p2p0 3) awdl0 4) en3: Thunderbolt 1 5) en1: Thunderbolt 2 6) en4: Thunderbolt 3 7) en2: Thunderbolt 4 8) bridge0 9) en5: USB Ethernet(?) ==> default: When choosing an interface, it is usually the one that is ==> default: being used to connect to the internet. default: Which interface should the network bridge to

ネットーワークを指定

ブリッジするネットーワークがわかっている場合は、Vagrantfile で指定できる(名称は筐体によって異なる)

config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"

SSH接続

$ vagrant ssh

OS確認

$ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)

root & vagrantユーザ

sudo

$ sudo su

パスワード不要 ※sudoにはパスワードは設定しない事

su

$ su

パスワードはvagrant

vagrant

$ su vagrant

パスワードはvagrant

ifconfigインストール

デフォルトでは ifconfig が利用できないのでインストール

# yum install net-tools

ifconfig で確認すると DHCPで IP が割り振られている

$ ifconfig eth1: flags=4163 mtu 1500 inet 192.168.11.9 netmask 255.255.255.0 broadcast 192.168.11.255

DockerCompose インストール

Vagrantで docker-compose を起動する場合、vagrant-docker-compose が必要

$ vagrant plugin install vagrant-docker-compose

VirtualBoxイメージのメモリ&CPU設定

Vagrantfile ファイルに記述


  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "2"
  end

共有フォルダ設定

ホストOS(Mac)とゲストOS(VirutalBox上のOS)ディレクトリを共有する場合 vagrant-vbguest が必要 VirtualBox での共有ディレクトリと同じで、

mount -t vboxsf -o uid=ユーザ,gid=ユーザ,dmode=0777,fmode=0666 共有フォルダ名 マウントパス

といった Vagrantfile ファイルに基づいて設定してくれる

vagrant-vbguest インストール

$ vagrant plugin install vagrant-vbguest $ vagrant vbguest $ vagrant vbguest --status [default] GuestAdditions 6.0.10 running --- OK.

Vagrantfile 設定

共有ディレクトリ vagrant のパーミッションを変更する

config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=775','fmode=666']

vagrant plugin 確認

$ vagrant plugin list vagrant-docker-compose (1.3.0, global) vagrant-vbguest (0.19.0, global)

Vagrantfile 設定

config.vm.synced_folder "./docker", "/vagrant/docker"

  2019/08/20

インストール

$ docker pull postgres

確認

$ docker images postgres REPOSITORY TAG IMAGE ID CREATED SIZE postgres latest c3fe76fef0a6 6 days ago 313MB $ docker inspect postgres [ { "Id": "sha256:c3fe76fef0a611a53dfc8d3ca21fa51bf8ba03cf84c593e50dfe6cc830c69de6", "RepoTags": [ "postgres:latest" ], ....

起動

初回起動

$ docker run -d --name postgres -p 5432:5432 postgres

2回目以降

$ docker start postgres

起動確認

$ docker ps

もしくは

$docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f44a3f9f944a postgres "docker-entrypoint.s…" 13 minutes ago Up 5 seconds 0.0.0.0:5432->5432/tcp postgres

Macからホスト:0.0.0.0 で接続可能となる

Mac の psql コマンドを利用

psqlコマンドを直接利用するために、HomeBrewでPostgreSQLをインストール

$ brew install postgresql

<h3class="h3">確認

$ psql --host 0.0.0.0 -l --user postgres List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ....

Docker の psql コマンドを利用

Dockerにログイン

$ docker exec -ti postgres bash

Docker上で操作

# su -u postgres $ psql --version psql (PostgreSQL) 11.5 (Debian 11.5-1.pgdg90+1) postgres@f44a3f9f944a:/$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | ...

  2019/08/09

Debian9系だとNode.jsのバージョンが古く npmもインストールできないので、パッケージを更新してからインストールする。


# curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# aptitude installl nodejs
# nodejs -v
v10.16.2
# npm -v
6.9.0

  2019/08/09

入力フォームからの 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

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

  2019/08/08

Middleware を利用して、ルートをグループ化し、共通事前処理を行う

Middleware生成

app/Http/Middleware/ にMiddlewareファイルを生成


$ php artisan make:middleware HelloMiddleware

ルートの設定(routes/web.php)

- Route::middleware に Middlewareクラスの配列を設定
- group() の引数は無名関数とし、各Routeを記述

Route::middleware([HelloMiddleware::class])->group(function() {
    Route::get('/hello', 'HelloController@index')->name('test');
    Route::get('/hello/user/{id}', 'HelloController@user')->where('id', '[0-9]+');
    Route::get('/hello/bye', 'HelloController@bye');
    Route::get('/hello/other', 'HelloController@other');
});

Middleware ファイルに共通処理を記述

ルートで Middleware をルートすると、handle($request, Closure $next) が呼ばれるため Request をバインドしておく

    public function handle($request, Closure $next)
    {
        $hello = 'Hello! This is Middleware!!';
        $bye = 'Good-by, Middleware...';
        $data = [
            'hello' => $hello,
            'bye' => $bye
        ];
        $request->merge($data);
        return $next($request);
    }

Controller ファイルで Middlewareを利用

Middlewareでバインドした Request を利用

    public function index(Request $request)
    {
        $data = ['msg' => $request->hello];
        return view('hello.index', $data);
    }

    public function bye(Request $request)
    {
        $data = ['msg' => $request->bye];
        return view('hello.index', $data);
    }

  2019/08/08

Middlewareを利用したルートグループ化と異なり、処理を実装しないルーティングに便利 ネームスペースを省略できる

namespaceファイルの生成

Controllers/namespace/Controllerファイル を作成し、namespaceを設定 例として、App/Http/Controllers/Sample を namespace

namespace App\\Http\\Controllers\\Sample;

use App\\Http\\Controllers\\Controller;
use Illuminate\\Http\\Request;

class SampleController extends Controller
{

    public function index(Request $request)
    {
        $data = ['msg' => 'Sample index'];
        return view('hello.index', $data);  #hello/index.blade.php を作成済
    }

    public function other(Request $request)
    {
        $data = ['msg' => 'Sample Other'];
        return view('hello.index', $data);  #hello/other.blade.php を作成済
    }

}

ルート設定

namespace() でグループ化し、各ルートを設定

Route::namespace('Sample')->group(function() {
    Route::get('/sample', 'SampleController@index');
    Route::get('/sample/other', 'SampleController@other');
});

  2019/08/07

ルートの設定で、Route::get(...)->name(名前) を指定しておくと、コントローラ側の redirect()->route(名前) でリダイレクトできる。

redirect() の引数を記述しない場合に便利

web.php

    public function index()
    {
        $data = ['msg' => 'This is HelloController index'];
        return view('hello.index', $data);
    }

    public function other()
    {
        return redirect()->route(名前);
    }

HelloController.php

Route::get('/hello', 'HelloController@index')->name(名前);
Route::get('/hello/other', 'HelloController@other');

  2019/08/07

バージョン


$ php artisan -V
$ php artisan --version
Laravel Framework 5.8.30

ヘルプ


$ php artisan help {Word}

make:model の Help


$ php artisan help make:model
Description:
  Create a new Eloquent model class
Usage:
  make:model [options] [--] 
Arguments:
  name                  The name of the class
Options:
  -a, --all             Generate a migration, factory, and resource controller for the model
  -c, --controller      Create a new controller for the model
  -f, --factory         Create a new factory for the model
....

artisan サーバ

デフォルト


$ php artisan serve

Host, Port指定


$ php artisan serve --host=192.168.11.56 --port=8000

ファイル生成


php artisan meke:{Type} {File Name} --{Option}

Type


make:auth                   
make:channel                
make:command                
make:controller             
make:event                  
make:exception              
make:factory                
make:job                    
make:listener               
make:mail                   
make:middleware             
make:migration              
make:model                  
make:notification           
make:observer               
make:policy                 
make:provider               
make:request                
make:resource               
make:rule                   
make:seeder                 
make:test

Option


--controller
--resource
--factory
--migration
--all

CRUD Controller生成


$ php artisan make:controller {Controller Name} --resource

CRUD Controller, Model生成


$ php artisan make:controller {Controller Name} --resource --model=Topic

API Controller


$ php artisan make:controller {Controller Name} --api

Model生成


$ php artisan make:model {Model Name}

Model生成


$ php artisan make:model {Model Name} --all

Factory、Migrationファイルが生成


database/factories/{Model Name}.php
database/migrations/{Model Name}.php

Route一覧


$ php artisan route:list
+--------+----------+----------+------+---------+--------------+
| Domain | Method   | URI      | Name | Action  | Middleware   |
+--------+----------+----------+------+---------+--------------+
|        | GET|HEAD | /        |      | Closure | web          |
|        | GET|HEAD | api/user |      | Closure | api,auth:api |
+--------+----------+----------+------+---------+--------------+

エラーテンプレートの作成

以下のコマンドで、resources/views/errors/ にエラー用のbladeファイルが作成される


$ php artisan vendor:publish --tag=laravel-errors

  2019/07/28

IE11以下では closest() を利用できません。 *最も近い親要素の取得 MDNによると、Elementにプロトタイプすることで対策できるとしている。 MDN: closest#Polyfill


    if (!Element.prototype.matches) {
        Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
    }
    if (!Element.prototype.closest) {
        Element.prototype.closest = function(value) {
        var element = this;
        do {
            if (element.matches(value)) return element;
            element = element.parentelementement || element.parentNode;
        } while (element !== null && element.nodeType === 1);
            return null;
        };
    }
pngファイルの軽量化
Google DriveのIconを再起的に削除
php-markdownでバニラPHPなコードブロック処理
laravel-ffmpeg を使う
2021年版 Ubuntu + certbot + Let's Encrypt でサーバ証明書設定
GihHub のデフォルトでない master ブランチを checkout する
マルチログインで未認証のリダイレクト
Homebrew で Redis をインストール
CSS だけでスムーズスクロール
EC-CUBE4 で Gmail の smtp を利用する
Amazon Linux 2 の amazon-linux-extras とは
UNIQUE カラムのバリデーションで自分自身を除外して更新
フォーム有効期限切れで Page Expired をリダイレクト
ログを日付でローテーションやクリアや削除
Homebrew で PHP8.0 から PHP7.4 にダウングレード
Big sur で zsh 移行と Homebrew アップグレード
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証