2020/03/30

ペジネーションビューの書き出し

artisan コマンドで、ペジネーションビューをプロジェクト内に書き出します。


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

resources/views/vendor/pagination/ にページネーションのBladeファイルが作成されます。

あとで説明しますが、デフォルトは「bootstrap-4」で書き出されますが、ページネーションメソッドで他のBladeファイルを指定することができます。
よって、利用したいBladeファイルをカスタマイズしてください。

Eloquent モデルで取得

Eloquent モデルには、paginate()、simplePaginate() メソッドを利用できます。


$limit = 10;
$offset = 0;
$user = User::paginate($limit, '[*]', 'page', $offset);

AppServiceProvider に追加

AppServiceProvider::boot() でページネーションのBlade ファイル名を指定します。


    public function boot()
    {
        Paginator::defaultView('pagination::bootstrap-4');
        Paginator::defaultSimpleView('pagination::simple-bootstrap-4');
    }

Blade にページネーションを実装

Blade ファイルでは、Eloquent モデルデータの links() メソッドでページネーション表示できます。


{!! $user->links() !!}

また、Blade 側で明示的に指定することもできます。


{{ $paginator->links('pagination::bootstrap-4', ['key' => 'value']) }}

Eloquent のページネーションメソッドは以下を参照してください。

https://readouble.com/laravel/7.x/ja/pagination.html

  2020/03/30

node-sass をインストールする

CSSコンパイルは開発のみで利用するため、ローカル(devDependencies)にインストールします。


$ npm install node-sass --save-dev
//または
$ yarn install node-sass --dev

--save-dev はローカル(devDependencies)にインストールする npm コマンドオプションです。
yarn では --dev にあたります。(混乱しますが・・・)

ファイル構成

sass から css に書き出すディレクトリを構成します。

元ファイル(sass)

sources/sass/default.scss

書き出しファイル(css)

public/css/default.css

ファイル構成

npm を初期化してない場合は、新規作成します。


$ npm init

package.json

package.json の scripts に sass の設定を記述します。


"scripts": {
    "sass": "node-sass resources/sass/ --output public/css/ --output-style compressed --watch --source-map true"
}
  • compressed:css圧縮
  • --watch:監視設定(sass保存時に自動書き出し)
  • --source-map true: .css.map ファイルの書き出し/li>

CSSコンパイル


$ npm run sass

public/css/ に対象の cssファイルが書き出されます。

  2020/03/29

SQL が発行されるたびに Log ファサードを利用して SQLログを書き出してみます。

Laravel のLogファサードの仕様は以下を参照してください。

https://readouble.com/laravel/7.x/ja/logging.html

LogSqlServiceProvider の設定

プロバイダは、AppServiceProvider に登録しても良いですが、今回はカスタムで LogSqlServiceProvider を作成します。


$ php artisan make:provider LogSqlServiceProvider

app/Providers/LogSqlServiceProvider.php が作成されているのを確認します。

AppServiceProvider に登録

config/app.php の providers に LogSqlServiceProvider を登録します。


    'providers' => [
...
        App\Providers\LogSqlServiceProvider::class,
...
    ],

SQLログ処理を記述

app/Providers/LogSqlServiceProvider.php の register() に記述します。


namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class AppServiceProvider extends ServiceProvider
{
    const SQL_LOG_ENVIROMENT = [
        'local',
        'development',
    ];
....

    public function register()
    {
        if (in_array(App::environment(), self::SQL_LOG_ENVIROMENT)) {
            DB::listen(function ($query) {
                $sql = $query->sql;
                for ($i = 0; $i < count($query->bindings); $i++) {
                    $sql = preg_replace("/\?/", $query->bindings[$i], $sql, 1);
                }
                Log::channel('sql')->debug("SQL", ["time" => sprintf("%.2f ms", $query->time), "sql" => $sql]);                                                      
            });
        }
    }

App::environment() で現在の環境を取得し、任意に設定した SQL_LOG_ENVIROMENT の場合に、ログを書き出します。

環境による設定は、.env の boolean で設定しても良いかも知れません。

SQLログファイルパス設定

config/logging.php で設定でき、デフォルト「storage/logs/larave.log」となります。

Log::debug() の場合、デフォルトで single チャンネルで書き出されるため、Log::channel('チャンネル名')で、SQL用のログを設定します。
(内部的に、Illuminate\Log\LogManagerクラスで、driver() に設定される模様)


    'channels' => [
...
        'sql' => [
            'driver' => 'sql',
            'path' => storage_path('logs/sql.log'),
            'level' => 'debug',
        ],
...
    ],

またロガーは RFC 5424 の以下の8つのログレベルを提供しています。

  • emergency
  • alert
  • critical
  • error
  • warning
  • notice
  • info
  • debug

Logファサードは、最終的にPsr\Log\LoggerInterface を実装した Monolog\Logger を利用しています。

  2020/03/28

今回は、複数のコンテナを docker-compose を利用して起動してみます。

Docker/Kubernetes 実践コンテナ開発入門

を参考に、Jenkins のMaster、Slave で複数のコンテナを構築します。

Jenkins(Master)コンテナ作成

まず、Jenkins(Master)を以下の設定で作成します。

  • Dockerイメージ:Jenkinsci/jenkins:latest
  • ポートフォワーディング:8080 <==> 8080
  • 共有ボリューム:./jenkins_home <==> /var/jenkins_home

ポートフォワーディング、共有ボリュームは、左がホスト(Mac)、右がDockerの設定となります。

docker-compose.yml の設定


version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home

このように、volumes を設定することで、Dockerのデータをホスト側と共有させて、永続化することができます。

docker-compose の起動

docker-compose.yml を作成したら、 --build でイメージ構築と同時に起動をします。


$ docker-compose up --build

Jenkinsのパスワードを控える

途中で、Jenkins の管理者パスワードが表示されるため、控えておきましょう。
忘れた場合は、Docker内の「/var/jenkins_home/secrets/initialAdminPassword」に記載されています。


...
master    | Jenkins initial setup is required. An admin user has been created and a password generated.
master    | Please use the following password to proceed to installation:
master    | 
master    | パスワード
master    | 
master    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
...

この時点で、ホスト側のルートにも「jenkins_home」ディレクトリが作成されます。

Docker側でSSH認証キーを作成

Jenkins(Master)コンテナ内で、SSH認証キーを作成します。

dockerコンテナに対して、シェルコマンドを実行します。


$ docker container exec -it コンテナ名 シェルコマンド

今回は、ssh-keygen を利用するので、


$ docker container exec -it master ssh-keygen -t rsa -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):        
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
...
SHA256:SSHキー

すると、jenkins_home/.ssh/ に id_rsa、id_rsa.pub が作成されます。

docker-compose の停止

Jenkins(Slave)を設定するため、一旦、コンテナを停止します。


$ docker-compose down

Jenkins(Slave)コンテナ作成

Jenkins(Slave)を設定を行います。

docker-compose.yml の設定


version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
      - slave01

   slave01:
     container_name: slave01
     image: jenkinsci/ssh-slave
     enviloment:
       - JENKINS_SLAVE_SSH_PUBKEY=id_rsa.pub のキー

enviloment は環境変数の設定で、「JENKINS_SLAVE_SSH_PUBKEY」に「jenkins_home/.ssh/id_rsa.pub」のキーを設定します。

また、Jenkins(Master)で、links を設定して master から slave01 を名前解決できるようにします。

docker-compose の起動

コンテナをバックグランドで起動します。


$ docker-compose up -d

docker-compose の起動

設定したポートで、http://localhost:8080/ にアクセスすると、Jenkins の画面が表示されます。

パスワードは、Jenkins(Master)の起動で表示されたものを利用します。

手っ取り早く、Install suggested plugins を選択してインストールします。

Jenkins のユーザを作成してログインします。

Jenkins のノード(slave01)の設定

本の通りにノードの管理で、slave01 の認証情報(id_rsa、パスフレーズ)などを設定していきますが、slave01 の起動がエラーになってしまいました。
(Jenkins の Jenkinsの管理 > ノードの管理 で slave01 の設定の箇所)


...
java.io.IOException: Java not found on hudson.slaves.SlaveComputer
...

