обновление и удаление ресурсов маршрута не работает с использованием нескольких ролей, кроме хранилища laravel 8

#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>