首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 6-7我怎样才能覆盖/更改供应商类?

Laravel 6-7我怎样才能覆盖/更改供应商类?
EN

Stack Overflow用户
提问于 2020-03-25 01:47:38
回答 6查看 11.1K关注 0票数 6

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,并在寄存器函数中运行它。

代码语言:javascript
复制
public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias('App\Helpers\CompiledRouteCollection', 'Illuminate\Routing\CompiledRouteCollection');
}

但什么都没发生。

更新1

我把化名改成了这个:

代码语言:javascript
复制
$loader = AliasLoader::getInstance();
$loader->alias('Illuminate\Routing\CompiledRouteCollection', 'App\Helpers\CompiledRouteCollection');

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-03-28 19:23:56

我用composer代替了这个文件,因为我以前的方法根本不起作用。这就是我所做的。

首先,在composer.json文件的autoload部分,我添加了以下内容:

代码语言:javascript
复制
"exclude-from-classmap": [
    "vendor\\laravel\\framework\\src\\Illuminate\\Routing\\CompiledRouteCollection.php"
],
"psr-4": {
    "App\\": "app/",
    "Illuminate\\": "app/Overrides/"
},

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

票数 7
EN

Stack Overflow用户

发布于 2020-03-25 07:02:33

编辑app\Providers\AppServiceProvider.phpalias()方法的第一个参数必须是供应商类,之后是重写类:

代码语言:javascript
复制
public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias(CompileRouteCollection::class, CompiledRouteCollection::class);
}

代码语言:javascript
复制
public function register()
{
    $loader = AliasLoader::getInstance();
    $loader->alias('Illuminate/Routing/CompileRouteCollection', 'App\Helpers\CompiledRouteCollection');
}
票数 7
EN

Stack Overflow用户

发布于 2022-01-31 10:51:05

可以在composer中重写供应商类。

您将需要编辑您的composer.json文件,并在autoload部分中添加两行以交换实现。

代码语言:javascript
复制
"exclude-from-classmap": ["vendor/packagename/diraction/to/File.php"],
"files": ["app/Overrides/File.php"]

第一行将排除加载原始类,第二个类将指向具有适合实现的命名空间的原始类。

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

最后一步是运行:

代码语言:javascript
复制
composer dump-autoload

你就可以走了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60841930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档