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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Laravel 5

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

Q&A

解決済

2回答

4180閲覧

フレームワーク controllerの単位について

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Laravel 5

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

0グッド

0クリップ

投稿2018/10/16 13:38

編集2018/10/16 13:44

phpをメインにfuelphp,cakephp,laravelなどいくつかフレームワークを使った開発経験があるのですが
controllerの単位について悩んでいます。

プロジェクトや設計思想によってその定義はバラバラだと思いますが
例えばUserController1つに取って考えてみてもかなり吟味するパターンがいくつかあります。

例えば以下の行動(アクション)です。

  • システム利用のために会員登録する
  • システム利用のためにメール認証して本人確認を済ませる
  • ログインする
  • ユーザー名を変える
  • メールアドレスを変更する
  • パスワードを変更する

これらはUserに関する行動なので個人的にはUserControllerに対応するアクションを定義すべきかと思っています。

ログインするはユーザーが行なっているのではなくシステムが行なっているからLoginControllerとずべきだ、という人もいるかもしれません。

Laravelの場合だと、ログインとログアウト ユーザー登録 パスワードの再発行 パスワードリセットの4コントローラーがAuthで束ねられていますが、私はこれを全部分解し、UserControllerに移行しました。

次は以下です。(laravelを扱いなれています、、、)

  • 掲示板に求人の募集を投稿する(create, store)
  • 管理している求人の一覧を見る(index)
  • 管理している求人の詳細を見る(show)
  • 管理しているの内容を修正する(edit, update)
  • 管理しているを削除する(destroy)

これらはUserが行なっていることに間違いはありませんが、求人に関する操作を行なっているので
JobController とか WorkController などが望ましいと思っています。

URLとROUTE的には

Route::resource('job/', 'Publish\JobController', ['only' => ['index', 'show']]); Route::group(['middleware' => ['auth']], function () { Route::resource('my_page/job/', 'Client\JobController'); });

が望ましいかと思っています。

controllerの単位の決め方は同時に考えることが多すぎて数時間数日はまってしまうことがあります。
少なくとも私は以下のことを気にしながら開発しています。

  1. SEOを意識した親和性のあるURLである、かつ、
  2. Routeの記述がシンプルであり1アクションにおけるURLは同じだがGET/POSTで分けられメソッド名も違和感がない、かつ
  3. {controller名}.{メソッド名}のビューで違和感がない、かつ
  4. どこに何があるのかそれとなく分かってしまいそうなアーキテクチャ構造である

個人的には2番目と3番目に悩まされることが多いですが私は
Controller名を軸にURLを決めルーティング設定し
Controller名を軸に違和感がなければ {controller名}.{メソッド名}でビューを作るようにしています。

1つわかりやすい例をあげると以下です。

// ログインフォーム Route::get('sign_in', 'Client\UserController@signInForm')->name('sign_in'); // ログイン実行 Route::post('sign_in', 'Client\UserController@signIn');

これはclient.user.sign_in_formというビューを作ればいいですし、ビューの命名的にも不自然はないどころかかなりマッチしているのではと個人的に思っています。

また、要件2の
Routeの記述がシンプルであり1アクションにおけるURLは同じだがGET/POSTで分けられメソッド名も違和感がない
もクリアしています。

最終的にはどれだけ整理整頓するのが上手いかどうかって話になってきますが、私もいろんなプロジェクトに参画して見てきていますが例えばpasswordResetControllerというcontrollerもあったりしたことがあります。

個人的にはこのconrtoller名を見て真っ先に思うのは、何のパスワードをリセットするのだろうか?

と思います。(passwordResetっていったらたいていユーザー絡みなので予想はできますが、ユーザーのパスワードであるとは100%言い切れません。)
でも、これはどちらかというとアクションだと思うので自分ならこういったcontrollerは作りません。

と、ここまで話た上で、UserContorollerに戻ります。
ユーザーが〜〜〜をする、というアクションをこのUserControllerに定義していくとは肥大化していしまいます。

Service層とRepository層いれているのでそこの問題は心配していませんが、メソッド名の数です。

システムによってはユーザーがやることなんて結構な数があると思います。

この結構な数のアクションをUserControllerという1ファイルに収めるのを良しとするか不合理とするかで悩んでいます。

結構な数のアクションはざっくりですが、今作っているサービスでは普通に40以上はあると思っています。

そのことを考えるとuserPasswordResetControllerなどというcontrollerの利用も考え出しているところですが、やはりパスワードリセットとかはアクションなのでそれをcontrollerとするのは個人的にはものすごく違和感があります。

なので現状こういったルーティングにしています。(ちょっとだけ公開)

// ログインフォーム Route::get('sign_in', 'Client\UserController@signInForm')->name('sign_in'); // ログイン実行 Route::post('sign_in', 'Client\UserController@signIn'); // ログアウト実行 Route::post('sign_out', 'Client\UserController@signOut')->name('sign_out'); // パスワード再設定メール送信フォーム Route::get('password/reset_link', 'Client\UserController@passwordResetLinkForm')->name('password.reset_link'); // パスワード再設定メール送信実行 Route::post('password/reset_link', 'Client\UserController@passwordResetLink'); // パスワード再設定フォーム Route::get('password/reset/{token?}', 'Client\UserController@passwordResetForm')->name('password.reset'); //パスワード再設定実行 Route::post('password/reset', 'Client\UserController@passwordReset');

ミドルウェアがwebについては、get通信に対するメソッド名は末尾にFormをつけるということを自分の中でルール化しています。

何かベストプラティクスがありましたらご教示いただけますと助かります。

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

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

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

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

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

guest

回答2

0

URLの分離ケース

  1. データベース分離型(crud):cakephpの基本思想
  2. URL分離型(1url/1controler)
  3. 機能分離型 (入力~完了画面)

がわりかしおおいですが

cakephpの場合、認証が必要な範囲で記載することになります。
(ルートは基本オートマッピングのため)

/users ユーザー情報以下 だけの場合は
/users/login UsersController ですし

上記に加え /orders 注文情報以下 もいるよなら
/login LoginContller です

なのでベストは要件によりけりとなります。

要約すれば
誰が操作するかは間違えで
何を操作するかがコントローラーの分離の目安になります。

投稿2018/10/16 23:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

質問者が挙げていないフレームワークですが、Railsでは創始者のDHH氏が、「resources(というRails標準で使えるメソッド)でセットできるnewcreateshowupdateeditindexdestroyの7つ以外のアクションは作らずに、増やしたいときはリソースを分ける」というのを提唱していて(参考)、Rails界では実践者も多いようです。

投稿2018/10/16 14:14

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/10/16 14:24

ありがとうございます。 laravelにもresorceありますね。 >7つ以外のアクションは作らず これを原則とするならどうしてもcontrollerがアクション単位で作られてしまいますね。 でも1classが1000ステップ以上になるくらいならまだましですね。 気持ちの問題ですかね... 「controller 単位 決め方」などで調べているのですが、案外検索結果が出てこなくて困っていました。
退会済みユーザー

退会済みユーザー

2018/10/16 14:30

CRUDはresorceで定義されるセットメソッドで良いと思っているので上記ルーティングの下にこういうのを記述しています。 // ユーザー一覧 Route::resource('user', 'Client\UserController', ['only' => ['show']]); どうでなければCRUD以外の処理に対応するメソッドがないからですが、この問題に対してはどう考えられていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問