Laravel

[Laravel Sail]Gmailを使ってメール送信

Googleアカウント設定画面で「アプリパスワード」で検索
アプリ名を入力して作成後、生成したアプリパスワードをMAIL_PASSWORDへ設定
 
.env

MAIL_MAILER=smtp
MAIL_SCHEME=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=sample@gmail.com
MAIL_PASSWORD='xxxx xxxx xxxx xxxx'

 
メール送信処理は下記
[Laravel Sail]メール送信備忘録
 
Mailpitを利用する場合は不要
Mailpit利用時のメールの確認は下記
http://localhost:8025/

[Laravel Sail]Stripeでテスト決済#1

chashierインストール

sail composer require laravel/cashier

 
.envに下記追記

STRIPE_KEY="公開可能キー"
STRIPE_SECRET="シークレットキー"

キーは下図赤枠に記載されている

 
下図の赤枠をオンにしておく

 
StripeController作成

sail artisan make:controller StripeController

 
下記追記

use Stripe\Stripe;
use Stripe\Charge;

class StripeController extends Controller
{
    public function list()
    {
        return view('stripe.index');
    }

    public function charge(Request $request)
    {
        Stripe::setApiKey(env('STRIPE_SECRET'));
        $charge = Charge::create([
            'amount'   => 1000,
            'currency' => 'jpy',
            'source'   => request()->stripeToken,
        ]);
        return back();
    }
}

 
views/stripe/index.blade.phpを作成

<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            {{ __('Stripe一覧表示') }}
        </h2>
    </x-slot>

    <div class="mx-auto px-6">
        {{-- @if(session('message'))
            <div class="text-red-600 font-bold">{{session('message')}}</div>
        @endif --}}
        <x-message :message="session('message')" />
        <div class="mt-4 p-8 bg-white w-full rounded-2xl">
            <h1 class="p-4 text-lg font-semibold">テスト決済1000円</h1>
            <hr class="w-full">
            <form action="{{route('stripe.charge')}}" method="POST">
                @csrf
                <script
                src="https://checkout.stripe.com/checkout.js" class="stripe-button"
                data-key="{{ env('STRIPE_KEY') }}"
                data-amount="1000"
                data-name="お支払い画面"
                data-label="テスト決済する"
                data-description="現在はデモ画面です"
                data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
                data-locale="auto"
                data-currency="JPY">
                </script>
            </form>
        </div>
    </div>
</x-app-layout>

 
routes/web.phpに下記追記

use App\Http\Controllers\StripeController;
Route::post('/stripe/charge', [StripeController::class,'charge'])->name('stripe.charge');
Route::get('/stripe', [StripeController::class,'list'])->name('stripe.index');

 
localhost/stripeにアクセス後「テスト決済する」押下して下記を入力
適当なメールアドレス
4242424242424242
適当な日付 3桁の数字

 
決済に成功するとダッシュボードで確認出来る

[Laravel11]middleware

Karnel.phpは無い
 
下記でapp/Http/Middleware/TestMiddleware.phpを作成する

sail artisan make:middleware TestMiddleware

 

bootstrap/app.phpに追記する

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        /** グローバルミドルウェア(すべてのリクエストに適用)先頭に登録 */
        $middleware->prepend(TestMiddleware::class);
        /** グローバルミドルウェア(すべてのリクエストに適用)末尾に登録 */
        $middleware->append(TestMiddleware::class);
        /** Webルート末尾に追加 */
        $middleware->web(append: [
            TestMiddleware::class,
        ]);
        /** APIルート先頭に追加 */
        $middleware->api(prepend: [
            TestMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

 
特定のルートだけに適用する場合bootstrap/app.phpへの追記は不要
routes/web.php

use App\Http\Middleware\TestMiddleware;
Route::get('post/create',[PostController::class,'create'])->middleware(['auth',TestMiddleware::class])->name('post.create');

 
エイリアスを付けるパターン

    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'test.test1'=>TestMiddleware::class,
        ]);
    })
use App\Http\Middleware\TestMiddleware;
Route::get('post/create',[PostController::class,'create'])->middleware(['auth','test.test1'])->name('post.create');

 
複数設定する場合

Route::middleware(['auth',TestMiddleware::class])->group(function () {
    Route::get('post/create',[PostController::class,'create'])->name('post.create');
    Route::get('/test',[TestController::class,'test'])->name('test');
});

 
TestMiddlewareの中身サンプル

public function handle(Request $request, Closure $next): Response
{
    if(auth()->user()->role === 'admin'){
        return $next($request);
    }
    return redirect()->route('dashboard');
}

 
参考
https://readouble.com/laravel/11.x/ja/middleware.html

[Laravel]ログイン後のURLを変える

下記ファイルの
app\Http\Controllers\Auth\AuthenticatedSessionController.php
 

return redirect()->intended(route('dashboard', absolute: false));

 

return redirect()->intended(route('post.index', absolute: false));

[Laravel]コンポーネント作成

下記作成
resources\views\components\message.blade.php
 
内容

@props(['message'])
@if($message)
<div class="p-4 m-2 rounded bg-green-100">{{$message}}</div>
@endif

 
bladeファイルの表示したい場所に下記追記

<x-message :message="session('message')" />

 
コントローラーに下記を追記する

$request->session()->flash('message','あいうえお');

 
下記コマンドでコンポーネント作成する方法もある

sail artisan make:component Message

[Laravel]seeder備忘録

 
seeder作成

sail artisan make:seeder PostSeeder

 
PostSeeder.php追記

public function run(): void
{
    \App\Models\Post::create([
        'title'   => 'あいうえお',
        'body'    => 'かきくけこ',
        'user_id' => 1,
    ]);
}

 
PostSeeder実行

sail artisan db:seed --class=PostSeeder

 
factory作成

sail artisan make:factory PostFactory

 
PostFactory

public function definition(): array
{
    return [
        'title'   => fake()->text(20),
        'body'    => fake()->text(50),
        'user_id' => \App\Models\User::factory(),
    ];
}

 
必要なら.env修正

'faker_locale' => 'ja_JP'

 
DatabaseSeeder.php修正

use App\Models\Post;

runメソッドにある元ソースは削除

public function run(): void
{
    Post::factory(3)->create();
}

 
DatabaseSeeder実行

sail artisan db:seed

 
エラー「Call to undefined method App\Models\Post::factory()」の対処
Models\Post.phpに下記を追記

use Illuminate\Database\Eloquent\Factories\HasFactory;

class Post extends Model
{
    use HasFactory;
}

[Laravel Sail]pint

通常

./vendor/bin/pint app/Http/Controllers/UserController.php

 
Laravel Sail下

sail php ./vendor/bin/pint app/Http/Controllers/UserController.php

[Laravel Sail]migrate

モデル作成

sail artisan make:model Post -m

 
マイグレーションファイルのupを下記へ

public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
       $table->id();
       $table->string('title');
       $table->text('body');
       $table->timestamps();
});
}

 

マイグレーション

sail artisan migrate

 

カラム追加のマイグレーションファイル作成

sail artisan make:migration add_test_column --table=users

 

中身

public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('test')->after('email');
    });
}
public function down(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('test');
    });
}

 

カラム削除のマイグレーションファイル作成

sail artisan make:migration delete_test_column --table=users

 

中身

public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('test');
    });
}
public function down(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('test')->after('email');
    });
}

 

ロールバック

sail artisan migrate:rollback