krgm.so-manager-dev.com/app/Http/Controllers/Admin/CityController.php

110 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\CityRequest;
use App\Models\City;
use App\Services\CityService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
final class CityController extends Controller
{
public function index(Request $request, CityService $service): View|RedirectResponse
{
$sort = (string) $request->input('sort', 'city_id');
$sortType = (string) $request->input('sort_type', 'asc');
$page = (int) $request->get('page', 1);
// ソート許可(安全 + 規約)
$sortable = ['city_id', 'city_name', 'print_layout', 'city_remarks', 'created_at', 'updated_at'];
if (!in_array($sort, $sortable, true)) {
$sort = 'city_id';
}
$sortType = strtolower($sortType);
if (!in_array($sortType, ['asc', 'desc'], true)) {
$sortType = 'asc';
}
$list = $service->paginateList(
$request->input('city_name'),
$sort,
$sortType
);
if ($list->total() > 0 && $page > $list->lastPage()) {
return redirect()->route('cities.index', [
'sort' => $sort,
'sort_type' => $sortType,
]);
}
return view('admin.cities.index', [
'sort' => $sort,
'sort_type' => $sortType,
'list' => $list,
'page' => $page,
]);
}
public function create(): View
{
return view('admin.cities.create', [
'record' => new City(),
]);
}
public function store(CityRequest $request, CityService $service): RedirectResponse
{
$service->create($request->validated());
return redirect()
->route('cities.index')
->with('success', __('登録に成功しました'));
}
public function edit(int $id): View
{
$city = City::findOrFail($id);
return view('admin.cities.edit', [
'record' => $city,
]);
}
public function update(CityRequest $request, int $id, CityService $service): RedirectResponse
{
$city = City::findOrFail($id);
$service->update($city, $request->validated());
return redirect()
->route('cities.index')
->with('success', __('更新に成功しました'));
}
public function destroy(Request $request): RedirectResponse
{
$ids = $request->input('pk');
// pk が単体でも配列でも受けられるようにする(編集画面/一覧画面両対応)
if ($ids === null || $ids === '' || $ids === []) {
return redirect()
->route('cities.index')
->with('error', __('削除する市区を選択してください。'));
}
$ids = is_array($ids) ? $ids : [$ids];
$deleted = City::destroy($ids);
return $deleted
? redirect()->route('cities.index')->with('success', __('削除が完了しました。'))
: redirect()->route('cities.index')->with('error', __('削除に失敗しました。'));
}
}