4

我最近遇到了一个问题,我需要更改 Laravel 的一个供应商文件以获得所需的结果。该文件是vendor/laravel/framework/Illuminate/Routing/CompileRouteCollection.php.

在该文件中,需要更改一个函数。

protected function requestWithoutTrailingSlash(Request $request)
{
    $trimmedRequest = Request::createFromBase($request);

    $parts = explode('?', $request->server->get('REQUEST_URI'), 2);

    $trimmedRequest->server->set(
        'REQUEST_URI', rtrim($parts[0], '/').(isset($parts[1]) ? '?'.$parts[1] : '')
    );

    return $trimmedRequest;
}

更具体地说,这部分:rtrim($parts[0], '/'). 最后需要删除 / 才能使我的部分路线正常工作。

我尝试在内部创建自己的自定义类:App\Helpers\CompiledRouteCollection.php. 我在其中复制了上面列出的函数并进行了自己的更改。

App\Helpers\CompiledRouteCollection.php

namespace App\Helpers;

use Illuminate\Http\Request;

class CompiledRouteCollection extends \Illuminate\Routing\CompiledRouteCollection
{
    protected function requestWithoutTrailingSlash(Request $request)
    {
        $trimmedRequest = Request::createFromBase($request);

        $parts = explode('?', $request->server->get('REQUEST_URI'), 2);

        $trimmedRequest->server->set(
            'REQUEST_URI', rtrim($parts[0], '').(isset($parts[1]) ? '?'.$parts[1] : '')
        );

        return $trimmedRequest;
    }
}

然后我进入 App\Providers\AppServiceProvider 并在 register 函数中运行它。

public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias('App\Helpers\CompiledRouteCollection', 'Illuminate\Routing\CompiledRouteCollection');
}

但什么也没有发生。

更新 1

我将别名更改为:

$loader = AliasLoader::getInstance();
$loader->alias('Illuminate\Routing\CompiledRouteCollection', 'App\Helpers\CompiledRouteCollection');

但是现在在我的 Helper 类中,它在尝试访问任何页面时都会返回此错误: Class 'Illuminate\Routing\CompiledRouteCollection' not found

对于任何有兴趣帮助我的人,非常感谢。如果您需要更多信息,请告诉我!

如果您需要更多上下文,我在 laravel/framework 上打开了一个问题,这里有完整的背景说明

4

5 回答 5

4

结果我改用作曲家来覆盖文件,因为我以前的方法根本不起作用。这就是我所做的。

首先,在composer.json文件的自动加载部分我添加了这个:

"exclude-from-classmap": [
    "vendor\\laravel\\framework\\src\\Illuminate\\Routing\\CompiledRouteCollection.php"
],
"psr-4": {
    "App\\": "app/",
    "Illuminate\\": "app/Overrides/"
},

接下来,我在 app 文件夹中创建了 Ovverides 文件夹,然后我复制了该CompiledRouteCollection.php文件并将其粘贴到了 Ovverides 文件夹中。

于 2020-03-28T19:23:56.953 回答
3

在别名中,第一个参数必须是供应商类,之后是覆盖类

public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias(CompileRouteCollection::class, CompiledRouteCollection::class);
}

或者

public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias('Illuminate/Routing/CompileRouteCollection', 'App\Helpers\CompiledRouteCollection');
}

像你所希望的))

于 2020-03-25T07:02:33.060 回答
1

您可以在作曲家覆盖供应商类

您需要编辑您的composer.json文件并在自动加载部分中添加两行额外的行以换出实现。

"exclude-from-classmap": ["vendor/packagename/diraction/to/File.php"],
"files": ["app/Overrides/File.php"]

第一行将排除加载原始类,第二个类将指向具有正确命名空间的原始类以供您的实现。

那么您需要创建app/Overrides文件夹并在其中复制 File.php(您要覆盖的文件)。

最后一步是运行:

composer dump-autoload

你很高兴去!

于 2022-01-31T10:51:05.297 回答
0

试着把它换成你的RouteServiceProvider而不是AppServiceProvider

只是一个猜测,因为它是路由系统的一部分。在它命中之前,它可能已经作为原始类被调用过AppServiceProvider

我在https://github.com/laravel/framework/issues/32082查看了您的问题,我很惊讶他们不建议尝试它。如果我正确地记得 Laravel 的请求生命周期,RouteServiceProvider 可能是你的票。

我钦佩您在寻找解决方法方面的足智多谋。

于 2020-04-02T20:26:35.207 回答
0

根据我的经验,您可以执行以下操作:

  1. 将以下内容添加到App\Providers\AppServiceProvider .
public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias('Illuminate\Routing\CompileRouteCollection', 'App\Helpers\CompiledRouteCollection');
}
  1. 像这样编辑作曲家文件。
"psr-4": {
    "App\\": "app/",
    "Illuminate\\Routing\\": "app\\Helpers\\"
},

然后请compose install运行该项目。

于 2020-10-30T06:55:57.653 回答