調べたところ、slave01 で java のパスを通す必要があるようです。

Slave に Java のパスを通す

ホスト(Mac)側から、slave01 へログイン


$ docker exec -it slave01 bash

slave01 の Java のパスを調べる


# which java
/usr/local/openjdk-8/bin/java

このパスを、slave01 の「高度な設定 > Javaのパス」に設定します。

これで、ノード再起動すると同期が完了します。

 

ちなみに、Docker For Mac で利用してみましたが、結構CPU負荷が高いです。


$ docker-compose stats

  2020/03/28

Qiita とか調べていると、いきなり docker と docker-compose が混在してなんだこりゃ?となったりします。
(少なくとも自分は)

特に、他人の作ったdocker-compose.yml を docker の基礎がわからないと何をしているのか読み取れません。

例えば、Laravel を Docker で動かす Laradock はすごく便利で少しの知識があれば開発環境を動作せることが可能ですが、「やっぱり自分で構築したい!」となると、その設定を全部把握するのはかなりの時間がかかりそうです。

docker-compose が必要になる段階

  • docker の基本コマンドを覚える
  • Dockerファイルを記述
  • 複数のコンテナの設定が必要になる
  • Dockerファイルの管理が必要となる
  • docker-compose があると一度に管理できる

最初は docker の基本コマンドを繰り返し実感するのが良いのでは?と思います。

docker-compose を使ってみる

まず、docker-compose コマンドが存在するか確認します。


$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d  10 Sep 2019

あらかじめ、Dockerfile でイメージを作成済みであることを前提とします。

hello:latest イメージの シェルスクリプト「hello.sh」


#!/bin/sh
echo "Hello Shell Script"

hello:latest イメージの Dokcerfile


FROM ubuntu:18.04

COPY hello.sh /usr/local/bin
RUN chmod +x /usr/local/bin/hello.sh

CMD ["hello.sh"]

docker-compose を利用する前にまず docker コマンドでの起動を確認します。
 

docker コマンドによるビルド&起動コマンド


$ docker image build -t example/hello:latest .
$ docker container run example/hello:latest

起動確認ができたら、一度 dockerコンテナを落としておきます。


$ docker stop コンテナID

docker-compose.yml を設定して実行する

docker-compose を利用するには、「docker-compose.yml」の設定が必要となります。

docker-compose.yml


version: "3"
services:
   hello:
     image: example/hello:latest
     ports:
       - 9000:8080

docker-compose で起動(フォアグランド)

docker-compose up で、docker-compose.yml を読み込み、「hello.sh」が実行されます。

version

docker-compose.yml のフォーマットバージョンで、「3」は2020/3時点での最新です。

services

services: の第一階層に、各コンテナの名前を複数定義します。

例では、hello がコンテナ名となります。

image

Dockerイメージ名を設定します。

ports

ホストと docker のポートフォワーディング設定(ホストポート:dockerポート)


$ docker-compose up
Creating network "docker-hello_default" with the default driver
Creating docker-hello_hello_1 ... done
Attaching to docker-hello_hello_1
hello_1  | Hello Shell Script
docker-hello_hello_1 exited with code 0

ちなみに、このサンプルは hello.sh を実行したのちに exit しているため、状態は「Exit 0」となっています。

プロセスを確認する

docker のプロセス確認は docker-compose コマンドでも可能です。


$ docker-compose ps
       Name           Command    State    Ports
-----------------------------------------------
docker-hello_echo_1   hello.sh   Exit 0   

コンテナを停止

docker-compose.yml で設定しているコンテナを全て停止します。


$ docker-compose down

  2020/03/26

AWS ECR(Elastic Container Repository)を使ってみます。

Amazon Elastic Container Registry

ECRは、Dockerコンテナイメージを保存するレジストリサービスで、DockerHub の AWS版のような感じです。
AWS ECS 、AWS fargate と併用してコンテナを用いたサーバを運用します。

料金

2020/3時点で、以下の枠で無料のようです

Amazon Elastic Container Registry の料金

  • イメージ:500Mまで
  • 転送量:1G/月

リポジトリ作成

