20200909のlaravelに関する記事は14件です。

Laravelで更新項目をkey-valueで取得して動的にValidationを実施して更新を実施する

TL; DR

APIの開発をしていると、通常はFormRequestで更新項目を取得し、validationを実施します。

しかし、更新する項目のみをリクエストとして送信する、かつ1項目のみとする場合は、通常の実装ではこの限りとはなりません。

そのため、少しとトリッキー冗長なやり方で実装してみます。

環境

  • PHP7.4
  • Laravel7.2

通常の更新処理の実装

通常、以下の要領で更新処理のリクエストを送信します。

{
  "name": "名前",
  "mail": "test@exmaple.com",
  "gender": 1 
}

このリクエストに対応するFormRequestは、以下のとおりです。

<?php


namespace App\Http\Request\Api;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class UpdateRequest extends FormRequest
{
    /**
     * @return bool
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(): array
    {
        return [
            'name' => ['required', 'string'],
            'mail' => ['required', 'email'],
            'gender' => ['required', Rule::in(1,2)],
        ];
    }

    /**
     * バリデーションエラーのカスタム属性の取得
     *
     * @return array
     */
    public function attributes()
    {
        return [
            'name' => '名前',
            'mail' => 'メールアドレス',
            'gender' => '性別',
        ];
    }
}

key-value形式での実装

今回は、以下の形式で更新する項目名をkeyに、更新する値をvalueに含めたリクエストを送信します。

{
  "key": "mail",
  "value": "test@exmaple.com"
}

この場合、通常通りの実装では、Validationは十分にできません。それは、keyで渡される項目をどのルールを適用してValidationの検証をすればよいかわからないからです。

そのため、Validationをする項目を動的に設定するように対応します。

<?php


namespace App\Http\Request\Api;

use App\Enum\Gender;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class UpdateRequest extends FormRequest
{
    private array $keys = [
        'name', 'mail', 'gender'
    ];

    /**
     * @return bool
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * @return array
     */
    public function rules(): array
    {
        return [
            'key' => ['required', 'string', Rule::in($this->keys)],
            'value' => ['required'],
            'name' => ['max:15'],
            'mail' => ['email'],
            'gender' => [Rule::in(Gender::validateList())],
        ];
    }

    /**
     * Get data to be validated from the request.
     *
     * @return array
     */
    public function validationData()
    {
        $data = $this->all();
        if (empty($data['key']) || empty($data['value'])) return $data;

        // keyで設定された値を連想配列のキーとして設定する
        $data[$data['key']] = $data['value'];

        return $data;
    }

    /**
     * バリデーションエラーのカスタム属性の取得
     *
     * @return array
     */
    public function attributes()
    {
        return [
            'key' => '項目名',
            'value' => '属性値',
            'name' => '名前',
            'mail' => 'メールアドレス',
            'gender' => '性別',
        ];
    }
}

先ず、ruleメソッドでは、keyvalueを必須項目に設定します。また、このとき設定可能とするkeyの値を$keysで取得し、keyのValidationルールにRule::in($thit->keys)を設定します。

しかし、そのままだとValdiationの検証をしたい項目とそのルールが紐づいていません。そのため、Validationが実施される前に呼び出さるvalidationDataメソッドにて、あたかもその項目でリクエストが来たかのようにふるまうよう、値の置き換えをします。

     public function validationData()
    {
        $data = $this->all();
        if (empty($data['key']) || empty($data['value'])) return $data;

        // keyで設定された値を連想配列のキーとして設定する
        $data[$data['key']] = $data['value']; // ここで値の置き換え

        return $data;
    }

この処理をすることで、あたかも以下の形式のリクエストが送信されたかのようにふるまうことができます。

変換前のリクエスト

{
  "key": "mail",
  "value": "test@exmaple.com"
}

変換後のリクエスト

{
  "mail": "test@exmaple.com"
}

更新処理の際には、key-valueの各値を更新値の連想配列に含めれば更新が実施されます。

    /**
     * @param UpdateRequest $request
     * @return JsonResponse
     */
    public function __invoke(int $id, UpdateRequest $request): JsonResponse
    {
        $user = User::find(id)->get();

        $user->update([
            $request->get('key') => $request->get('value')
        ]);

        return response()->json($user, 200);
    }

果たして、使いどころがあるかはわかりませんが、動的にValidationを行う一例でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】バッチでユーザーにメール送信

継続は力なり。めげずに今日も備忘録。
バッチの理解を深める為、簡単な処理を実装してみた。

環境

PHP 7.3.8
Laravel 6.18.35

本日のお題

