web-dev-qa-db-ja.com

同じルートグループを持つ複数のプレフィックス

私は学校のためにかなりシンプルなウェブサイトを書いています...このウェブサイトにはニュース、記事、ビデオクリップなどがあります

それが動作する方法は、私たちが訪問者にいくつかのレッスンを提示するホームページにあります

>math 
>geography 
>chemistry 

ユーザーがこれらの1つを選択すると、ユーザーの選択に基づいてWebサイトのコンテンツが変更されます

たとえば、ユーザーが数学を選択すると、ニュース、記事、数学に関するビデオなどが表示されます...今のところ、これは私がやっていることです(構文エラーは無視してください)

Route::group(['prefix'=>'math'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

Route::group(['prefix'=>'geography'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

Route::group(['prefix'=>'chemistry'], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

基本的に各プレフィックスに対してすべてのリンクを繰り返す....しかし、リンクが大きくなるにつれて、ますます管理できなくなります...これを行うためのより良い方法はありますか?何かのようなもの

Route::group(['prefix'=>['chemistry','math' , 'geography' ], function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
});

-------------------------更新-------------

私はこれを試しました

$myroutes =  function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
};

Route::group(['prefix' => 'chemistry'], $myroutes);
Route::group(['prefix' => 'math'], $myroutes);
Route::group(['prefix' => 'geography'], $myroutes);

そしてそれはうまく機能します、問題は最後の接頭辞がすべての内部リンクに添付されることです

たとえば、数学をクリックした場合

私のリンクは

site.com/math/news

しかし、ロードされたページ上のすべてのリンクは

<a href="{{route('article_index')"> link to article </a>

のように見える

site.com/geography/article

基本的にリンクは、現在選択されているものに関係なく、最後に言及されたプレフィックスを取得します

20
hretic

なぜこのようにしないのですか?

$subjects = [
    'chemistry', 'geography', 'math'
];

foreach ($subjects as $subject) {
    Route::prefix($subject)->group(function () {
        Route::get('news', 'NewsController@index')->name('news_index');
        Route::get('article', 'ArticleController@index')->name('article_index');
    });
}

これは基本的な方法です。それでも主題を簡単に追加できますが、理解するのは明らかで簡単です。

13
louisfischer

私はそれを行う方が良いと思います:

Route::get('/news/{group}', 'NewsController@index')->name('news_index')->where('group', 'math|geography|chemistry');

そして、それが地理/数学/化学などであるかどうかに関係なく、コントローラー関数に条件を設定します。

思いませんか?

11
Wreigh

以下を試すことができます:

$myroutes =  function () {
    Route::get('/news', 'NewsController@index')->name('news_index');
    Route::get('/article', 'ArticleController@index')->name('article_index');
};

Route::group(['prefix' => 'chemistry'], $myroutes);
Route::group(['prefix' => 'math'], $myroutes);
Route::group(['prefix' => 'geography'], $myroutes);

次のように使用します:

 {!!URL::to('chemistry/news')!!}
 {!!URL::to('geography/news')!!}
 {!!URL::to('math/news')!!}
6
Govind Samrow

グループ内でasオプションを使用して、そのグループ内のすべてのルート名に文字列を付加するようルーターに指示することもできます。そのためには、次のことを試してください。

Route::group(['prefix' => 'chemistry', 'as' => 'chemistry.'], $myroutes);
Route::group(['prefix' => 'math', 'as' => 'math.'], $myroutes);
Route::group(['prefix' => 'geography', 'as' => 'geography.'], $myroutes);

だからあなたができることは次のとおりです:

<a href="{{route('chemistry.article_index')}}"> link to article </a>
<a href="{{route('math.article_index')}}"> link to article </a>
<a href="{{route('geography.article_index'}})"> link to article </a>

それが役に立てば幸い。

5
Desh901

ここにはすでに良い答えがいくつかありますが、おそらく個人の好みやより深いプロジェクトの詳細の問題です。ここにパイルの別のオプションがあります。

@Shamsの回答がなぜ反対票だったかはわかりませんが、私にとっては最もクリーンなアプローチのように見えますが、有効なサブジェクトのみが受け入れられるようにプレフィックスが制約されている場合に限ります。何かのようなもの:

// Only 1 place to update if you add subjects
$subjectRegex = 'math|geography|chemistry';

// Only 1 route per 'group'
Route::get('{subject}/news', 'NewsController@index')->name('news_index')->where('subject', $subjectRegex);
Route::get('{subject}/article', 'ArticleController@index')->name('article_index')->where('subject', $subjectRegex);

ボーナスとして$subjectコントローラーのメソッドで使用できます。これは便利なようです。たとえば、現在のサブジェクト内でルートを生成するために使用できます。

route('article_index', ['subject' => $subject])
4
Don't Panic

ルートグループをワイルドカードにして、RouteServiceProviderに優先プレフィックスを指定できます。

routes.php

_Route::group(['prefix'=>'{slug}'],function (){
 Route::get('/news', 'NewsController@index')->name('news_index');
 Route::get('/article', 'ArticleController@index')->name('article_index');
});
_

RouteServiceProviderブートメソッド

_Route::bind('slug',function ($name){
   $prefix = ["math","chemistry","geography"];
    if(!in_array($name,$prefix))
     {
        //handle wrong prefixes
        throw new \Exception("Something went wrong");
     }
 });
_

名前付きルートを使用

{{route('news_index',['slug'=>'math'])}}

3
Norris Oduro

好奇心のために、laravel=のプレフィックスルートグループでオプションのパラメーターを試してみましたが、うまくいきました。確認してください。

_Route::group(['prefix' => '{subject?}', 'as'=> 'subject.', where' => ['subject' => 'math|english|geo']],function (){
    Route::get('news', function (){
       return 'This is the news';
    })->name('news');
});
_

これがあなたが夢見ていたソリューションであることを確信してください。

これが正しい答えになる前に、少し問題があるかもしれません。 route('subject.news')を呼び出すと、_http://example.com/news_が得られます。満足させるには、オプションのパラメータをroute()関数に渡す必要があります。たとえば、route('subject.news','math');です。すると_http://example.com/math/news_になります。

PS:これはLaravel 5.4.30 PHP 7.1

グループ化する代わりに、ルートパラメータを使用できます

Route::get('/{prefix}/news', 'NewsController@index')->name('news_index');
Route::get('/{prefix}/article', 'ArticleController@index')->name('article_index');
0
Shams Reza