69

ルーティングに少し問題があります。

私はCMSに取り組んでおり、2つの主要なルートが必要です。/adminおよび/(:any)adminコントローラーはルート/adminに使用され、viewコントローラーは以外の目的で使用する必要があります/admin。次に、viewコントローラーからURLを解析し、正しいコンテンツを表示します。

これは私が持っているものです:

Route::get(array('admin', 'admin/dashboard'), array('as' => 'admin', 'uses' =>'admin.dashboard@index'));
Route::any('(:any)', 'view@index');

最初のルートは機能しますが、2番目のルートは機能しません。少し遊んでみましたが(:any)、疑問符なしで使用すると、後に何かを付けた場合にのみ機能するようです/。そこに疑問符を付けても、まったく機能しません。

次のすべてのルートをview@indexに移動させたいです。

/
/something
/something/something
/something/something/something
/something/something/something/something
...etc...

これは、(動作することすら知らない)大量のハードコーディングなしで可能(:any?)/(:any?)/(:any?)/(:any?)ですか?

これについて行くための最良の方法は何ですか?

4

10 に答える 10

125

Laravel 5

このソリューションはLaravel5で正常に機能します。

Route::get('/admin', function () {

  // url /admin

});

Route::get('/{any}', function ($any) {

  // any other url, subfolders also

})->where('any', '.*');

ルーメン5

これは代わりにLumen用です:

$app->get('/admin', function () use ($app) {
  //
});

$app->get('/{any:.*}', function ($any) use ($app) {
  //
});
于 2016-01-02T10:50:39.703 に答える
48

404ステータスを打つことは私には少し間違っているようです。これにより、404をログに記録するときにあらゆる種類の問題が発生する可能性があります。最近、Laravel 4で同じワイルドカードルーティングの問題に遭遇し、次のスニペットで解決しました。

Route::any('{slug}', function($slug)
{
    //do whatever you want with the slug
})->where('slug', '([A-z\d-\/_.]+)?');

これにより、制御された方法で問題が解決するはずです。正規表現は次のように簡略化できます。

'(.*)?'

ただし、これは自己責任で使用する必要があります。

編集(追加):

これは多くのルートを上書きするため、「App::before」ステートメントでラップすることを検討する必要があります。

    App::before(function($request) {
            //put your routes here
    });

このように、後で定義するカスタムルートを上書きしません。

于 2013-03-23T11:29:36.937 に答える
30

編集:このトピックに関してLaravel 4のリリース以来、いくつかの混乱がありました。この回答はLaravel3を対象としていました。

これにアプローチする方法はいくつかあります。

最初の方法はマッチング(:any)/(:all?)です:

Route::any('(:any)/(:all?)', function($first, $rest=''){
    $page = $rest ? "{$first}/{$rest}" : $first;
    dd($page);
});

複数のパラメーターに分割され、何らかの理由で(:all)が単独で機能しないため、最善の解決策ではありません(バグ?)

2番目の解決策は正規表現を使用することです。これは私の意見では上記よりも優れた方法です。

Route::any( '(.*)', function( $page ){
    dd($page);
});

ルートが他のパターンと一致している場合でも、cmsページがあるかどうかを確認できるメソッドがもう1つあります。ただし、これらのルートが404を返した場合、このメソッドは次のように定義されたイベントリスナーを変更しroutes.phpます。

Event::listen('404', function() {
    $page = URI::current();
    // custom logic, else
    return Response::error('404');
});

しかし、私の好みの方法は#2です。これがお役に立てば幸いです。何をするにしても、これらの上に他のすべてのルートを定義して、すべてのルートをキャッチするようにしてください。後に定義されたルートはトリガーされません。

于 2012-11-08T20:49:54.747 に答える
10
Route::get("{path}", "SomeController@serve")->where('path', '.+');

上記のコードは、あなたが言及した再帰的なサブURLをキャプチャします。

/
/something
/something/something
/something/something/something
/something/something/something/something

admin / *などの他の特殊なケースでは、このケースの前にキャプチャできます。

于 2016-01-02T18:54:34.753 に答える
8

誰かが何かをつなぎ合わせるのに役立つ場合に備えて、私の経験を詳しく説明してください。

Laravel上で自己APIを消費するReactアプリを構築しました。Laravel/Lumenが提供する単一のビューがあります。Reactルーターを使用します。 アプリ内のリンクをクリックすることは常に機能しましたが、URLを入力するには次の考慮事項が必要でした。

Laravelでは、web.phpルートファイルで次のものを使用しました。

Route::view('/{path?}', 'app')
    ->where('path', '.*')
    ->name('react');