バッチでメールを送ってみる。
今回は実装するアプリケーションの登録ユーザーに一括送信するもの。

メールの環境設定

mailtrap.ioというSMTPのダミーサーバーを利用する。
mailtrap.ioを利用する事で送信したメールは指定したアドレス宛てには送信されずに、mailtrap.ioの画面で結果を確認する事が出来るので、非常に便利です。会員登録したら直ぐに使えます。

mailtrap.ioのInboxes からDemo inbox に遷移して、SMTP情報を確認します。
その情報を元に.envを編集します。

.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=mailtrap.ioのSMTP情報を参照
MAIL_PASSWORD=mailtrap.ioのSMTP情報を参照
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@example.com
MAIL_FROM_NAME="Example"

バッチ処理を書く

バッチコマンドクラスを生成する。

$ php artisan make:command SendMailCommand
SendMailCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;
//メール送信用ファサード
use Illuminate\Support\Facades\Mail;


class SendMailCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    //コマンドの名前
    protected $signature = 'users:send_mail';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'バッチの説明';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //モデルからユーザー情報を取り出して
        $users = User::all();
        //メールアドレスで繰り返し
        foreach ($users as $user) {
            echo $user['email']."\n";

            Mail::raw("これバッチでメールしているよ", function($message) use ($user)
            {
                //toで送信先、subjectで件名
                $message->to($user->email)->subject('test');
            });
        }
    }
}

これでバッチが完成

ですが〜
このままバッチコマンドを実行しても失敗する事があります。

 Swift_TransportException  : Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required

これが出た時はキャッシュをクリアしてあげましょう。

$ php artisan cache:clear
$ php artisan config:cache

改めてバッチコマンドを実行

php artisan users:send_mail

mailtrap.ioで正しく受信出来ているか確認してみましょう。
スクリーンショット 2020-09-09 23.36.02.png
上手くいっていますね!

参考

Laravel5で送信メールサーバー設定

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】マイグレーション

Laravel公式ドキュメント-マイグレーションの私的アウトプット

準備

マイグレーションを試すためDBも用意した

項目 名前
DBユーザ名 testuser
DB test

マイグレーション

マイグレーションとはDBのバージョンコントロール

マイグレ−ション作成

構文
php artisan make:migration create_テーブル名_table

テーブル名は複数形にする
2つの--create--tableオプションがある。
公式によればこう説明されている

--table--createオプションも、テーブル名とマイグレーションで新しいテーブルを生成するかを指定するために使用できます。これらのオプションは生成するマイグレーションスタブの中へ指定したテーブルをあらかじめ埋め込みます。
参考
Laravel 7.x データベース:マイグレーション

何言ってるかわかんないから以下コマンドを実行

php artisan make:migration create_users1_table
php artisan make:migration create_users2_table --table=users
php artisan make:migration create_users3_table --create=users
php artisan make:migration add_votes_to_users_table --table=users

そうしてわかったことはupメソッドの中でSchemaクラスの静的メソッドが変わる

オプション 説明
--create オプションなしと変わらない
--table すでに存在するテーブルを更新する

マイグレーション構造

メソッド 説明
up 新しいテーブル、カラム、インデックスを追加
down upメソッドの処理をもとに戻す

マイグレーション実行

php artisan migrate[オプション1] [オプション2]

オプション

オプション 説明
:rollback 最後のマイグレーション操作にロールバック
:refresh 最初似ロールバックしてmigrateコマンドを実行。つまりデータベース全体を作り直すのに適してる
:fresh 全テーブル削除後にmigrateコマンドを実行

オプション2

オプション 説明
--seed シード実行

テーブル

テーブル作成

Schema::create('users', function (Blueprint $table) {
    $table->id();
});

テーブル名変更

Schema::createを使う

Schema::rename($from, $to);

テーブル削除

Schema::drop('users');

Schema::dropIfExists('users');

dropdropIfExistsメソッドを使う
dropIfExistsを使っていったほうが良さげかな

カラム

カラム作成

Schema::tableを使う

Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});

テーブル作成のマイグレーションでオプションなしで作成されたファイルに書かれている$table->id();の意味が載っていた↓

カラムタイプ 意味
$table->id(); $table->bigIncrements('id')のエイリアス

カラム修飾子

NULLを許さない定義にするときとかはnullableメソッドを使う

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

カラム変更

まずは準備

composer require doctrine/dbal

カラム属性の変更

changeメソッドを使う

stringカラムの文字長を変更する例
//文字長を25から50に変更
Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});
NULL値設定可能に変更する例
Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});

カラム名変更

renameColumnメソッドを使う
ここで先のcomposerで追加したものを使う

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

カラム削除

