A Laravel(応用) - user000422/0 GitHub Wiki

設計思想

laravel-best-practices: https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md
LaravelでどのようにrouteとControllerを設計するかの一つの解としてはRESTにしたがって構築するのが良いとされています。
バリデーションはコントローラで行わずフォームリクエストを使用すること。
サービスクラスの運用ルールはある程度決めた方がよい。何でもかんでも詰め込めるから危険。
クエリビルダや生のSQLクエリよりもEloquentを優先して使い、配列よりもコレクションを優先する。

Http(外部APIと連携)

外部連携用ツール postman https://www.postman.com/
Laravel 7 までは guzzle が必須だったが7以降は不要になった。

// Controller
use Illuminate\Support\Facades\Http; // 名前空間必須

// GET
public function index()
{
  $response = Http::get('http://sample-api');
  echo $response->body();
}

// POST asForm Formとして送信
// コンテンツタイプ(x-www-form-urlencoded)
$response = Http::asForm()->post('http://sample.co.jp/sample_endpoint', [
    'username' => $login_id,
]);
$data = $response->json();

セッション管理

セッションID … クライアントごとにIDとなる値をクッキーとして保管。
クライアントごとの情報はセッションIDに関連付けてデータベースに保存。
設定は config/session.php .env を変更すること。

セッション保存方法 詳細 備考
file アプリケーションサーバに保存 デフォルト 非推奨?
cookie クライアントのブラウザに保存 改ざんリスクあり
database データベースに保存 セキュア 大量アクセスに弱い
// セッション設定: config/session.php

// driver : セッション保存方法
// file, database
'driver' => env('SESSION_DRIVER', 'file'),
// session 取得
$sesdata = $request->session()->get('session_name');

// session 保存
$request->session()->put('session_name', $value);
// Cookie 取得
$sample_cookie = $request->cookie('キー');

// Cookie 保存(キー名, 値, 期限)
$response->cookie($key_name, $value, 100);

// hasCookie 存在チェック
if($request->hasCookie('キー')) { /* cookieが存在します。*/ }

■セッション管理をデータベースにする場合
Laravelで決められたセッション専用のテーブルで管理する必要がある。

# マイグレーションファイルの作成(テーブル名「sessions」)
php artisan session:table
# マイグレーションの実行
php artisan migrate

セッション

ブラウザにセッションIDが格納されるためブラウザを閉じない限りセッションを自由に管理できる。

use Illuminate\Support\Facades\Session;

public function sample()
{
    // セッションのクリア
    $request->session()->forget('color');

    // セッションに追加
    Session::put('color', 'red');
}

public function test()
{
    // セッションから取得
    $color = Session::get('color');
}

REST API

# REST用Controller作成
# CRUDがデフォルトで記載されたControllerが作成される これを利用する
php artisan make:controller SampleController --resource
# ルーティングも1行で対応可能
Route::resource('sample', SampleController::class);
<!-- blade -->
<from action="sample" method="post">
    @csrf
    @method('PUT') <!-- POST GET 以外を扱いたい場合はここで設定 -->
<\form>

サービスプロバイダー

サービスプロバイダはアプリケーションに登録しないと動作しない(config/app.php

// サービスプロバイダ
namespace App/Providers;

use Illuminate/Support/ServiceProvider;
use Illuminate/Support/Facades/View; // ビューコンポーザ用

class SampleServiceProvider extends ServiceProvider
{
    // boot アプリ起動時処理
    public function boot()
    {
        // ビューコンポーザ 第一引数:ビュー名、第二引数:関数(またはクラス)
        View::composer('sample_view', 'xxx/xxx');
    }
}

検索機能(汎用)

// Service

// クエリビルダ生成
$userQuery = User::query();

// 入力条件が入力されていたらSQLのWHEREに追加
// emptyだと「未入力」と「値0」が同判定になるためissetにしましょう(バグで苦しんだ)
if(isset($user_name)) {
    $userQuery->where('user_name', '=', $user_name);
}

// クエリ実行
return $userQuery->get();

定数管理

実際の各案件でよく使われる手法。
app/Constsを定数用ディレクトリとする。
app/Consts/CommonConst.php app/Consts/UserConst.php定数用ディレクトリに定数用クラスを作成。

<?php
namespace App\Consts;
class UserConst
{
    const SAMPLE_VAR = '1';
}

git連携

cd /var/www/html

git clone https://xxx.git

cd /var/www/html/sample-project

# Venderの構築
composer install

# .envの作成
cp .env.example .env

# APIキーの作成(.env.exampleに含まれていないため)
php artisan key:generate

セキュリティ

XSS対策
bladeを使っていれば {{ $name }} だけでエスケープしてくれる。
bladeを使わない場合は下記のようにエスケープ。

// e ヘルパー関数
$name = e($request->input('name '));

プログラム

// トークン作成(Laravel6からこの仕様になった)
use Illuminate\Support\Str;
$token = Str::random(16);

// Cookie取得
$cookieValue = $request->cookie('cookie_name');

CI/CD

deployerを手動で使えるようにする。
GitHub Actions。

パフォーマンス改善

LaravelおよびPHPのバージョンを最新にすること。


⚠️ **GitHub.com Fallback** ⚠️