マネジメントコンソールもしくは、AWS Client でリポジトリを作成します。

マネジメントコンソールでリポジトリ作成する場合

使用方法にアクセス

 

リポジトリ名を入力、プッシュ時にスキャンを有効にして、リポジトリを作成

 

リポジトリが作成される

AWS CLI でリポジトリ作成する場合

aws コマンドでも、ECR リポジトリを作成できます。


$ aws ecr create-repository --repository-name php

AWS CLI のプロファイル追加

AWS Client を利用して ECRのプロファイルを作成します。

リージョンは東京(ap-northeast-1)としています。


$ aws configure --profile ecr
AWS Access Key ID [None]: AIM アカウント ID
AWS Secret Access Key [None]: AIM シークレットキー
Default region name [None]: ap-northeast-1
Default output format [None]: 

AWS CLI 用の環境変数設定

AWS ECR のリージョン(東京)を環境変数に設定(.bash_profile)します。


$ vi .bash_profile

export AWS_REGION=ap-northeast-1

環境確認


$ source .bash_profile
$ echo $AWS_REGION
ap-northeast-1

Dockerfile 作成


FROM amazonlinux:2

SHELL ["/bin/bash", "-c"]

ARG PROJECT_DIR="projects"
WORKDIR $PROJECT_DIR

CMD ["/bin/bash"]

AWS ECR ログイン


$ aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin xxxxxx

Dockerイメージビルド


$ docker build -t linux2 .

Dockerイメージタグ付け


$ docker tag linux2:latest 517704528142.dkr.ecr.ap-northeast-1.amazonaws.com/linux2:latest

AWS ECR に Dockerイメージをプッシュ


$ docker push xxxx.amazonaws.com/linux2:latest

イメージが作成されたのを確認

AWS ECR リポジトリ確認


$ aws ecr describe-repositories --region ${AWS_REGION}
{
    "repository": {
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "linux2",
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/linux2",
            "createdAt": 1585197107.0,
            "imageTagMutability": "MUTABLE",
            "imageScanningConfiguration": {
                "scanOnPush": true
            }
    }
}

AWS ECR イメージ確認

リポジトリ名一覧


$ aws ecr describe-repositories --query 'repositories[].repositoryName'

リポジトリを指定した詳細


$ aws ecr list-images --repository-name linux2 --region=${AWS_REGION}

 

AWS ECR イメージ削除


$ aws ecr batch-delete-image --repository-name linux2 --image-ids imageTag=v2.0

  2020/03/24

Laravel 7 で認証ページを作成してみます。

※Laravel7 の認証ページ

https://readouble.com/laravel/7.x/ja/authentication.html

プロジェクト作成


$ composer create-project laravel/laravel laravel-auth --prefer-dist
$ chmod -R 777 storage
$ chmod -R bootstrap/cache

この時点で、 config/auth.php などが作成されています。

  • config/auth.php
  • app/User.php
  • app/Http/Middleware/Authenticate.php
  • database/migrations/xxxx_create_users_table.php
  • database/migrations/xxxx_create_password_resets_table.php
  • database/factories/UserFactory.php

User モデル

デフォルトで app/User.php が作成されています。


namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

今回は、App/Models/User.php にパスを変更しておきます。
(namespace など修正が必要)

Admin モデル作成

マルチ認証用に、管理者(Admin)モデルを作成してみます。

Models/Admin.php を作成します。


$ php artisan make:model Models/Admin

Admin マイグレートファイル作成

databases/ に Admin用のマイグレーションファイルを作成します。


$ php artisan make:migration create_admins_table

モデル&マイグレートファイルを同時に作成

上記のモデルとマイグレーションファイルを同時に作成することもできます。

Models/Admin.php を作成します。


$ php artisan make:model Models/Admin -m

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreateAdminsTable extends Migration
{
    public function up()
    {
        if (Schema::hasTable('admins')) return;
        Schema::create('admins', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('email');
            $table->string('name');
            $table->string('password');
            $table->string('remember_token')->nullable();
        });
    }
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

Guard の設定

Guard は Auth認証用のドライバークラスで、config/auth.php に設定をします。


    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
      'admin' => [
         'driver' => 'session',
         'provider' => 'admins',
      ],
    ],

