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

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

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

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

CakePHP

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

Laravel 5

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

Q&A

解決済

4回答

6297閲覧

PHPフレームワークではどこに処理を書くべきなのか

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

CakePHP

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

Laravel 5

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

0グッド

4クリップ

投稿2016/10/20 00:51

自分はプログラミングを初めてまだ日が浅いのですが、例えばlaravelのようなフレームワークを使う場合に大体の処理をコントローラー内に書いてます。ですが上級者?の方のソースを見ると大抵クラス分けしてコントローラーではそのクラスを呼び出すような形でコードを組んでるみたいです。これってやっぱり自分もクラス分けして書いた方がいいのでしょうか。個人的にはコントローラーに書いた方が処理がまとまってて見やすいんですが、クラス分けにすることでなにか利点があるのでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

CakePHP 及び Laravel タグが付いていますから、それらのフレームワークにおける処理の共通化について回答しておきます。

目的

コントローラーに直接処理を記述せずに、他のクラスに処理を記述するのは、「他のコントローラーとの共通の処理を1箇所にまとめる」ためです。
また、特定の処理ごとにクラスを分けることにより、クラスの役割が明確化され、プログラムの可読性が上がります。
例えば、コントローラーに全ての処理が、クラスを使わずにズラーっと記述されていて、1メソッド100行を超えるような状態になっていた場合、非常に読みにくいですよね?
また、ログイン処理の修正が発生したとき、複数のコントローラーを修正する必要が出てくるため、工数の増加やバグの温床になりやすいです。
それが、クラスに記述していると、コントローラーをパッと見るだけで、大体そのコントローラーが何をやっているのかがわかるようになってきます(きちんとクラス設計されている前提)。

CakePHP 及び Laravel には、そのための仕組みが存在します。

CakePHP

コントローラ間で共有されるロジックのパッケージの仕組みとして、「コンポーネント」が存在します。
フレームワークで用意されているコンポーネントもあり、それを使えば一般的な処理は簡単に追加できますし、自分で独自のコンポーネントを作成することもできます。
詳しい利用方法はこちらを参照してください。

Laravel

コントローラ間で共有されるHTTPリクエストをフィルタリングする仕組みとして、「ミドルウェア」が存在します。
こちらも、フレームワークで用意されているミドルウェアもあり、それを使えば一般的な処理は簡単に追加できますし、自分で独自のミドルウェアを作成することもできます。
詳しい利用方法はこちらを参照してください。

フレームワークの仕組みを利用するメリット

composerなどを利用し、オートロード機能を使えば、独自にクラスを定義してフレームワークに組み込むことも可能ですが、フレームワークを利用するのであれば、フレームワークの規格に則った実装をすべきです。
フレームワークを利用するメリットの一つに、フレームワークの記述ルールをチーム内で共有することで、プログラムの品質及び開発効率をあげられる、というのがあります。
それが、わざわざ高い学習コストを払ってフレームワークを習得する意義なのです。
なので、フレームワークを使用する以上は、こういった仕組みを最大限利用し、外部のライブラリやフレームワークに準拠していないクラスを使用する場合でも、フレームワークに準拠したクラスによってラップするなどし、他の開発者に理解しやすい状態を保つことが大事だと思います。

投稿2016/10/21 03:31

moriyama

総合スコア259

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

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

退会済みユーザー

退会済みユーザー

2016/10/21 06:39

なるほど、クラス分けはフレームワークの仕組みを最大限使うことにもつながっていたわけですね。長文かつ丁寧に教えていただき感謝です。
guest

0

コントローラにビジネスロジックを書いてしまうと、いわゆるファットコントローラと呼ばれる状態になってしまい、コードの見通しが悪くなったり等様々な弊害が生じます。数十行程度のメソッドならまだファット(太っている)とは言えないかもしれませんが、機能追加等をしていくと徐々にファットになっていってしまう可能性があります。このファットコントローラを改善する様々な手法がありますので、ファットコントローラをキーワードにして調査なさってみてはいかがでしょうか?

最後に私の好きなスライドへのリンクを置いていきます。スライド

投稿2016/10/20 01:00

編集2016/10/20 01:12
natady

総合スコア606

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

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

退会済みユーザー

退会済みユーザー

2016/10/20 07:33

なるほど、ファットコントローラーなんて言葉があるんですね。調べてみます!
guest

0

Class分けすることによるメリットは

  • 他Controllerでも同じ処理を呼び出すことができる。
  • 影響範囲をある程度絞ることができ、処理の修正や障害発生時の調査がしやすい。
  • テストが行いやすい。
  • ログなどの処理をかませたい!などといった時に、Classなどで処理が共通化されていると一括で処理をはさみこめる。
  • 継承などを利用することで拡張性も向上する。

といったところでしょうか。

例えば、メール送信処理をControllerにべた書きしてしまうと、
他のControllerでもメールを送信したい!となったときに、他のControllerでも同じ処理をかかなくてはなりません。
更にそのメール送信処理の時にログを出したい!といったときも、各Controllerにログ出力のコードを書かなければならないです。

投稿2016/10/20 01:13

ShoheiTai

総合スコア897

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

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

退会済みユーザー

退会済みユーザー

2016/10/20 07:34

確かに共通化されてると直すところも1箇所で済みますもんね。回答ありがとうございました!
guest

0

ざっと概要みたいなものになってしまうのですが、クラスを呼び出すようなかたちというのは、おそらく

  • 共通の機能をまとめて書いてあるか、
  • 抽象的な機能をまとめて書いているか、

のどちらかに殆どの場合があてはまるのかと思います。
実際にアプリケーションを作るときには、特にここに厳密な規則はないのですが、何度も同じことを書くのはあまりよくないので使いまわせるものは使いまわしていこうという思想というか理想です。
開発している人たちも最終的にどのようなかたちで設計すればよいのかというのは、実は(細かな部分では)あまりわかっていなくて、開発をすすめるにあたって後から1つの関数やクラスにまとめたり、大掛かりなリファクタリングを行います。
コントローラーにいろいろ書くことは問題ではないのです。たぶんいろいろ書いているうちに「これは別のクラスにして後から使いまわせた方がいいなぁ」とか切に思うときがあるので、そのときにはっきり意味がわかってくるのかと思います。

DIとかトレイトとかファサード(DIの一種ですかね。。)とか、いろいろあります。
とはいえ、アプリケーションの規模や開発者の人数、また開発計画(おそらく大規模な開発だといっぺんにこしらえることはできないので段階的に計画的に開発したりすると思います。)などに設計自体も左右されるかと思います。

投稿2016/10/20 01:25

osamuya

総合スコア241

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

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

退会済みユーザー

退会済みユーザー

2016/10/20 07:35

やはり共通の機能は文字通り共通させた方が便利ですよね。抽象的な機能というのは例えばどういったものでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問