私は学校のためにかなりシンプルなウェブサイトを書いています...このウェブサイトにはニュース、記事、ビデオクリップなどがあります
それが動作する方法は、私たちが訪問者にいくつかのレッスンを提示するホームページにあります
>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
基本的にリンクは、現在選択されているものに関係なく、最後に言及されたプレフィックスを取得します
なぜこのようにしないのですか?
$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');
});
}
これは基本的な方法です。それでも主題を簡単に追加できますが、理解するのは明らかで簡単です。
私はそれを行う方が良いと思います:
Route::get('/news/{group}', 'NewsController@index')->name('news_index')->where('group', 'math|geography|chemistry');
そして、それが地理/数学/化学などであるかどうかに関係なく、コントローラー関数に条件を設定します。
思いませんか?
以下を試すことができます:
$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')!!}
グループ内で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>
それが役に立てば幸い。
ここにはすでに良い答えがいくつかありますが、おそらく個人の好みやより深いプロジェクトの詳細の問題です。ここにパイルの別のオプションがあります。
@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])
ルートグループをワイルドカードにして、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'])}}
好奇心のために、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');