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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

CakePHP

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

Q&A

解決済

1回答

2020閲覧

[CakePHP3] Model(Table)内でのcomponent利用はアリか

y.sudo

総合スコア19

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

CakePHP

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

1グッド

1クリップ

投稿2017/08/09 12:52

お世話になります。

現在Cake2.4 から 3.4へのマイグレーションを行なっており、
既存2.4のあるModel内でAuthComponet::user()を利用し、
認証情報を取得している記述があったのですが、3.xで
・App::importが廃止された
・AuthComponet::user()が静的呼び出し不可
になった関係で、どう調べてもAuthComponentが利用できない結論に至りました。

そこで質問なのですが、そもそもModel内でcomponent呼び出しすること自体
MVCの設計思想に反しているのでしょうか。

また、もしModel内で認証したユーザ情報を使いたい場合、一度controller内で
componentを利用し、取得。その後Modelインスタンスのクラス変数にsetして利用、
という方法が一般的なのでしょうか。

これだという答えはないのかもしれませんが、皆様がどう行なっているのか
ご助言いただけますと幸いです。

popobot👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

どう調べてもAuthComponentが利用できない結論に至りました。

できないと思います。CakePHP本家にIssueが上がっており、未対応でクローズされています。
3.0 - $this->Auth->user('id') inside a model or view
※詳しく読んでいませんが、ワークアラウンドも載っています
※関連するオープンなプルリクがあるので、今後対応される可能性もあるのかもです

そこで質問なのですが、そもそもModel内でcomponent呼び出しすること自体

MVCの設計思想に反しているのでしょうか。

個人的には...
そうだと思います。Controllerの共通ロジックをModelで参照するのは適切ではないかと。
ただし、認証情報をモデルで参照できない仕様は微妙だと思います。別の方法があってもいい気がします...

また、もしModel内で認証したユーザ情報を使いたい場合、一度controller内で

componentを利用し、取得。その後Modelインスタンスのクラス変数にsetして利用、
という方法が一般的なのでしょうか。

自分は、AppControllerのinitialize()とかで、Configureクラスに認証情報をwrite()して
モデル側でread()するやり方で対処しました。(これが適切どうかはわかりませんが)

あと、参考になりそうな実装としては、UseMuffin/Footprintというプラグインがあります。
これは、データを更新する際に、認証ユーザを一緒に保存しています。詳しくは見ていませんがEventを使っているみたいですよ。

投稿2017/08/09 14:38

編集2017/08/09 14:51
popobot

総合スコア6586

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

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

y.sudo

2017/08/14 01:18 編集

icchii様、いつも的確なご回答をいただき、本当にありがとうございます。 色々検証していましたら、お礼の返事が遅くなってしまい、申し訳ございません。 > そうだと思います。Controllerの共通ロジックをModelで参照するのは適切ではないかと。 > ただし、認証情報をモデルで参照できない仕様は微妙だと思います。別の方法があってもいい気がします... やはりそうなのですね。あえてimportをなくしたのも、きっとそういうことなのですね。 結果的には、icchii様からご提案いただきましたConfigureクラスで扱うのが 一番わかりやすいと感じました。 (上記issueにもglobal領域で。。と言っているようですので) 実はConfigureクラスはConfigディレクトリ以下で定義した内容のreadぐらいにしか 思っていなかったのですが、グローバル変数のように使えるのですね。 ただしcookbookにも、MVCを壊してしまうことに注意、とは記載があったので 極力認証情報までで留めておきたいと思います。 また、Footprintも確認し、恥ずかしながらEventクラスの存在を初めて知りました。 (私の持っている入門書には記載すらありませんでした) 雰囲気的にはException的な感じで使えるようでしたので、希望通りにできそう でしたが、私には少々動きの流れが把握しづらいので、今回は存在の確認に留めて おこうかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問