php - Laravel 6-7 如何覆盖/更改供应商类?

标签 php laravel composer-php laravel-6 laravel-7

我最近遇到了一个问题,我需要更改 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 上打开了一个问题,其中有完整的背景解释 here

最佳答案

我的结果是使用 composer 来覆盖文件,因为我以前的方法不起作用。这是我所做的。

首先,在 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 文件夹中。

关于php - Laravel 6-7 如何覆盖/更改供应商类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60841930/

相关文章:

php - 如何更改jquery文件上传的默认上传路径

php - 为我的属性表创建照片模型

laravel - Stripe : Expire/Cancel subscription after n payments

PHP Composer 找不到自动加载的文件

php - Composer 冲突和 Symfony 3

php - 为什么 DirectoryIndex index.php index.html 不工作?

php - MySQL 查询不插入在 PHP 中添加的数组元素

php - 拉维尔 4 : Sorting comments by how many 'Likes' they have

php - 更新另一个表上的特定表字段

linux - 外壳返回 "PuTTYPuTTYPuTTY..."