110 lines
3.2 KiB
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', __('削除に失敗しました。'));
|
|
}
|
|
}
|