そして、すべてがうまくいきました。

それから私はプロジェクトをLumenに切り替えました。この投稿のおかげで、web.phpルートファイルで次のものを使用しました。

$router->get('/{all:.*}', function() {
    return view('app');
});

これは、次のような第1レベルのURLで機能しました。

/
/something 

でも、

/something/something etc.

しませんでした。

Googleデベロッパーツールの[ネットワーク]タブを調べたところ、app.jsのURLが、次のような2番目以降の層のURLでapp.jsの前に/somethingを追加していることがわかりました。

myapp.com/something
app.js URL:  myapp.com/js/app.js  (as it should be)

myapp.com/something/something
app.js URL:  myapp.com/something/js/app.js  (not found)

私がしなければならなかったのは、次のような単一のビューページのapp.jsソースに先頭のスラッシュを追加することだけでした。

<script src="/js/app.js" defer></script>

それ以外の:

<script src="js/app.js" defer></script>

それで:

これはLaravelで機能しました (これは、js / app.js URLを自動的に解決した可能性のあるBladeファイルでした)

<script src="{{ asset('js/app.js') }}" defer></script>

Route::view('/{path?}', 'app')
    ->where('path', '.*')
    ->name('react');

しかし、私はルーメン でこれをしなければなりませんでした(ブレードファイルではありません)

<script src="/js/app.js" defer></script>

$router->get('/{all:.*}', function() {
    return view('app');
});
于 2019-04-27T12:58:19.090 に答える
5

ルートファイルの最後にこれを追加します

App::missing(function($exception)
{
    return View::make('notfound');
});

http://scotch.io/tutorials/simple-and-easy-laravel-routingから

于 2014-05-26T11:22:32.783 に答える
3

Laravel8/サブディレクトリの下でのみリダイレクト

存在しないURLをすべてリダイレクトするのではなく、特定のサブディレクトリ( https://example.com/subdir/*など)にあるURLのみをリダイレクトしたかったのです。

欠落しているすべてのURLをリダイレクトしたい場合は、web.phpファイルの最後にあるフォールバックルートを使用できます。

Route::fallback(function () {
    //
});

しかし、サブディレクトリ内のURLのみをリダイレクトしたかったので、このコードを使用しました。これは私にとってはうまくいきました(/にリダイレクトするだけです)。

Route::get('subdirectory/{any}', function($page){return redirect()->to('/');})->where('any', '.*');

これはFallbackRouteTest.phpで見つかりました。

于 2021-06-20T04:42:14.670 に答える
2

解決策をありがとうウィリアム。ただし、メソッド1と2はLaravel 4で機能しなくなり、Laravel 4でソリューション#3を使用するには、start/global.phpファイルで404イベントを発生させる必要があります。

App::error(function(Exception $exception, $code)
{
    // i.o. -> this is our catchall!
    // http://stackoverflow.com/questions/13297278/laravel-using-any-wildcard-for-all-routes
    Event::fire('404');

    return View::make('error')->with('exception', $exception)->with('code', $code);

    Log::error($exception);
});

これで、routes.phpファイルでこれを処理できます。

Event::listen('404', function() {
    // url?
    $url = Request::path();

    // LOGIC HERE

    // else
    return View::make('error');
});
于 2013-03-13T23:43:11.937 に答える
1

基本的な内腔の足場を持っています。私の場合、2つのフロントエンドアプリとAPIルートがあります

<?php // routes/web.php
/** @var \Laravel\Lumen\Routing\Router $router */

$router->group([
    'prefix' => '/api/v1',
    'namespace' => 'App\Http\Controllers'
], function () use ($router) {

    require 'routes-group1.php';
    require 'routes-group2.php';
    // ...
});

$router->get('/admin{any:.*}', function () {
    return file_get_contents('../public/a/index.html');
});

$router->get('{any:.*}', function () {
    return file_get_contents('../public/m/index.html');
});
于 2018-01-17T03:29:26.167 に答える
0

Laravel5.5以降のフォールバックルート

このRoute::fallbackメソッドを使用して、他のルートが着信要求に一致しない場合に実行されるルートを定義できます。通常、未処理のリクエストは、アプリケーションの例外ハンドラを介して「404」ページを自動的にレンダリングします。ただし、通常はファイルfallback内でルートを定義するため、ミドルウェアグループ内のすべてのミドルウェアがルートに適用されます。必要に応じて、このルートにミドルウェアを自由に追加できます。routes/web.phpweb

Route::fallback(function () {
    //
});

注:フォールバックルートは、常にアプリケーションによって登録された最後のルートである必要があります。

于 2020-12-11T16:59:10.670 に答える