🐡
一覧ページのリダイレクト処理の課題とその解決案
仕様
TODO
課題点
TODO
解決案
TODO
値オブジェクトを利用する
Pageを扱う値オブジェクトを作成します。
値オブジェクトはページ数が不正な値でないことを保証する責任を持ちます。
不正な値
- 配列
- 1以下の値(1が明示的に指定された場合は不正とみなす)
正常な値
- 1より上の値
- NULL(明示的に値を指定しない場合は1とみなす)
App\Modules\List\ValueObjects\Page.php
<?php
declare(strict_types=1);
namespace App\Modules\List\ValueObjects;
use InvalidArgumentException;
/**
* ページ数を扱う
*/
final class Page
{
readonly public int $value;
/**
* @param string|array|null $queryPage クエリパラメータのページの値
* @throws InvalidArgumentException 不正な値が指定された場合
*/
public function __construct(mixed $queryPage)
{
if (is_array($queryPage)) {
throw new InvalidArgumentException('配列は指定できません');
}
if (!is_null($queryPage) && $queryPage <= 1) {
throw new InvalidArgumentException('1以下のページは指定できません');
}
$this->value = (int) ($queryPage ?? 1);
}
}
コントローラでの利用側
さくっと利用するコントローラ側の実装イメージです。
処理が途中で切断されるためリダイレクト処理はメインの処理で行うようにしています。
App\Http\Controllers\ListController
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Modules\List\ValueObjects\Page;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use InvalidArgumentException;
class ListController extends Controller
{
public function index(Request $request)
{
$queryPage = $request->query('page');
try {
$page = new Page($queryPage);
} catch (InvalidArgumentException $e) {
Log::info($e->getMessage());
return redirect()->route('list.index', [], 301); // 恒久的リダイレクト
}
[$article, $pagination] = (new ArticleRepository())->getArticlesWithPagination();
if ($page->value > $pagination->count()) {
return redirect()->route('list.index', [], 302); // 一時的リダイレクト
}
$this->setMetaInfo($page);
return view('pages/list', [$article, $pagination]);
}
private function setMetaInfo(Page $page)
{
// TODO: メタ情報設定処理
}
}
Discussion