dropColumnメソッドを使う

votesカラムを削除
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

この引数に配列を渡すと複数カラムを削除できる

複数カラムを削除
Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのバリデーションでエラー時の遷移先を制御する

問題

  • Laravelのバリデーションでエラーになった際、入力時のページに戻らない
  • Laravelのバリデーションでエラーになった際に入力時のページへ戻る際、値は保持されない

原因

Laravelでバリデーションを適用した際、エラー発生時に入寮時の画面などに戻る際、GETメソッドで遷移されるから

自分はRequestvalidateメソッドを利用し、バリデーションを適用していたため、ルールやエラーメッセージなどの設定はできても、その後の制御ができておらず、冒頭のような問題が発生していた。
バリデーション 5.5 Laravelを見ると、Request以外にもバリデーションを設定できる方法があったので、それを試してみたら問題が解決したので、その方法を記載する。

解決策

validatorを利用する

validator

validatorはコントローラに直接記入して利用する。
基本となるのはこの形。

app/Http/Controllers/SampleController.php
use Validator;

class SampleController extends Controller
{
    public function sample(Request $request)
    {
        $validator = Validator::make($request->all(), [
                //バリデーションルールの記入
            ],
            [
                //エラーメッセージの記入
            ]);

        if ($validator->fails()) {
            return redirect('home')
                        ->withErrors($validator)
                        ->withInput();
            //エラー時の処理
        }
        //バリデーションが通った時の処理
    }
}

Validator::makeRequestValidateメソッドと同じように、バリデーションルールやエラーメッセージを指定する。
Validator::makeで宣言したバリデーションルールを満たさなかった場合、$validator->fails() {}が実行される。

  • redirect: 遷移先の指定
  • withErrors($validator): 遷移先に$validatorを渡す。
  • withInput(): 遷移先にInputがあり、渡したい値があれば、ここに指定。

Validatorを使ってリダイレクト先を指定することで、遷移先ページの指定は解決しそう。
ちなみに、リダイレクト先の指定はroutes\web.phpname()で指定した値も指定できる。

routes\web.php
Route::get('/home', 'HomeController@index')->name('home');

Validatorのカスタマイズ

情報編集画面 → 情報編集確認画面編集完了画面みたいな流れでLaravelのプロジェクトを作成していたとする。
その際、先程のredirect()だと渡せる情報に限界がある場合などが考えられる。
しかし、$validator->fails() {}で指定できるのはredirect()だけではない。
その例を以下に記載する。

app/Http/Controllers/EditCheckController.php
use Validator;

class EditCheckController extends Controller
{
    public function sample(Request $request)
    {
        $validator = Validator::make($request->all(), [
                'name' => 'required|max:20',
                'email' => 'required|email',
                'body' => 'required',
                'delete_flag' => 'boolean',
                //バリデーションルールの記入
            ],
            [
                'name.required' => '名前を入力してください。',
                'name.max' => '名前は20字以内で入力してください。',
                'email.required' => 'Eメールを入力してください。',
                'email.email' => 'Eメールはメールアドレス形式で入力してください。',
                'body.required' => '本文を入力してください。',
                'delete_flag.boolean'  => '0か1を入力してください。',
                //エラーメッセージの記入
            ]);

        if ($validator->fails()) {
            $edit_id = $request -> input('edit_id');
            $name = $request -> input('edit_name');
            $email = $request -> input('edit_email');
            $body = $request -> input('edit_body');
            $delete_flag = $request -> input('edit_delete_flag');
            $edit_data = User::where('id', $edit_id) -> first();
            $edit = array(
                'id' => $edit_id,
                'name' => $name,
                'email' => $email,
                'works_id' => $body,
                'created_at' => $edit_data['created_at'],
                'updated_at' => $edit_data['updated_at'],
                'delete_flag' => $edit_delete_flag
            );
            $back_url = "location.href='/home'";
            return view('edit',['User' => $edit, 'Back' => $back_url])
                -> withErrors($validator);
            //エラー時の処理
        }
        //バリデーションが通った時の処理
    }
}

まるでひとつのコントローラーの処理のようになっているが、このような書き方もできる。
view()を指定した書き方によって、GETメソッド以外による情報を保持してのページ遷移が可能となった。

エラー時における入力値の保持

redirect()以外によるページ遷移と値の保持の仕方を紹介したが、ならredirect()の際はどうやって値を保持すれば良いのか。
withInput()を使用するのも一つの手だが、Laravelではoldヘルパというものが使用できる。
使い方は~.blade.php<Input>などのvalue{{ old('name属性') }}を記入するだけ。

