diff --git a/app/Http/Controllers/PlacesController.php b/app/Http/Controllers/PlacesController.php index 89885be..2768d4c 100644 --- a/app/Http/Controllers/PlacesController.php +++ b/app/Http/Controllers/PlacesController.php @@ -60,22 +60,37 @@ class PlacesController extends Controller return str_replace([',',' '], ['|',''], $gps); } - public function edit(Place $place): VIEW + public function edit(int $id): VIEW { + $place = Place::find($id); return view('places.edit', compact('place')); } - public function update(Request $request, Place $place): Redirector|RedirectResponse + public function update(Request $request, int $id) { - $data = $request->validate([ - 'name' => 'required|string|max:255', - 'lat' => 'required|numeric', - 'lng' => 'required|numeric', + // Очистка телефона от маски перед валидацией + if ($request->filled('phone')) { + $request->merge(['phone' => preg_replace('/\D/', '', $request->phone)]); + } + + $validated = $request->validate([ + 'name' => 'required|max:512', + 'address' => 'nullable|max:512', + 'phone' => 'nullable|digits:11', + 'gps' => [ + 'nullable', + 'regex:/^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/' + ], + 'url' => 'nullable|url|max:255', + 'description' => 'nullable', ]); - $place->update($data); + + $place = Place::findOrFail($id); + $place->update($validated); + return redirect() ->route('places.index') - ->with('status', 'Обновлено!'); + ->with('success', 'Данные обновлены'); } public function delete(int $id): Redirector|RedirectResponse diff --git a/database/migrations/2026_05_19_142924_create_places_table.php b/database/migrations/2026_05_19_142924_create_places_table.php new file mode 100644 index 0000000..231e8af --- /dev/null +++ b/database/migrations/2026_05_19_142924_create_places_table.php @@ -0,0 +1,39 @@ +id(); + + // Основные поля + $create->string('name', 512)->nullable(); + $create->string('address', 512)->nullable(); + $create->string('phone', 128)->nullable(); + $create->string('gps', 512)->nullable(); + $create->string('url', 255)->nullable(); + $create->text('description')->nullable(); + + // Даты (Laravel по умолчанию использует timestamp, + // но здесь приведены к вашему формату datetime) + $create->datetime('created_at')->useCurrent(); + $create->datetime('updated_at')->useCurrent()->useCurrentOnUpdate(); + $create->softDeletes(); // Это поле deleted_at + + // Индексы с ограничением длины (как в вашем SQL) + $create->index([DB::raw('name(255)')], 'idx_name'); + $create->index([DB::raw('gps(255)')], 'idx_gps'); + }); + } + + public function down(): void + { + Schema::dropIfExists('places'); + } +}; diff --git a/resources/views/places/edit.blade.php b/resources/views/places/edit.blade.php new file mode 100644 index 0000000..24d06f3 --- /dev/null +++ b/resources/views/places/edit.blade.php @@ -0,0 +1,159 @@ +@extends('layouts.app') + +@section('content') +