Guard を設定することにより、Controllerなどに記載するミドルウェアでの認証が可能となります。


$this->middleware('auth:admin');

Eloquent 設定

Eloquent に App\Models\User クラスを設定します。
※User.php の namespace は App\Models\ に変更


    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
       'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
      ],
    ],

artisan で auth を作成する

make:auth 廃止

Laravel6 から 以下のコマンドは廃止されました。


$ php artisan make:auth

laravel/ui を利用

代わりに、「laravel/ui」でログイン画面を作成するようになりました。

更に、リリースノートには、2.0 を指定するように記載されています。


$ composer require laravel/ui "^2.0"
$ php artisan ui vue --auth
vue の部分は bootstrap などの設定もできます。

認証用ファイル

  • resources/views/auth
  • App/Http/Controllers/Auth
が作成されているので、管理者用にコピーしておくと良いでしょう。
  • resources/views/admin/auth
  • App/Http/Controllers/Admin/Auth

データベース作成

PostgreSQL


$ createdb sample_auth

MySQL


# mysql -u root
mysql > create database sample_auth;

.env

各種DBの設定を合わせる


DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=sample
DB_USERNAME=postgres
DB_PASSWORD=secret

DBマイグレート

DB設定が一通り完了したら、マイグレートしてみます。


$ php artisan migrate

テーブルが作成したことを確認したら、サンプルデータを作成してみます。

Seeder 作成

サンプルデータを作成する場合、artisan に seeder コマンドにも用意されています。

ユーザ、管理者の Seeder を作成すると「database/seeds/」にファイルが書き出されます。


$ php artisan make:seeder UsersTableSeeder
$ php artisan make:seeder AdminsTableSeeder

UsersTableSeeder.php


    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
        ]);
    }

AdminsTableSeeder.php


    public function run()
    {
        DB::table('admins')->insert([
                'email' => 'xxxx@xxxx.com',
                'name' => 'Admin',
                'password' => Hash::make('password')
            ]
        );
    }

DatabaseSeeder.php

Seeder ファイルが作成されたら、「database/seeds/DatabaseSeeder.php」に seeder を実行できるよう設定します。


public function run()
{
     $this->call(UsersTableSeeder::class);
     $this->call(AdminsTableSeeder::class);
}

設定したら、artisan コマンドで Seeder を実行します。


$ php artisan db:seed

実際に、テーブルにデータが作成されているか確認してみましょう。

Factory

ここでは割愛しますが、Factory の faker を利用する方法で seeder を実行できます。
Factory ファイルは以下のコマンドで作成できます。


$ php artisan make:factory UserFactory

コントローラー作成

各種コントローラーを作成します。

管理者ホーム

App/Http/Controllers/Admin/ にコントローラーを作成します。


$ php artisan make:controller Admin/HomeController

Admin/HomeController.php

ファイルを作成したら、index の実装と、コンストラクタに認証用のミドルウェアを記述(Guard で設定したパラメータ)をします。
以下の例は、管理者の認証制御となります。

    public function __construct()
    {
        $this->middleware('auth:admin');
    }

    public function index(Request $request)
    {
        return view('admin.index');
    }

ただコントローラが増えてくると、コンストラクタに毎度記述するのも面倒なので、Route のグループ設定で一括管理すると良いでしょう。
(認証用の親コントローラを継承する方法もありますが)

Route の設定

認証が必要・不要のページを考えて、グループ化した Route を設定します。

認証が不要のページ

ログイン、ログアウト、登録ページなどの認証不要のページのルートを作成します。
管理者URIは、admin で統一したいので「admin」プリフィックスを利用しています。

routes/web.php


Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\Auth\LoginController@index')->name('admin.login');
    Route::post('login', 'Admin\Auth\LoginController@login')->name('admin.login');
    Route::get('logout', 'Admin\Auth\LoginController@logout')->name('admin.logout');
    Route::post('logout', 'Admin\Auth\LoginController@logout')->name('admin.logout');
});

認証が必要のページ

認証が必要なページのルートを設定します。
ルートグループのパラメータに、ミドルウェアの Guard 設定します。