また、oldヘルパでは初期値も設定できる。
データベースの値を初期値にしたい場合は第二引数にその値を設定する。

sample.blade.php
<td><input type="text" name="edit_text" value="{{ old('edit_text', $db->text) }}" ></td>

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelメモ

メモ。なんかあり次第追記していきます。

scout#paginateで特定のpageを指定

<?php
SearchableModel::search('hoge')->paginate(15, 'page', 2); // 2ページ目を指定
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 で BindingResolutionException Target class [TestController] does not existが出力

Laravel8でコントローラーを作成しLaravel7で作成していた時と同じ感じで
下記のようにルーティングを記載しroute:listをしたところBindingResolutionExceptionが発生

web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('test','TestController@index');

ドキュメント読むと下記のように修正すればOKでした

web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TestController;

//Route::get('test','TestController@index');
Route::get("test", [TestController::class, 'index']);

//Resourceの書き方も変わった?
// Route::resource('test', 'TestController', ['only' => ['index', 'show','update', 'store', 'destroy']]);
Route::resource('test', TestGroupController::class)->only([
    'index', 'show','update', 'store', 'destroy'
]);


原因はRouteServiceProviderからデフォルトnamespaceが削除されたから何ですかね?
詳しい方教えてください。

参考
https://laravel.com/docs/8.x/controllers

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel MySQL 既存カラムのNULL許容とデフォルト値をNULLに設定する

目的

  • LaravelとMySQLの組み合わせで「カラムへのNULL格納を許容する」と「デフォルト値をNULLに設定する」方法をまとめる。

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2GHzクアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHPバージョン 7.4.3 Homwbrewを用いて導入
Laravelバージョン 7.0.8 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • マイグレーションをすることができる状態のLaravelアプリが存在していること。

前提情報

  • 本記事では都合上、マイグレーションファイルのカラムに変更を与える処理のみ記載する。
  • 本来はマイグレーションファイルの作成、マイグレーションファイルの記載、マイグレーションなどの作業が必要である。

  • 下記の内容をマイグレーションファイルのupに記載する必要がある。
  • マイグレーション後から現在の状態に戻すためのdownの処理も記載する必要がある。
  • nullの許容設定のマイグレーションファイルへの記載文を下記に記載する。
// nullを許容したい時
$table->カラムタイプ('カラム名')->nullable()->change();

// nullを許容しない時
$table->カラムタイプ('カラム名')->nullable(false)->change();
  • デフォルト値null設定のマイグレーションファイルへの記載文を下記に記載する。
$table->カラムタイプ('カラム名')->default(null)->change();

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8~Newログインまたも変更あり~Memo

Laravle8のLoginがどうなってるか確認してみる

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成のMemoをしておきます。

以下がLaravel8インストール時の画面です。

前提条件/検証環境

  • LaravelでCRUDを作成した経験がある人
  • Laravelの基本を理解している人
  • 記事内容的には、Laravel8のAuthを使う場合の自分メモです。
  • Laravel8
  • PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/jetstream"に必要なため,t2.microだとコケます)
  • Node.js インストール済みであること

【 Laravel6/7でのログイン画面作成はこちらをご参考に】

https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5


Laravel8 ログイン画面作成

Login

Register

1. laravel/jetstreamをインストール

幾つかの種類があるようです、時間的に今回は簡単なものを選択!!

ターミナル
composer require laravel/jetstream

php artisan jetstream:install livewire

php artisan migrate


#vue使う場合には以下も必要
npm install

npm run dev

ダッシュボード

プロフィールページ??

なんか、すごくなってる。。。

まずは Laravel8バージョンのLOGINが実装できました!

Loginのところも「幾つかの選択肢」があるようなので、これも後で調べていこうと思います。
いやー、インストールはサクサク感が出た気がします(個人の感想)。
Login後の機能が拡張されてるので、これから触って調べていこうと思います。
凄いですね~ワクワクします!!
※朝30分でメモったので、間違ってたらごめんなさいm(_ _)m

もう一つのLoginは??※現在検証中
ターミナル
composer require laravel/jetstream

php artisan jetstream:install inertia

npm install

npm run dev

Laravel8.x 公式

https://laravel.com/docs/8.x/frontend#introduction

「Laravel DB.com」も運用中

Laravelをテーブル設計するだけでMigrationも生成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 ~New Login まで早速試してみた~

Laravel8 ~New Login まで早速試してみた~

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成のMyMemoをしておきます。

以下がLaravel8インストール完了時の画面です。変わってる・・・。

