Skip to content

A Laravel(応用)

user000422 edited this page Jul 27, 2024 · 51 revisions

設計思想

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

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に追加
if(!empty($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 '));

CI/CD

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

パフォーマンス改善

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


Clone this wiki locally