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

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

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

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

CakePHP

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

Q&A

3回答

7989閲覧

cakePHPで共通関数を書く場合のcomponentとbehaviorの住み分けについて

nata-de-Gollira

総合スコア42

PHP

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

CakePHP

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

0グッド

1クリップ

投稿2016/12/07 03:25

編集2022/01/12 10:55

cakePHP1.3です。
Controller、Modelの両方でよく使用される共通関数があるとします。
共通化するために、最初はcomponentに書いていおり、Modelからcomponentを使用していたのですが、
やっぱりロジックはModelに寄せるべきかなと思い、behaviorに移し、Controllerから使用する場合は、behaviorをactしているmodel経由で使用する感じで考えております。

そうなると、componentはControllerに特化した共通ロジックを書くことになると思いますが、
必ずControllerからしか使用されないロジックとかかなり限定的かつ、「Controllerからしか使わん!なんて言い切れるものなんてあんのか?結局、modelからも使用することになって、componentとbehaviorで両方ともに、ロジックが点在するんじゃね?」と思ってしまい、componentの意義が分からなくなってしまいます。

このように共通関数を使用する場合は、皆様はcomponent、behaviorをどう分けるのが、スマートだとお考えでしょうか?

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

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

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

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

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

guest

回答3

0

僕は2.xを使っていますが、
基本的にComponentはController側の共通処理、BehaviorはModel側の共通処理を記述します。
ComponentもBehaviorもそれぞれ異なるメソッドやコールバック、プロパティをもっているので
それを上手く使った実装をします。
経験則も含まれているので、怪しい箇所などあればコメント頂ければと思います。

Component

  1. Controllerで使用する便利系処理、共通処理の実装
  2. サービスレイヤの実装
  3. Controllerのコールバック実装

といった使い方をしています。

1.Controllerで使用する便利系処理、共通処理の実装

Controllerで使用する範囲の便利系処理を記載します。

2.サービスレイヤの実装

サービスレイヤには賛否があるかもしれないですが、
ControllerとModelの間に挟み込み、Modelの操作をまとめる実装をします。(以下参考リンクより)
複数のモデルへsaveをかける場合や、APIと連携しつつDBへの更新を行う場合など、一連のモデルの処理を取りまとめるような実装になりますね。
サービスについては以下が参考になるかと思うので一読いただければと思います。
MVCモデルにおけるサービスの役割について教えて下さい

※Component内でのModelの使用は推奨されていませんが、1.x系のドキュメントにはアクセス方法が記載されています。
アプリケーションの規模が大きくなると、サービスレイヤがないと管理が難しくなってくるためこういった実装を行っています。

3.Controllerのコールバック実装

例えば、ControllerのbeforeFilterとbeforeRenderのタイミングでログを出したい、といった場合にComponentを作成します。
こうすることにより、一連の処理を管理しやすくなり、実行タイミングなども制御しやすくなります。

Behavior

  1. Modelで使用する便利系処理、共通処理の実装
  2. Modelのコールバック実装

で使用します。

1.Modelで使用する便利系処理、共通処理の実装

Model共通で使用する処理を記述しますが、Model経由でControllerから呼び出す場合も稀にあります。
例えば、CakePHPでは対応していないValidation処理を取りまとめたValidationBehaviorを作ったり、
ビットフラグの取り扱うBitFlagBehaviorを作ったりしています。

2.Modelのコールバック実装

複数モデルで同様のコールバック処理を入れたい場合や、同様にログを出力したい場合などに使用しています。
例えば、削除フラグのdeletedカラムが存在しているとします。
この場合、モデルでfindする際にdeleted=1のデータを誤って取得しないよう、
beforeFindのコールバックでdeleted=0のみ取得するような処理を記述します。
ここのdeletedフラグが複数テーブルに存在する場合は、複数のモデルのbeforeFindに同様の記述が発生するので
BehaviorのbeforeFindコールバックに処理を記述して各モデルで読み込ませます。

上記に該当しない共通処理

CakePHPのHashクラス(1.x系だとSet?)のような共通処理(便利関数群)はiichiさんの回答にあるような
独自クラスを作成して読み込ませます。

長々と書いてしまいましたが、回答になっていますでしょうか。。。
何かございましたらコメントを頂ければと思います。

投稿2016/12/07 06:42

ShoheiTai

総合スコア897

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

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

0

自分は、便利系の共通関数などは、ComponentでもBehaviorでもない独自のクラスに定義して使っています。特にCakephp3では、独自にUtilityなどのディレクトリを作ってクラスを追加しても、他のクラスから簡単にアクセスできるので便利です。(Cakephp2とかでも少し工夫すればできるかと)

参考:CakePHP3で共通関数を作る方法
※なお、Cakephp3の命名規則(Cake\Utility\Hashとか)に合わせるなら、UtilsよりUtilityが個人的にはいいかと

もちろん、Controllerの共通処理はComponentに、Modelの共通処理はBehaviorに、Viewの共通処理はHelperに書く前提で、それらに沿わないものに限ります。

投稿2016/12/07 03:54

編集2016/12/07 04:03
popobot

総合スコア6586

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

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

0

僕はcakephp3を使って開発しましたが、componentに記述する内容はだいたい画像のアップロード等々のview側からの操作の時に使いました(主にajaxを用いる場合ですけど)。
behaviorについてはモデルで使用するものに関して書きましたね。

ただ私はjava&Cからの流れ者なので何とも言えないのですが、phpのいう共通関数やcomponentに記述して共通ー!!!
ってめちゃ大げさで当たり前だーだし、フレームワークで変な言い回しおおすぎワロスって思ってます。インスタンス化して呼ぶとかすげえ当たり前なんやない???って思ってますます。だいたいphp5からインスタンス化なんてできるんやから当たり前に使えっちゅうねん!!このPHP屋めえええ!!ってグチグチグチ・・・・

以上です

投稿2016/12/07 03:38

RyoutaMorimura

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問