前提条件/検証環境

  • Laravelを基本を理解してCRUDを作成した経験がある人
  • 記事内容的には、Laravel8のLoginを使う場合の自分メモです。
  • PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/jetstream"に必要なため,t2.microだとコケます。Swapで対応できる方はそれでもOK)
  • Node.js インストール済みであること

【 Laravel6/7でのログイン画面作成はこちらをご参考に】

https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5


Laravel8 ログイン画面作成

Login

Register

1. laravel/jetstreamをインストール

幾つかの種類があるようです、時間的に今回は簡単なものを選択!!

ターミナル
composer require laravel/jetstream

php artisan jetstream:install livewire

php artisan migrate

npm install

npm run dev

上記コマンドの2回目は「Livewire」or「inertiajs」を選択します。
どちらも目新しい。

ターミナル
#https://laravel-livewire.com/
php artisan jetstream:install livewire

#https://inertiajs.com/
php artisan jetstream:install inertia

「Livewireは(Bladeインクルードのように)最初のコンポーネント出力をページとともにレンダリングします。...インタラクションが発生すると、Livewireは更新されたデータを使用してサーバーにAJAXリクエストを送信します。」とサイトの説明を見る感じでは、Bladeテンプレート側の記述だけでJavaScriptを生成するようなイメージでしょうか。

「Inertiaにはクライアント側ルーティングがなく、APIも必要ありません。いつものように、コントローラーとページビューを構築するだけ」と「クライアント側とサーバー側の2つを接続する接着剤と考えてください」って感じで書いてますね。フロント側をvue/React/Svelte ...構築する場合にはこちらですね。

ダッシュボード

プロフィールページ??

なんか、すごくなってる。。。

まずは Laravel8バージョンのLOGINが実装できました!

Loginのところも「幾つかの選択肢」があるようなので、これも後で調べていこうと思います。
いやー、インストールはサクサク感が出た気がします(個人の感想)。
Login後の機能が拡張されてるので、これから触って調べていこうと思います。
凄いですね~ワクワクします!!
※朝30分でメモったので、間違ってたらごめんなさいm(_ _)m
※先程、確認したら、すでに同様の記事を上げてらっしゃる人が多数いました。。速い人は本当に速い。アウトプットが重要ですからね。これでいいんです。

Laravel8.x 公式

https://laravel.com/docs/8.x/frontend#introduction

「Laravel DB.com」も運用中

Laravelをテーブル設計するだけでMigrationも生成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 : 新ログイン「jetstream」を早速試してみたメモ

Laravel8 : 新ログイン「jetstream」を早速試してみたメモ

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成のMyMemoをしておきます。

以下がLaravel8インストール完了時の画面です。変わってる・・・。

前提条件/検証環境

  • Laravelを基本を理解してCRUDを作成した経験がある人
  • 記事内容的には、Laravel8のLoginを使う場合の自分メモです。
  • PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/jetstream"に必要なため,t2.microだとコケます。Swapで対応できる方はそれでもOK)
  • Node.js インストール済みであること

【 Laravel6/7でのログイン画面作成はこちらをご参考に】

https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5


Laravel8 ログイン画面作成

Login

Register

1. laravel/jetstreamをインストール

幾つかの種類があるようです、時間的に今回は簡単なものを選択!!

ターミナル
composer require laravel/jetstream

php artisan jetstream:install livewire

php artisan migrate

npm install

npm run dev

上記コマンドの2回目は「Livewire」or「inertiajs」を選択します。
どちらも目新しい。

ターミナル
#https://laravel-livewire.com/
php artisan jetstream:install livewire

#https://inertiajs.com/
php artisan jetstream:install inertia

「Livewireは(Bladeインクルードのように)最初のコンポーネント出力をページとともにレンダリングします。...インタラクションが発生すると、Livewireは更新されたデータを使用してサーバーにAJAXリクエストを送信します。」とサイトの説明を見る感じでは、Bladeテンプレート側の記述だけでJavaScript(ajax,event...)を生成するようなイメージでしょうか。
[livewireの動画解説も用意されています]
https://laravel-livewire.com/screencasts/installation

「Inertiaにはクライアント側ルーティングがなく、APIも必要ありません。いつものように、コントローラーとページビューを構築するだけ」と「クライアント側とサーバー側の2つを接続する接着剤と考えてください」って感じで書いてますね。フロント側をvue/React/Svelte ...構築する場合にはこちらですね。

ダッシュボード

プロフィールページ??

なんか、すごくなってる。。。

まずは Laravel8バージョンのLOGINが実装できました!

