我最近遇到了一个问题,我需要更改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
6条答案
按热度按时间twh00eeo1#
我的结果是使用composer来覆盖文件,因为我以前的方法无论如何都不起作用。下面是我所做的。
首先,在
composer.json
文件的autoload部分,我添加了以下内容:接下来,我在app文件夹中创建了Ovverides文件夹,然后复制了
CompiledRouteCollection.php
文件并将其粘贴到Ovverides文件夹中。b1uwtaje2#
编辑
app\Providers\AppServiceProvider.php
。alias()
方法的第一个参数必须是vendor类,后面是覆盖类:或
jq6vz3qz3#
您可以在composer中覆盖供应商类
您需要编辑
composer.json
文件并在autoload部分中添加两行额外的代码来替换实现。第一行将从加载中排除原始类,第二行将指向具有适合您的实现的命名空间的原始类。
那么您需要创建
app/Overrides
文件夹并将File.php(您要覆盖的文件)复制到其中。最后一步是运行:
你可以走了!
csga3l584#
尝试在
RouteServiceProvider
而不是AppServiceProvider
中将其交换出来只是猜测,因为它是路由系统的一部分。它可能在到达
AppServiceProvider
之前就已经作为原始类被调用了。我在https://github.com/laravel/framework/issues/32082上看到了你的问题,我很惊讶他们没有建议尝试它。如果我没有记错Laravel的请求生存期,
RouteServiceProvider
* 可能 * 是你的票。我很佩服你在寻找变通办法方面的足智多谋。
uklbhaso5#
根据我的经验,你可以这样做:
1.将以下内容添加到
App\Providers\AppServiceProvider
中的寄存器函数中。1.像这样编辑composer文件。
然后请
compose install
并运行该项目。oyt4ldly6#
您可能想要使用
AppServiceProvider
上的$bindings
。https://laravel.com/docs/9.x/providers#the-bindings-and-singletons-properties
在本例中,我想覆盖一个包的Login Controller中的
$redirectTo
变量:第一个