質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

6681閲覧

Laravel Route::controllerのかわり

ms5025

総合スコア292

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2019/02/08 02:16

編集2019/02/08 02:31

初心者の質問で申し訳ありません。
Laravelでfuelやzendのようにrestfulにルーティングさせる方法として
web.phpに以下の一文
Route::controller('hoge/', 'App\Controllers\hogeController');

コントローラ側

php

1namespace App\Controllers; 2class hogeController extends BaseController 3{ 4 // getでhoge/にアクセスされた場合 5 public function getIndex() 6 { 78 } 9 10 // getでhoge/harehareにアクセスされた場合 11 public function getHarehare() 12 { 1314 } 15 16 // getでhoge/detailにアクセスされた場合 17 public function getDetail() 18 { 1920 } 21 22 // postでhoge/editにアクセスされた場合 23 public function getEdit() 24 { 2526 } 27 28}

のようなルーティングにしたいのですが、
Route::controller のルーティングはLaravel 5.2 で非推奨、Laravel5.3 で削除されたようです。
fuelやzendのように自由にコントローラーにアクションを追加したいのですが
laravelではどのように同じことが実現できるのでしょうか?

できれば

php

1Route::get('/hoge', 'hogeController @index'); 2Route::get('/hoge/goodmorning', 'hogeController @harehare');

のようにはしたくないのですが・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/08 02:19

ひとまずコードはマークダウンのcode機能を利用してご提示ください(質問は編集できます)
m.ts10806

2019/02/08 02:21

ちなみに現在利用されているLaravelのバージョンは5.xいくつでしょうか?環境情報として追記してください。
ms5025

2019/02/08 02:25

Laravel Framework 5.5.45になります
m.ts10806

2019/02/08 02:27

(2回目ですが)コードはマークダウンのcode機能を利用してご提示ください(質問は編集できます)
ms5025

2019/02/08 02:32

大したソースじゃないんでこのままでもいいかとおもったんですが 編集しました。
m.ts10806

2019/02/08 02:34

それは質問者さんだけの観点です。 読みやすさのためには例え一行でも必要です。
kazto

2019/02/08 02:46

「Route::get('/hoge', 'hogeController@index');」のような記載をしたくない理由は何でしょうか。
ms5025

2019/02/08 06:59

>kaztoさん hogeController以下のアクションメソッドはコントローラに自由に追加していけば web.phpに以下アクションをわざわざ記述しなくていいというのが開発上便利だと思ったのですが、 あまり推奨されないやり方だったようですね。 fuelもzendもその辺自由度が高かった為、laravelでも当然同じような記述ができると思っていた次第です。
guest

回答4

0

ベストアンサー

Route::getで全部書くだけ。

そもそもなんで削除されたかというと
Route::controllerを見ただけではどんなルートが定義されてるか分からない。
コントローラーまで見に行く必要がある。
Route::controllerが便利そうに見えるのは最初に作る時だけで後から見た時に困る。
先人の経験の上で削除したほうがいいと結論出されたものに初心者の感覚でこっちがいいと言っても意味がない。

それとこれだと一つのコントローラーにどんどんメソッドを増やしてファットコントローラーになりやすい。

Laravel的にベストで個人的にも勧めてるのは「リソースコントローラー以外はシングルアクションコントローラーで作る」
https://readouble.com/laravel/5.7/ja/controllers.html#single-action-controllers

Route::namespace('Hoge')->prefix('hoge')->group(function () { Route::get('/', 'IndexController')->name('hoge.index'); Route::get('detail', 'DetailController')->name('hoge.detail'); });

web.phpを見ればルート定義が分かり、各コントローラーも大きくならない。

投稿2019/02/08 02:52

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2019/02/08 03:09

なるほど!そうなんですね。 fuelでもznedでも今までのプロジェクトは ルートだけ定義して、あとはコントローラにアクションを追記していく方法でした。 確かにRoute::controllerを見ただけではどんなルートが定義されてるか分からないですね。 >先人の経験の上で削除したほうがいいと結論出されたものに初心者の感覚でこっちがいいと言っても意味がない こっちがいいと言ってるわけではなくて、laravelでも当然できるものだと思っていて、 どうすればいいのか質問しただけです。 ただ >一つのコントローラーにどんどんメソッドを増やしてファットコントローラー 個人的にはコントローラーはデスパッチするだけに留めるものだと思っているので 必要なルート以外は増えないイメージでいました。 処理の主要部分はモデルや処理クラスに出されているので、 コントローラーを見ればどういうルートが存在し、どういう流れなのか即座に理解できる程度の 薄いもののイメージがあったため、この一文は私はちょっとよくわかりません。 リンク先も参考にさせていただきます。 質問してよかったです。
ms5025

2019/02/08 03:15

シングルアクションコントローラーで作るということはしたことがなかったのですが とても参考になりました。 フレームワークはfuelとzendしか知らなくて、今までそういったコントローラーの作りをしてるプロジェクトしかなかったので、とても参考になりました。 けど、ルートごとにコントローラーがバンバン増えていくのは 逆に管理しにくくはないのでしょうか・・。(ファイルむっちゃ増えるみたいな)
guest

0

あまりいいやり方ではないかもしれませんが、任意パラメータをうまく使えばある程度汎用的にはなるかなと。

ルーティング:

php

1Route::get('/hoge/{action?}', 'HogeController@action');

コントローラー:

php

1class HogeController extends Controller 2{ 3 public function action(String $action_name = "index",Request $request) 4 { 5 if(method_exists($this,$action_name)){ 6 $this->$action_name($request); 7 } 8 } 9 10 private function index(Request $request) 11 { 12 echo "index"; 13 } 14 private function test(Request $request) 15 { 16 echo "test"; 17 } 18}

ルーティングに1個1個書きたくない・・というのでしたら
configに配列で定義してループでまわすというのもありです。

投稿2019/02/08 02:49

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/08 02:54

ただkawaxさんの内容に大賛成ですね。 ファットコントローラーになってしまうとそれこそ醜いので。
ms5025

2019/02/08 04:38

ファットコントローラーって私の中ではモデルとは別に処理クラスを作らず コントローラー内に処理をポンポン記述してしまう事なのかと思っていました。 (モデルがテーブルと密接になっているプロジェクトにありがち) ルートが増える=ファットというイメージがなかったです。 けどリソースコントローラー以外はシングルアクションコントローラーで作るというのが トレンドだと知らなかったので、勉強になりました。
m.ts10806

2019/02/08 04:48

ファットについては、kawaxさんの通り。いずれにしても不用意にメソッド作ったり共通化せずにゴリゴリ書いたり、外だしできるのに中に書いたりすることですね。 ルートは必要であればそのぶん書くべきなのは言うまでもありませんし、私の回答のように任意パラメータに頼りすぎてはルートを見ただけではどのようなページや機能があるか把握できなくなります。 ルートは言わば玄関から部屋に続く道のようなものなので。 あとLaravelは疎結合がかなり進んでたはずなのでModelが必須ではありませんし、より自由な記述が可能と言う点では若干学習コストは高いかもしれませんね。 「Web職人のためのフレームワーク」というテーマなので、エンジニアとしての技量や経験、発想がより効率的でフレームワークの機能を活かす形になりそうです。
ms5025

2019/02/08 04:53

私はコントローラー=デスパッチ のイメージでいたので (それこそ玄関から部屋に続く道ということです) 複数アクションがあったとてファットになりえないという認識でした。 laravelのフレームワークを使用して作られたソースをたくさん見たい気持ちです。 ありがとうございます。
m.ts10806

2019/02/08 05:17

私が実務で使ったことがあるのは4系のころだったのでまだ5は勉強中です。 Github探るとあがってるものもあるかもしれませんね。 ブログでLaravel専門に扱っているところを見るのもありです。 ララ帳、ふたりはララベル とか。 更新頻度がわりかし高いのはララジャパン とかですね。
guest

0

php artisan make:controller HogeController --resourceのコマンドでResource用のコントローラーが作成できます。

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7class HogeController extends Controller 8{ 9 public function index() {} 10 public function create() {} 11 public function store(Request $request) {} 12 public function show($id) {} 13 public function edit($id) {} 14 public function update(Request $request, $id) {} 15 public function destroy($id) {} 16}

web.phpRoute::resource('hoges', 'HogeController');を追加したら、上記のコントローラーのメソッドが下記のテーブルにあるURIにマッピングされます。

HTTP VerbURIコントローラーでのメソッド名ルート名
GET/hogesindexhoges.index
GET/hoges/createcreatehoges.create
POST/hogesstorehoges.store
GET/hoges/{hoge}showhoges.show
GET/hoges/{hoge}/editedithoges.edit
PUT/PATCH/hoges/{hoge}updatehoges.update
DELETE/hoges/{hoge}destroyhoges.destroy

リソースの下に、リソースを作ることも可能です。
web.phpRoute::resource('hoges.hares', 'HareController');

すべてのメソッドを使わない場合は、ルートに指定することも可能です。

php

1Route::resource('hoge', 'HogeController', ['only' => ['index', 'show']]); // indexとshowのみ 2Route::resource('hoge', 'HogeController', ['except' => ['destroy']]); // destroy以外

このパターンと離れた設定は一つずつ指定した方が良さそうかもしれません。

投稿2019/02/08 02:24

編集2019/02/08 02:56
Bremenkanp

総合スコア205

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2019/02/08 02:29

すいません、私がこれを理解できなくて…。この一覧は拝見したのですが アクションメソッドが最初から決まってしまうということなんでしょうか? 例えば hoge/harehare というルートを追加したい場合どのように実際コードに落とし込めばいいのでしょうか? fuelとzendでは public function action_harehare() ないしは public function harehareAction() のようにアクションメソッドをコントローラーに追記して対応するviewを用意すれば動きました。 laravelの場合はどのようにすればいいのでしょうか?
Bremenkanp

2019/02/08 02:47

最初から決まってしまいます。リソースコントローラーは必ず7つのアクションがあるので、これ以上に追加したい場合は、その下に新しいリソースを作ることがおすすめです。 `Route::resource('hoges.hares', 'HareController');` < それぞれのHogeにHareのリソースが作られるように。ネストされてること以外、ほぼすべてが上記のテーブルと一緒になります。 デフォルトパターンと違うふうに進むと、ルート一つずつ指定した方が一番わかりやすいかもしれません。
ms5025

2019/02/08 04:26

ありがとうございます。参考になりました。 fuel、zendとどちらも似たようなイメージだったので laravelも似たような事ができるかとおもっていました。 質問してよかったです。ありがとうございます。
guest

0

ルーティングの使い方はこちらに書かれていますよ。
https://readouble.com/laravel/5.7/ja/routing.html

投稿2019/02/08 02:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2019/02/08 05:07

すいません、見たうえでの質問でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問