Route::group(['prefix' => 'admin/topic', 'middleware' => 'auth:admin'], function() {
    Route::get('/', 'Admin\HomeController@index')->name('admin.index');
});

  2020/03/22

AWSのインスーラでインストール


$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

別バージョンの Python を利用する場合

別のバージョンの Python で AWS CLI をインストールする場合、Python の絶対パス指定してインストールスクリプトを実行が必要です。


$ sudo /usr/local/bin/python3.7 awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

ターミナルを再起動すれば、aws コマンドが利用できます。


$ aws --version
aws-cli/1.18.27 Python/3.7.4 Darwin/18.7.0 botocore/1.15.27

pip でインストール


$ brew install openssl
$ pyenv install 3.7.0
$ pip install --upgrade pip
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3 get-pip.py --user
$ pip3 install awscli --upgrade --user

AWS CLI 設定


$ aws configure アクセスキー: シークレットキー: リージョン: ap-northeast-1 output format:
$ aws ec2 create-key-pair --key-name キー
$ aws ec2 create-key-pair --key-name キー --query 'KeyMaterial' --output text > キー .pem
$ aws ec2 describe-key-pairs --key-name キー

参考

macOS に AWS CLI バージョン 1 をインストールする

  2020/03/19

2020/03/03 に Laravel7 がリリースされたので、ちょっとだけ見てみました。

(2020/3/19 現在、バージョンは 7.1.3)

https://laravel.com/docs/7.x/upgrade

Symphony 5 リリース

  • Laravel7 では Symphony5 以上
  • PHP 7.2.5 以上
  • laravel/framework ^7.0
  • nunomaduro/collision ^4.1
  • phpunit/phpunit ^8.5
  • facade/ignition ^2.0
  • laravel/tinker ^2.0
  • facade/ignition  ^2.0
  • report()、render() は、Exception から Throwable に変更

use Throwable;
public function report(Throwable $exception);
public function render($request, Throwable $exception);

Authentication

「Authentication Scaffolding」が変更となったようです。

Scaffolding

  • 認証の自動作成の改修
  • Illuminate\Auth\Passwords\TokenRepositoryInterface
  • recentlyCreatedToken メソッドが追加

Eloquent

Date Serialize

  • Eloquent Model で Carbon の日付フォーマット改修
  • ISO-8601 による、timezone と 秒の小数部の対応
  • 現状の仕様をキープしたい場合は、serializeDate をオーバーライド

DB と Eloquent のフォーマットがことなると、Exception になるのでこれが改修されたか?検証が必要

Unique Route Names

  • 同じ Route名を指定できなくなった
  • 重複する場合は、重大なエラーが発生する

CORS サポート

  • Cross-Origin Resource Sharing (CORS) でクロスドメイン通信
  • 「\Fruitcake\Cors\HandleCors::class」を グローバルの Middleware に追加

$ composer require fruitcake/laravel-cors

CastsAttributes

「CastsAttributes」を implements することで、カスタムでキャストすることができます。

カスタムクラスに、get、set メソッドを追加し、Eloquent モデルに $casts を設定することで、自動的にキャストされるようです。

下記の例は、json_decode()、json_encode() を利用して JSON型のキャストを行なっています。


namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

namespace App;

use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        'options' => Json::class,
    ];
}

Blade

The component Method

  • 「Blade::component」 から 「Blade::aliasComponen」に名称変更

Blade Component Tags

Viewコンポーネントクラスにプロパティやメソッドを設定することで、Blade の記述をシンプルにできます。

下記の例は、Alert コンポーネントクラスを作成し「alert.blade.php」に対して、class を動的に設定します。


namespace App\View\Components;

use Illuminate\View\Component;

class Alert extends Component
{
    public $type;

    public function __construct($type)
    {
        $this->type = $type;
    }

    public function classForType()
    {
        return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
    }

    public function render()
    {
        return view('components.alert');
    }
}

Factory Types

  • Laravel7 から factory types が削除された

プロジェクト作成

実際に、認証処理を実装していきます。

※Laravel7 の認証ページ

https://readouble.com/laravel/7.x/ja/authentication.html


