laravel - 如何在所有网址中添加前缀而不影响现有路由

Zap*_*dik 0 php laravel

我有这样的网址mysite.com/company,我想在网址中添加前缀以成为mysite.com/home/company

我尝试添加路线组,但这需要我更新所有现有路线。

我可以在所有网址中添加前缀而不影响现有路由吗?

我用的是 Laravel 5.6

RJK*_*RJK 5

我创建了一个沙箱,以便您可以查看和使用用于此答案的代码。

我知道沙箱使用不同的 Laravel 版本(版本 7),但查看版本 5.6 的文档,路由似乎与版本 7 没有太大不同。

您可以做的是将已经存在的路由包装在匿名函数中并将其分配给一个变量,然后您可以使用该变量并将其作为参数group与 一起传递给路由函数prefix,例如

$routes = function() {
    Route::get('company', function () {
        return 'companies';
    });

    Route::get('company/{company}', function ($company) {
        return "company $company";
    });

    Route::delete('company/{company}', function ($company) {
        return "deleting company $company...";
    });

    Route::get('company/{company}/staff', function ($company) {
        return "staff list for company $company...";
    });
};

Route::prefix('/')->group($routes);
Route::prefix('/home')->group($routes);
Run Code Online (Sandbox Code Playgroud)

运行时php artisan route:list返回以下内容:

+--------+----------+------------------------------+------+---------+------------+
| Domain | Method   | URI                          | Name | Action  | Middleware |
+--------+----------+------------------------------+------+---------+------------+
|        | GET|HEAD | api/user                     |      | Closure | api        |
|        |          |                              |      |         | auth:api   |
|        | GET|HEAD | company                      |      | Closure | web        |
|        | GET|HEAD | company/{company}            |      | Closure | web        |
|        | DELETE   | company/{company}            |      | Closure | web        |
|        | GET|HEAD | company/{company}/staff      |      | Closure | web        |
|        | GET|HEAD | home/company                 |      | Closure | web        |
|        | GET|HEAD | home/company/{company}       |      | Closure | web        |
|        | DELETE   | home/company/{company}       |      | Closure | web        |
|        | GET|HEAD | home/company/{company}/staff |      | Closure | web        |
+--------+----------+------------------------------+------+---------+------------+
Run Code Online (Sandbox Code Playgroud)

/您可以在上面看到,现在可以通过和访问路由home/,例如http://example.com/companyhttp://example.com/home/company不需要重复路由。

如果您将来需要添加更多前缀,只需Route::prefix("<prefix>")->group($routes);在路由文件中添加一个新的即可。


以下更新是对 OP 提供的评论的回应。

为了得到正确的结果,您正在寻找一种方法来自动将函数的所有实例url从转换url('someurl')url('home/someurl'),例如

  • url('company')会变成url('home/company')
  • url('knowledgebase') 会变成url('home/knowledgebase')

如果是这样,那么我有两个解决方案给你:

  1. 您不能简单地在您使用的 IDE 中进行搜索和替换吗?

  2. 您可以覆盖 Laravel 的url辅助函数,为所有路径添加前缀home/,为此,您可以执行以下操作:

我创建了另一个沙箱,以便您可以查看和使用用于此答案的代码。

首先helpers.php在 Laravel 应用程序中的任意位置创建一个文件,在测试此代码时,我将该文件放置在应用程序的根目录中,例如/var/www/html/helpers.php.

其次,您需要重写url辅助函数,以确保您不会丢失任何功能,我从 Laravel 的github存储库中获取了该函数的原始源代码。然后我修改它以包含前缀,因此将以下内容放入新helpers.php文件中:

<?php

use Illuminate\Contracts\Routing\UrlGenerator;

if (! function_exists('url')) {
    /**
     * Generate a url for the application.
     *
     * @param  string|null  $path
     * @param  mixed  $parameters
     * @param  bool|null  $secure
     * @return \Illuminate\Contracts\Routing\UrlGenerator|string
     */
    function url($path = null, $parameters = [], $secure = null)
    {
        if (is_null($path)) {
            return app(UrlGenerator::class);
        }

        $path = "home/$path";

        return app(UrlGenerator::class)->to($path, $parameters, $secure);
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,您需要helpers.php在 Laravel 加载其辅助函数之前加载文件,否则它不会加载,为此添加require __DIR__.'/../helpers.php';public/index.phpbefore require __DIR__.'/../vendor/autoload.php';,例如

require __DIR__.'/../helpers.php';
require __DIR__.'/../vendor/autoload.php';
Run Code Online (Sandbox Code Playgroud)

url现在您可以在应用程序中使用新函数,我在web.php路由文件中给出了一些示例:

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    echo url("company");

    echo "<br/>";

    echo url("knowledgebase");
});
Run Code Online (Sandbox Code Playgroud)

以上将输出到网页:

http://example.com/home/company
http://example.com/home/knowledgebase
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要url稍微更改该函数以更适合您的要求,您可以通过在文件中修改它来实现helpers.php