Ikeda's Blog

Laravelでブログサイトを作る 09. ルーティング

はじめに

ルーティングは、どのURLでアクセスされた時に、どのコントローラの、どのメソッドを呼ぶかを指定します。
URL設計で挙げたURLを、routes/web.phpに記述していくことで設定します。

不要なものを削除(コメントアウト)

routes/web.phpには、動作確認の際に見たwelcomページと、認証機能を導入した際に追加されたdashboardページについての記述が存在しているはずです。
これらは、今後使用する予定が無いので、コメントアウトしてしまいます。

/*
Route::get('/', function () {
    return view('welcome');
});

Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');
*/

管理ページ

管理側はログインしていることがアクセス条件となります。
※認証機能についてはコチラで解説しています。
'middleware' => 'auth'の記述を加えることで、簡単に実現できます。

また、Route::groupで、admin以下のアクセスについての設定をまとめることができます。
管理側のページ1件ずつに上記の記述を書くのは面倒なので、こうしてまとめれば簡単で、かつ「このグループは管理用」というのが分かりやすいです。

// 管理画面(認証後に触れるページ)
Route::group(
    [
        'prefix' => 'admin',
        'middleware' => 'auth',
        'namespace' => 'App\\Http\\Controllers\\'
    ],
    function() {
        // 親カテゴリ管理:一覧(入力欄込)表示
        Route::get('parent', 'ParentCategoryController@list')->name('admin_parent');
        // 親カテゴリ管理:更新処理
        Route::post('parentUpdate', 'ParentCategoryController@update')->name('admin_parent_update');

        // 子カテゴリ管理:一覧(入力欄込)表示
        Route::get('child', 'ChildCategoryController@list')->name('admin_child');
        // 子カテゴリ管理:更新処理
        Route::post('childUpdate', 'ChildCategoryController@update')->name('admin_child_update');

        // 記事:入力フォーム
        Route::get('articleEdit/{id?}', 'ArticleController@edit')->name('admin_article_edit');
        // 記事:更新処理
        Route::post('articleUpdate', 'ArticleController@update')->name('admin_article_update');
        // 画像アップロード
        Route::post('articleImageUpload', 'ArticleController@image')->name('admin_article_image_upload');
        // 記事一覧
        Route::get('articleList', 'ArticleController@adminList')->name('admin_article_list');
        // 記事一覧(親カテゴリ絞り)
        Route::get('articleList/parent/{parent}', 'ArticleController@adminParentList')->name('admin_article_list_parent');
        // 記事一覧(子カテゴリ絞り)
        Route::get('articleList/child/{child}', 'ArticleController@adminChildList')->name('admin_article_list_child');
        // 記事一覧(検索)
        Route::post('articleList/search/', 'ArticleController@adminSearchList')->name('admin_article_list_search');
        // 記事プレビュー
        Route::post('articlePreview', 'ArticleController@preview')->name('admin_article_preview');

        // 「/admin/」にアクセスされたら、記事一覧へ
        Route::get('/', 'ArticleController@adminList')->name('admin_top');
});

小ネタ

prefixの値を変更することで、管理画面のURLを外部から推測されづらいようにします。

たとえは、'prefix' => 'qawsedrftgyhujikolp',としておくと、管理画面のURLは「https://ドメイン/qawsedrftgyhujikolp/」となるので、URLを直接指定されるようなアクセスを防ぐことができます。

フロントページ

それぞれに->name('XXXXX')を付けることで、後から利用しやすくします。
詳しくはbladeテンプレートを作成する際に記載しますが、href="{{ route('XXXXX') }"のように記述することで、URLを生成してくれるのです。
例えば、「親カテゴリ一覧のURLを/p/{id}にしよう」となった時、routes/web.phpを修正し、nameの方はそのままにしておけば、出現箇所すべてを修正する必要はなくなるのです。

// フロントページ
Route::group(['prefix' => '/', 'namespace' => 'App\\Http\\Controllers\\'], function() {
    // 一覧(http://ドメイン/)
    Route::get('/', 'ArticleController@list')->name('top');

    // 記事1件表示(http://ドメイン/content/XX)
    Route::get('content/{id}', 'ArticleController@content')->name('content');

    // 親カテゴリ別記事一覧(http://ドメイン/parent/XX/)
    Route::get('parent/{id}', 'ArticleController@parentL')->name('list_parent');

    // 子カテゴリ別記事一覧(http://ドメイン/child/XX/)
    Route::get('child/{id}', 'ArticleController@childList')->name('list_child');

    // 検索結果一覧(http://ドメイン/search/)
    Route::post('search/', 'ArticleController@searchList')->name('list_search');
});