$ composer create-project laravel/laravel laravel-auth --prefer-dist
$ chmod -R 777 storage
$ chmod -R bootstrap/cache

バージョン確認


$ php artisan --version
Laravel Framework 7.1.3

この時点で、 config/auth.php などが作成されています。

  • config/auth.php
  • app/User.php
  • app/Http/Middleware/Authenticate.php
  • database/migrations/xxxx_create_users_table.php
  • database/migrations/xxxx_create_password_resets_table.php
  • database/factories/UserFactory.php

app/User.php


namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

最近のバージョンアップが早く、仕様も日々変わりつつあるのでチェックが必要ですね。

  2020/03/17

三重中括弧の mustaches

従来は、三重中括弧の mustaches で HTMLタグを表示することができました。


{{{ html }}}

ただ、Vue 2系から三重の中括弧が利用できなくなったようです。

v-html ディレクティブ

三重中括弧のの代わりに v-html ディレクティブを利用します。

ただし、利用する場合は XSSの脆弱性があるので、信頼できるサイトのみで利用しましょう。

<< 最初 < 前ページ 次ページ > 最後 >>
カスタムのペジネーションを作る
2020/03/30
node-sass を使って sass をコンパイルする
2020/03/30
Log ファサードでSQLログを分離して書き出す
2020/03/29
いちから始める Docker - 複数のコンテナを使う - (2020年)
2020/03/28
いちから始める Docker - docker-compose を使う - (2020年)
2020/03/28
AWS ECR を使ってみる
2020/03/26
Laravel7 でマルチ認証
2020/03/24
Mac に AWS Client を設定する
2020/03/22
Laravel 7 リリース
2020/03/19
v-html でHTML表示する
2020/03/17
Laravel で Vue コンポーネントを使う
2020/03/15
Laravel で Nuxt.js を使ってみる(Docker環境)
2020/03/15
いちから始める Docker -コンテナをビルド- (2020年)
2020/03/12
いちから始める Docker -起動してみる- (2020年)
2020/03/11
Mac で MySQL(8系)
2020/03/03
composer で vendor がインストールできない
2020/03/02
Eloquent の日付を Carbon で扱う
2020/03/01
webpack 4 入門(npm編)
2020/02/27
[Mac]容量を減らす
2020/02/14
DIコンテナはじめ
2020/02/08
freee SDKを Laravel で使ってみる
2020/02/06
freee API を使ってみる
2020/02/06
Segueを利用しない画面遷移
2020/02/01
Xcode11.3 で XVim2 を利用する
2020/01/31
Codable で JSONを読み込み
2020/01/30
Webpack入門(yarn編)
2020/01/24
MacからLaradock PostgreSQLで接続エラー
2020/01/21
Dockerで不要なコンテナ・イメージを削除
2020/01/18
Mac で Laradock の構築
2020/01/18
yarn インストール&プロジェクト作成
2020/01/12
Laravel 6.x 構築(Homestead編)
2020/01/12
Composer インストール
2020/01/12
nvm インストール
2020/01/12
npm install が Mac でエラー
2020/01/05
HTMLタグでカーソルが同時処理(ミラーリング)されてしまう
2020/01/04
DI(依存性注入)
2019/12/30
[Ubuntu]Let's Encryptで無料の証明書を利用する
2019/12/22
[Apache]Apache2.4のアクセス制限が変更
2019/12/22
[Ubuntu]rootのログインとsudo権限追加
2019/12/22
タミヤ マイコンロボット工作セットをMacに接続してみた
2019/12/21
pgAdimn4 でブラウザで開けなくなる
2019/09/28
Java8 を HomebrewとjEnvで構築
2019/09/28
Android Studio環境構築 2019
2019/09/24
ロケールの再構築
2019/08/27
vagrant グループに Apacheを追加
2019/08/27
Linux2 Apache2 + PHP7.3 + PostgreSQL10
2019/08/25
Anadondaの削除
2019/08/25
[Mac]初期設定メモ(CentOS)
2019/08/21
[Mac]PostgreSQL起動
2019/08/20
[Debian]Node.js安定板インストール
2019/08/09