Loginのところも「幾つかの選択肢」があるようなので、これも後で調べていこうと思います。
いやー、インストールはサクサク感が出た気がします(個人の感想)。
Login後の機能が拡張されてるので、これから触って調べていこうと思います。
凄いですね~ワクワクします!!
※朝30分でメモったので、間違ってたらごめんなさいm(_ _)m
※先程、確認したら、すでに同様の記事を上げてらっしゃる人が多数いました。。速い人は本当に速い。アウトプットが重要ですからね。これでいいんです。

Laravel8.x 公式

https://laravel.com/docs/8.x/frontend#introduction

「Laravel DB.com」も運用中

Laravelをテーブル設計するだけでMigrationも生成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8 : 新ログイン「jetstream」を早速試してみた

Laravel8 : 新ログイン「jetstream」を早速試してみた

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成のMyMemoをしておきます。

以下がLaravel8インストール完了時の画面です。変わってる・・・。

前提条件/検証環境

  • Laravelを基本を理解してCRUDを作成した経験がある人
  • 記事内容的には、Laravel8のLoginを使う場合の自分メモです。
  • PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/jetstream"に必要なため,t2.microだとコケます。Swapで対応できる方はそれでもOK)
  • Node.js インストール済みであること

【 Laravel6/7でのログイン画面作成はこちらをご参考に】

https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5


Laravel8 ログイン画面作成

Login

Register

1. laravel/jetstreamをインストール

幾つかの種類があるようです、時間的に今回は簡単なものを選択!!

ターミナル
composer require laravel/jetstream

php artisan jetstream:install livewire

php artisan migrate

npm install

npm run dev

上記コマンドの2回目は「Livewire」or「inertiajs」を選択します。
どちらも目新しい。

ターミナル
#https://laravel-livewire.com/
php artisan jetstream:install livewire

#https://inertiajs.com/
php artisan jetstream:install inertia

「Livewireは(Bladeインクルードのように)最初のコンポーネント出力をページとともにレンダリングします。...インタラクションが発生すると、Livewireは更新されたデータを使用してサーバーにAJAXリクエストを送信します。」とサイトの説明を見る感じでは、Bladeテンプレート側の記述だけでJavaScriptを生成するようなイメージでしょうか。

「Inertiaにはクライアント側ルーティングがなく、APIも必要ありません。いつものように、コントローラーとページビューを構築するだけ」と「クライアント側とサーバー側の2つを接続する接着剤と考えてください」って感じで書いてますね。フロント側をvue/React/Svelte ...構築する場合にはこちらですね。

ダッシュボード

プロフィールページ??

なんか、すごくなってる。。。

まずは Laravel8バージョンのLOGINが実装できました!

Loginのところも「幾つかの選択肢」があるようなので、これも後で調べていこうと思います。
いやー、インストールはサクサク感が出た気がします(個人の感想)。
Login後の機能が拡張されてるので、これから触って調べていこうと思います。
凄いですね~ワクワクします!!
※朝30分でメモったので、間違ってたらごめんなさいm(_ _)m
※先程、確認したら、すでに同様の記事を上げてらっしゃる人が多数いました。。速い人は本当に速い。アウトプットが重要ですからね。これでいいんです。

Laravel8.x 公式

https://laravel.com/docs/8.x/frontend#introduction

「Laravel DB.com」も運用中

Laravelをテーブル設計するだけでMigrationも生成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelのバージョンアップを経験して

laravel_varsionup.jpg

はじめに

当方、フリーでPHPエンジニアをやっています。

最近Laravelのvar5.2からvar6にバージョンアップするプロジェクトに携わる機会があり、そこで得た経験を大雑把ではありますが、まとめてみました。
これからバージョンアップを計画している方に少しでも参考になれば幸いです!

尚、テストコードの実装があまりさせていない環境でのバージョンアップでしたが、ちゃんとテストコードを書いている場合は、テスト回して確認する事をおすすめします!

基本的には公開されているアップデートガイドを見て進めるのが良いです。

