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を優先して使い、配列よりもコレクションを優先する。
外部連携用ツール 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用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';
}
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');
deployerを手動で使えるようにする。
GitHub Actions。
LaravelおよびPHPのバージョンを最新にすること。