4

最近、Laravel のベンダー ファイルの 1 つを変更して目的の結果を得る必要があるという問題に遭遇しました。そのファイルは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 に関する問題を開きました

4

5 に答える 5

1

composer でベンダークラスをオーバーライドできます

ファイルを編集composer.jsonして autoload セクション内に 2 行追加して、実装を入れ替える必要があります。

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

最初の行は元のクラスをロードから除外し、2 番目のクラスは実装に適した名前空間を持つ元のクラスを指します。

次に、app/Overridesフォルダーを作成し、その中に File.php (オーバーライドするファイル) をコピーする必要があります。

そして最後のステップは実行することです:

composer dump-autoload

そして、あなたは行ってもいいです!

于 2022-01-31T10:51:05.297 に答える