最近我遇到了一个问题,我需要更改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,并在寄存器函数中运行它。
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的问题,它有完整的背景说明这里。
发布于 2020-03-28 19:23:56
我用composer代替了这个文件,因为我以前的方法根本不起作用。这就是我所做的。
首先,在composer.json文件的autoload部分,我添加了以下内容:
"exclude-from-classmap": [
"vendor\\laravel\\framework\\src\\Illuminate\\Routing\\CompiledRouteCollection.php"
],
"psr-4": {
"App\\": "app/",
"Illuminate\\": "app/Overrides/"
},接下来,我在应用程序文件夹中创建了Ovverides文件夹,然后复制CompiledRouteCollection.php文件并将其粘贴到Ovverides文件夹中。
发布于 2020-03-25 07:02:33
编辑app\Providers\AppServiceProvider.php。alias()方法的第一个参数必须是供应商类,之后是重写类:
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');
}发布于 2022-01-31 10:51:05
可以在composer中重写供应商类。
您将需要编辑您的composer.json文件,并在autoload部分中添加两行以交换实现。
"exclude-from-classmap": ["vendor/packagename/diraction/to/File.php"],
"files": ["app/Overrides/File.php"]第一行将排除加载原始类,第二个类将指向具有适合实现的命名空间的原始类。
然后,您需要创建app/Overrides文件夹并在其中复制File.php (要覆盖的文件)。
最后一步是运行:
composer dump-autoload你就可以走了!
https://stackoverflow.com/questions/60841930
复制相似问题