#laravel #laravel-8 #laravel-routing #laravel-middleware #laravel-authentication
Вопрос:
Я хочу, чтобы delete
мой продукт администратора использовал ресурс маршрута. Но когда я отправляю сообщение, оно переходит на страницу 404
, аналогичную update
методу.. Но мой URL id
-адрес отображается…
Это URL destroy
-адрес метода http://127.0.0.1:8000/admin/1
, но магазин работает нормально. Он перенаправляется на мой URL-адрес и stored
в базу данных.
Это мой store
метод на Admin/ProductController
ресурсе:
public function store(Request $request)
{
$request['user_id'] = auth()->user()->id;
Product::create($request->all());
return redirect()->back();
}
Это мой destroy
метод на Admin/ProductController
ресурсе:
public function destroy($id)
{
Product::where('id', $id->id)->delete();
return redirect()->back();
}
Вот мой store
метод действия с формой. Эта форма работает нормально:
<form method="post" action="{{route('admin.store')}}">
<input type="text" name="category" class="form-control">
<button type="submit" class="btn btn-primary">Save changes</button>
</form>
Вот моя форма действия delete
. Проблема в том, что когда я отправляю сообщение, оно переходит на 404
страницу:
<form method="post" action="{{ route('admin.destroy', $product->id) }}">
<input type="text" name="category" class="form-control">
<button type="submit" class="btn btn-primary">Save changes</button>
</form>
Вот мой маршрут user
и admin
:
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::group(['as' => 'user.', 'prefix' => 'users', 'namespace' => 'AppHttpControllersUsers'], function() {
Route::get('/', [AppHttpControllersUsersUsersController::class, 'index']);
Route::resources(['/' => ProductController::class], ['except' => ['index']]);
});
Route::group(['middleware' => 'admin', 'as' => 'admin.', 'prefix' => 'admin', 'namespace' => 'AppHttpControllersAdmin'], function() {
Route::get('/', [AppHttpControllersAdminAdminController::class, 'index']);
Route::resources(['/' => ProductController::class], ['except' => ['index']]);
});
Here is my route list:
-------- ----------- ------------------------ ------------------ ------------------------------------------------------------------------ ------------
| Domain | Method | URI | Name | Action | Middleware |
-------- ----------- ------------------------ ------------------ ------------------------------------------------------------------------ ------------
| | GET|HEAD | / | | Closure | web |
| | POST | admin | admin.store | AppHttpControllersAdminProductController@store | web |
| | | | | | admin |
| | GET|HEAD | admin | admin.index | AppHttpControllersAdminProductController@index | web |
| | | | | | admin |
| | GET|HEAD | admin/create | admin.create | AppHttpControllersAdminProductController@create | web |
| | | | | | admin |
| | DELETE | admin/{} | admin.destroy | AppHttpControllersAdminProductController@destroy | web |
| | | | | | admin |
| | PUT|PATCH | admin/{} | admin.update | AppHttpControllersAdminProductController@update | web |
| | | | | | admin |
| | GET|HEAD | admin/{} | admin.show | AppHttpControllersAdminProductController@show | web |
| | | | | | admin |
| | GET|HEAD | admin/{}/edit | admin.edit | AppHttpControllersAdminProductController@edit | web |
| | | | | | admin |
| | GET|HEAD | api/user | | Closure | api |
| | | | | | auth:api |
| | POST | login | | AppHttpControllersAuthLoginController@login | web |
| | | | | | guest |
| | GET|HEAD | login | login | AppHttpControllersAuthLoginController@showLoginForm | web |
| | | | | | guest |
| | POST | logout | logout | AppHttpControllersAuthLoginController@logout | web |
| | GET|HEAD | password/confirm | password.confirm | AppHttpControllersAuthConfirmPasswordController@showConfirmForm | web |
| | | | | | auth |
| | POST | password/confirm | | AppHttpControllersAuthConfirmPasswordController@confirm | web |
| | | | | | auth |
| | POST | password/email | password.email | AppHttpControllersAuthForgotPasswordController@sendResetLinkEmail | web |
| | GET|HEAD | password/reset | password.request | AppHttpControllersAuthForgotPasswordController@showLinkRequestForm | web |
| | POST | password/reset | password.update | AppHttpControllersAuthResetPasswordController@reset | web |
| | GET|HEAD | password/reset/{token} | password.reset | AppHttpControllersAuthResetPasswordController@showResetForm | web |
| | GET|HEAD | register | register | AppHttpControllersAuthRegisterController@showRegistrationForm | web |
| | | | | | guest |
| | POST | register | | AppHttpControllersAuthRegisterController@register | web |
| | | | | | guest |
| | GET|HEAD | users | user. | AppHttpControllersUsersUsersController@index | web |
| | POST | users | user.store | AppHttpControllersUsersProductController@store | web |
| | | | | | auth |
| | GET|HEAD | users/create | user.create | AppHttpControllersUsersProductController@create | web |
| | | | | | auth |
| | DELETE | users/{} | user.destroy | AppHttpControllersUsersProductController@destroy | web |
| | | | | | auth |
| | GET|HEAD | users/{} | user.show | AppHttpControllersUsersProductController@show | web |
| | | | | | auth |
| | PUT|PATCH | users/{} | user.update | AppHttpControllersUsersProductController@update | web |
| | | | | | auth |
| | GET|HEAD | users/{}/edit | user.edit | AppHttpControllersUsersProductController@edit | web |
| | | | | | auth |
-------- ----------- ------------------------ ------------------ ---------------------------------------
Here is my AppHttpAuthLoginController
:
namespace AppHttpControllersAuth;
use AppHttpControllersController;
use AppProvidersRouteServiceProvider;
use IlluminateFoundationAuthAuthenticatesUsers;
use IlluminateHttpRequest;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = RouteServiceProvider::HOME;
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function login(Request $request)
{
$inputVal = $request->all();
$this->validate($request, [
'email' => 'required|email',
'password' => 'required',
]);
if (auth()->attempt(['email' => $inputVal['email'], 'password' => $inputVal['password']])) {
if (auth()->user()->role == 'admin') {
return redirect()->route('admin.');
} else {
return redirect()->route('user');
}
} else {
return redirect()->route('login')
->with('error', 'Email amp; Password are incorrect.');
}
}
}
Вот мой admin middleware
:
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class Admin
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (auth()->user()->role === 'admin') {
return $next($request);
}
return redirect()->back();
}
}
Я не знаю, что в этом не так, store
работает, но update
и destroy
не работает. Я предполагаю, что ошибка включена route
или middleware
.
Ответ №1:
Я думаю, ваша проблема в том, что вы не указываете своей delete
форме использовать DELETE
действие. Из-за HTML вы не можете использовать action="delete"
его, поэтому вам приходится подделывать его, и Blade позволяет вам это делать.
Так что попробуйте это:
<form method="post" action="{{ route('admin.destroy', $product->id) }}">
@csrf
@method('DELETE')
<input type="text" name="category" class="form-control">
<button type="submit" class="btn btn-primary">Save changes</button>
</form>
Более подробная информация об этом в документации по лезвию.
То же исправление должно быть применено в вашем update
, вы должны использовать @method('PUT')
после тега формы обновления.
Комментарии:
1. здравствуйте, спасибо за ваш ответ. я попробовал ваш образец, но он все равно соответствует 404
2. Я думаю, что с вашими маршрутами что-то не так , видите, у одного маршрута есть
{token}
, но у вашегоadmin
иuser
есть{}
, как будто ему не хватаетparam
. Как в этом примере3. но когда я не использую ресурс и использую этот маршрут::удалить(‘/’,[ПриложениеHttpКонтроллерыАдминистраторAdminController::класс,’уничтожить’])->имя(‘уничтожить’); он работает нормально
4. Вы должны использовать мое
blade
исправление (method
) и все равно исправлять свои маршруты.5. Но вы объявляете a
resource
, когда выRoute::delete
это делаете, потому что вы уже говорите «перейти к маршруту / с удалением», но, используя ресурс, вам нужен параметр, поэтому вы видитеadmin/{}
, а неadmin/
Ответ №2:
Если ваш метод-post, то вы также должны добавить CSRF
<form method="post" action="{{ route('admin.destroy', $product->id) }}">
{{ csrf_field() }}
{{ method_field('delete') }}
<input type="text" name="category" class="form-control">
<button type="submit" class="btn btn-primary">Save changes</button>
</form>