Laravel9でULIDを取得する | Str::ulid();

ULID (Universally Unique Lexicographically Sortable Identifier) は、UUIDと似ていますが、時系列でソート可能な特性を持っています。128ビットの長さで、48ビットのタイムスタンプと80ビットのランダム性から構成されます。これにより、生成時の時刻に基づいてIDをソートできるため、データベースや分散システムでの使用に適しています。また、URLに安全なBase32でエンコードされ、可読性も高いです。 2^80までソート順が保証されているとのこと。

	use Illuminate\Support\Str;
	~略~
	$ulid = Str::ulid();
	

AWS s3 ファイルパスを指定してURLを取得する


		$disk = Storage::disk('s3');
		$fp = 'animals/neko.jpg';
		$url = $disk->url($fp);
	

AWS s3 ファイルパスを指定してs3から削除する


	$disk = Storage::disk('s3');
	$del_fp = 'rich_menu/01HKQE8BV5N7MPWNAZ3Z71G0W5_thum.jpg';
	$disk->delete($del_fp);
	

AWS s3に画像ファイルをアップする


	$disk = Storage::disk('s3');
	$localFilePath = "rsc/img/aws/img1.jpg"; // ローカルのファイルパス
	$s3_path = 'uploads/rich_menu/img1.jpg';
	
	$fileContents = file_get_contents($localFilePath);
	$res = $disk->put($s3_path, $fileContents);// レスポンス true:成功, false:失敗
	

s3でURLのパスを取得 | Laravelでs3にディレクトリパスを指定し、URLを取得する


		$disk = Storage::disk('s3');
		$fp = 'animals/';
		$url = $disk->url($fp); //例  → https://amaraimusi.s3.ap-northeast-1.amazonaws.com/animals/
	

Laravel s3の画像ファイルをローカルへダウンロード


	$contents = $disk->get($s3_file_path);
	file_put_contents($local_path, $contents);
	

Laravel s3に指定したファイルが存在するか調べる


	if(Storage::disk('s3')->exists($filePath)){
		info('ファイルは存在する');
	}
	

Axiosとcsrf-cookieにおけるSPAの不具合対策 | GETリクエストは正常なのにPOSTリクエストが419エラーになる | Laravel | sunctum

以下の条件にあるとき、SPAはGETリクエストは上手くいくのに、POSTリクエストだけ419エラー発生する状態になる。
  1. csrf-cookieを使用(sunctumというのも関係している)
  2. httpsでなくhttp。(例:http://localhost:8080)
  3. バックエンドとフロントエンドでポート番号が分かれている。(例:フロントエンドはhttp://localhost:8080、バックエンドはhttp://localhost:8081など)
  4. same_site="lax"(config/session.php内の設定)
【対策】
「VerifyCsrfToken.php」でCSRF保護を無効にすることができます。本番環境では元に戻しましょう。 app/Http/Middleware/VerifyCsrfToken.php

	namespace App\Http\Middleware;

	use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
	
	class VerifyCsrfToken extends Middleware
	{
	  protected $except = [
	  		'*', // CSRF保護を無効にする
	  ];
	}
	
memo
React+TypeScript+Laravel9で開発しています。
フロントエンドはhttp://localhost:8080、バックエンドはhttp://localhost:8081という構成になってます。
CSRFトークンはcsrf-cookieを使用し、SPA通信にはAxiosが利用されています。
現在、GETリクエストのSPA通信は正常に動いているのですが、POSTリクエストのSPA通信で419エラーがでます。
config/session.phpにてsame_site="lax"を設定しています。sameSiteがlaxだとpostリクエストが使えないとのことですが、sameSiteをlaxでもPOSTリクエストを使えるようにする方法はありますか?
なお、環境設定が複雑ですのでhttpからhttpsに変更するのは困難です。httpsにする方法は除外して考えてください。

SameSite=Laxで設定されている場合、POSTリクエスト(特にクロスオリジンのリクエスト)で419エラー(CSRFトークン不一致)が発生することがあります。これは、SameSite=Lax設定のために、ブラウザがクロスオリジンのPOSTリクエストに対してCSRFトークン(セッションクッキーを含む)を送信しないためです。ただし、環境をHTTPSに変更しない限り、SameSite=None; Secureオプションは使用できません。したがって、以下の方法で問題に対処できるかもしれません。
	

既存のDBテーブルに新フィールドを作成するマイグレーション

bashでマイグレーションファイルの骨組みを作成する。
php artisan make:migration add_tag_category_id_to_tags_table --table=tags

上記を実行すると下記のようなマイグレーションファイルが作成される。
database/migrations/2024_03_01_214045_add_tag_category_id_to_tags_table.php

マイグレーションファイル(2024_03_01_214045_add_tag_category_id_to_tags_table.php)に新フィールドを記述する。

<?php

use Illuminate¥Database¥Migrations¥Migration;
use Illuminate¥Database¥Schema¥Blueprint;
use Illuminate¥Support¥Facades¥Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
    	Schema::table('tags', function (Blueprint $table) {
    		$table->char('tag_category_id', 26)->after('name')->comment('タグカテゴリID');
    	});
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
    	Schema::table('tags', function (Blueprint $table) {
    		$table->dropColumn('tag_category_id');
    	});
    }
};
	

bashでマイグレーションを実行する
php artisan migrate


LaravelのマイグレーションでMySQLの指定フィールドにindexを適応する


use Illuminate&yen;Support&yen;Facades&yen;Schema;
use Illuminate&yen;Database&yen;Schema&yen;Blueprint;
use Illuminate&yen;Database&yen;Migrations&yen;Migration;

class CreateAudiencesFriendsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('audiences_friends', function (Blueprint $table) {
            // テーブルのカラムを定義
            $table-&gt;char('audience_id', 26);
            $table-&gt;string('friend_line_user_id', 255);
            $table-&gt;timestamps();

            // audience_id にインデックスを適用
            $table-&gt;index('audience_id');

            // friend_line_user_id にインデックスを適用
            $table-&gt;index('friend_line_user_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('audiences_friends');
    }
}