確認する事

  • サーバー
    • laravelのドキュメント、サーバー要件を確認
  • mysql
    • バージョン確認する
  • PHP
    • バージョン確認する
  • PHPライブラリ
    • バージョンアップ後も動くか確認。ライブラリのバージョンを上げなければいけない時、既存のシステムが正常に動くか確認
    • ライブラリによってLaravelのバージョンアップ後、サポートしてない可能性もある為、注意が必要
  • laravelのヘルパー関数
    • 飛び級のバージョンアップ時はだいぶ内容も変わっているので使っている際は注意が必要
  • collection
    • メソッドの内容の変更、廃止されたメソッドなど
  • Eloquent クエリビルダ
    • Eloquentの方が採用率は高いかもしれませんが、混合で使用していたりする場合は両方注意が必要
  • jobs failed_jobsテーブルの変更
    • 5.3からjobsとfailed_jobsのテーブル構成に変更が入っています
  • Laravel Mix
    • css、jsの圧縮をされている際はバージョン確認
  • セッション
    • 5.3からコンストラクタでセッションにアクセスできなくなってます
  • インスタンス化
    • 今はDIを使っている所も多いかと思いますが、appでインスタンス化していて変数を渡している場合、キーを指定して渡して上げないとエラーになります
  • Log
    • 飛び級のバージョンアップの場合、機能も充実して設定方法も変わっているので、注意が必要。slack等にエラーログ飛ばしている場合など。
  • vender配下をオーバーライドしている場合
    • 私が携わったプロジェクトで一番ネックだった所です。あまりしないかもしれませんが、セッションやauth 、その他vender配下のメソッドをオーバーライドして独自に処理を加えている場合、基本的に機能しないと考えておいた方が良いです。

プロジェクトによってはまだまだ確認する所もあるかと思いますが、システムを良く理解している方と相談して進めていくと良いです!

バージョンアッププロジェクトを走らせる前に

注意事項をリストアップしておくと良いです。
例えば、PHPのバージョンアップが必要でPHP関数を普段良く使っている場合、非推奨になっている関数等ありますので、そういったリストと、修正内容を統一するために、補填としてどういった対応が必要か残しておくとチームとして動きやすくなります。

また、必要作業もリストアップしておくのをおすすめします。

最後に

テストコードを普段から書いておくとバージョンアップも楽です:tada:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 8 リリース!

ScreenShot 2020-09-09 1.06.05.png

2020年9月8日 Laravel 8 がリリースされました?

Laravel Jetstream、モデルディレクトリ、モデルファクトリー、マイグレーションスカッシング、レート制限の改善、時間テストヘルパー、動的ブレードコンポーネント等多くの新機能が追加されています。
Laravel 8 はLTSではありません。バグ修正は2021年3月8日、セキュリティ修正は2021年7月8日までのサポートになるのでご注意ください。

Laravel 8 の新機能

https://laravel-news.com/laravel8

(ニュース記事の内容をほぼグーグル翻訳したものです。)

Laravel Jetstream

https://github.com/laravel/jetstream

