【问题标题】:Separating Routes to different files brings errors将路由分离到不同的文件会带来错误
【发布时间】:2022-12-23 07:38:11
【问题描述】:

我试图通过将它们放在不同的子文件夹中来组织我的路线,但这样做使我的应用程序出现了很多错误。我认为这与我完成路由服务提供商的方式有关?

我也不完全确定 api 的作用 api.php:

 Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
     return $request->user();
 });

路由服务提供者:

<?php
 
namespace App\Providers;
 
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
 
class RouteServiceProvider extends ServiceProvider
{
    /**
     * The path to the "home" route for your application.
     *
     * This is used by Laravel authentication to redirect users after login.
     *
     * @var string
     */
    public const HOME = '/admin'; // (I realised after logging in it would redirect me to                              //whatever this was so I changed it to admin as home just replied 404)
 
    /**
     * If specified, this namespace is automatically applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = null;
 
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
           
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api/api.php'));

            Route::prefix('admin')
                ->middleware(['web','auth'])
                ->namespace($this->namespace)
                ->group(base_path('routes/web/posts.php'));

            Route::prefix('admin')
                ->middleware(['web','auth'])
                ->namespace($this->namespace)
                ->group(base_path('routes/web/users.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web/web.php'));
        });
    }
 
    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60);
        });
    }
}
 

我的帖子给我的错误最多,因为我创建帖子并查看所有帖子选项卡返回 404 未找到。此外,我的用户路由不是 100% 名为“创建用户”的选项卡现在是“创建帖子”,现在带我查看用户而不是创建用户

posts.php(路线):

<?php

use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use App\Http\Controllers\UserController;

    Route::get('posts/{post}', [App\Http\Controllers\PostController::class, 'show'])->name('post');
    Route::get('posts/index', [App\Http\Controllers\PostController::class, 'index'])->name('post.index');
    Route::post('posts', [App\Http\Controllers\PostController::class, 'store'])->name('post.store');
    Route::get('posts/create', [App\Http\Controllers\PostController::class, 'create'])->name('post.create');
    Route::patch('posts/{post}/update', [App\Http\Controllers\PostController::class, 'update'])->name('post.update');
    Route::delete('posts/{post}/destroy', [App\Http\Controllers\PostController::class, 'destroy'])->name('post.destroy');
    Route::get('posts/{post}/edit', [App\Http\Controllers\PostController::class, 'edit'])->middleware('can:view,post')->name('post.edit');
     

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    这些顺序错误:

     Route::get('posts/{post}', [AppHttpControllersPostController::class, 'show'])->name('post');
     Route::get('posts/index', [AppHttpControllersPostController::class, 'index'])->name('post.index');
     Route::get('posts/create', [AppHttpControllersPostController::class, 'create'])->name('post.create');
    

    /posts/index 无法到达,因为之前的路由与此 URI 匹配,因此将始终优先(可能不存在 ID 为“index”的帖子)

    创建同样的问题。

    只需将 catch-all 索引路由放在底部即可解决您的问题。

    替代解决方案:

    您还可以使用 laravel route resources (docs) 并将整个文件制作成一行(也许对您的称呼方式进行一些调整):

    Route::resource('posts', PostController::class)

    或者-&gt;only(...)如果你只需要几条路线

    Route::resource('posts', PostController::class)-&gt;only(['index', 'show'])

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多