[Laravel Jetstreamは、以前のバージョンにあった既存のLaravel UI足場を改善します。
ログイン、登録、メール検証、2要素認証、セッション管理、LaravelによるAPIサポート、チーム管理など、新しいプロジェクトの出発点となります。

モデルディレクトリ

Laravel 8のアプリケーションのデフォルトでは app/Models ディレクトリが含まれています。
すべてのジェネレータコマンドは、モデルが app/Models に存在することを前提としています。
ただし、app/Models ディレクトリが存在しない場合は、app ディレクトリ内にモデルを保持していると想定します。

モデルファクトリクラス

Eloquentモデルファクトリは、Laravel 8からクラスベースになり、ファクトリ間の関係のサポートが改善されました。
新しく改善されたモデルファクトリを介してレコードを生成するための新しい構文がいかに素晴らしいかについて、あなたは賛同するでしょう。

use App\Models\User;

User::factory()->count(50)->create();

// using a model state "suspended" defined within the factory class
User::factory()->count(5)->suspended()->create();

マイグレーションスカッシュ

アプリケーションに多くのマイグレーションファイルが含まれている場合は、それらを1つのSQLファイルに圧縮できます。
このファイルは、マイグレーションの実行時に最初に実行され、その後、残りのマイグレーションファイルが実行されます。
既存のマイグレーションを潰すことで、マイグレーションファイルの膨張を減らし、テスト実行中のパフォーマンスを向上させることができます。

レート制限の改善

Laravel 8は、既存のスロットルミドルウェアとの下位互換性をサポートし、はるかに高い柔軟性を提供しながら既存のレート制限機能を改善します。
Laravel 8には、ファサードを介して定義できるレートリミッターの概念があります。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

ご覧のとおり、このfor()メソッドはHTTPリクエストインスタンスを取得するため、リクエストを動的に制限することを完全に制御できます。

時間テストヘルパー

Laravelユーザーは、優れたCarbon PHPライブラリを介して、時間の変更を完全に制御できました。Laravel 8は、テスト内の時間を操作するための便利なテストヘルパーを提供することで、この一歩をさらに前進させます。

// Travel into the future...
$this->travel(5)->milliseconds();
$this->travel(5)->seconds();
$this->travel(5)->minutes();
$this->travel(5)->hours();
$this->travel(5)->days();
$this->travel(5)->weeks();
$this->travel(5)->years();

// Travel into the past...
$this->travel(-5)->hours();

// Travel to an exact time...
$this->travelTo(now()->subHours(6));

// Return back to the present time...
$this->travelBack();

これらの方法を使用すると、各テストの間に時間がリセットされます。

動的ブレードコンポーネント

実行時にブレードコンポーネントを動的にレンダリングする必要がある場合があります。
Laravel 8には、<x-dynamic-component/>コンポーネントをレンダリングするための用意がされています。

<x-dynamic-component :component="$componentName" class="mt-4" />

Laravel 8の詳細

これらはLaravel 8の新機能のほんの一部であり、完全なリストを確認するには、Laravel 8リリースノートとアップグレードガイドを確認してください。また、簡単な更新方法が必要な場合は、Laravel Shiftを忘れないでください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 8 Release !

ScreenShot 2020-09-09 1.06.05.png

2020年9月8日 Laravel 8 がリリースされました?

Laravel Jetstream、モデルディレクトリ、モデルファクトリー、マイグレーションスカッシング、レート制限の改善、時間テストヘルパー、動的ブレードコンポーネント等多くの新機能が追加されています。
Laravel 8 はLTSではありません。バグ修正は2021年3月8日、セキュリティ修正は2021年7月8日までのサポートになるのでご注意ください。

Laravel 8 の新機能

https://laravel-news.com/laravel8

(ニュース記事の内容をほぼグーグル翻訳したものです。)

Laravel Jetstream

https://github.com/laravel/jetstream

[Laravel Jetstreamは、以前のバージョンにあった既存のLaravel UI足場を改善します。
ログイン、登録、メール検証、2要素認証、セッション管理、LaravelによるAPIサポート、チーム管理など、新しいプロジェクトの出発点となります。

モデルディレクトリ

Laravel 8のアプリケーションのデフォルトでは app/Models ディレクトリが含まれています。
すべてのジェネレータコマンドは、モデルが app/Models に存在することを前提としています。
ただし、app/Models ディレクトリが存在しない場合は、app ディレクトリ内にモデルを保持していると想定します。

モデルファクトリクラス

Eloquentモデルファクトリは、Laravel 8からクラスベースになり、ファクトリ間の関係のサポートが改善されました。
新しく改善されたモデルファクトリを介してレコードを生成するための新しい構文がいかに素晴らしいかについて、あなたは賛同するでしょう。

use App\Models\User;

User::factory()->count(50)->create();

// using a model state "suspended" defined within the factory class
User::factory()->count(5)->suspended()->create();

マイグレーションスカッシュ

アプリケーションに多くのマイグレーションファイルが含まれている場合は、それらを1つのSQLファイルに圧縮できます。
このファイルは、マイグレーションの実行時に最初に実行され、その後、残りのマイグレーションファイルが実行されます。
既存のマイグレーションを潰すことで、マイグレーションファイルの膨張を減らし、テスト実行中のパフォーマンスを向上させることができます。

レート制限の改善

Laravel 8は、既存のスロットルミドルウェアとの下位互換性をサポートし、はるかに高い柔軟性を提供しながら既存のレート制限機能を改善します。
Laravel 8には、ファサードを介して定義できるレートリミッターの概念があります。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

ご覧のとおり、このfor()メソッドはHTTPリクエストインスタンスを取得するため、リクエストを動的に制限することを完全に制御できます。

時間テストヘルパー

Laravelユーザーは、優れたCarbon PHPライブラリを介して、時間の変更を完全に制御できました。Laravel 8は、テスト内の時間を操作するための便利なテストヘルパーを提供することで、この一歩をさらに前進させます。

// Travel into the future...
$this->travel(5)->milliseconds();
$this->travel(5)->seconds();
$this->travel(5)->minutes();
$this->travel(5)->hours();
$this->travel(5)->days();
$this->travel(5)->weeks();
$this->travel(5)->years();

// Travel into the past...
$this->travel(-5)->hours();

// Travel to an exact time...
$this->travelTo(now()->subHours(6));

// Return back to the present time...
$this->travelBack();

これらの方法を使用すると、各テストの間に時間がリセットされます。

動的ブレードコンポーネント

実行時にブレードコンポーネントを動的にレンダリングする必要がある場合があります。
Laravel 8には、<x-dynamic-component/>コンポーネントをレンダリングするための用意がされています。

<x-dynamic-component :component="$componentName" class="mt-4" />

Laravel 8の詳細

これらはLaravel 8の新機能のほんの一部であり、完全なリストを確認するには、Laravel 8リリースノートとアップグレードガイドを確認してください。また、簡単な更新方法が必要な場合は、Laravel Shiftを忘れないでください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む