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

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

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

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

CakePHP

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

Q&A

解決済

2回答

1214閲覧

Authコンポーネントについて教えて下さい。

dedenne008

総合スコア5

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2020/03/06 02:57

初めて質問します。超初心者です。

CakePHPの学習本で、質問の投稿とそれに対する回答を行えるサービスを作ってみよう的な課題に取り組んでいます。

課題の中に、回答のidとAuthのユーザーidが一致していたら回答を削除するというコードがあるのですが、
何故$this->Auth->user($id)ではなく$this->Auth->user('id')となるのか分かりません。

PHP

1public function delete(int $id) 2 { 3 $answer = $this->Answers->get($id); 4 $questionId = $answer->question_id; 5 6 if ($answer->user_id !== $this->Auth->user('id')) { 7 $this->Flash->error('他のユーザーの回答を削除することはできません'); 8 9 return $this->redirect(['controller' => 'Questions', 'action' => 'view', $questionId]); 10 } 11 12 if ($this->Answers->delete($answer)) { 13 $this->Flash->success('回答を削除しました'); 14 } else { 15 16 $this->Flash->error('回答の削除に失敗しました'); 17 } 18 19 return $this->redirect(['controller' => 'Questions', 'action' => 'view', $questionId]); 20 }

Answersテーブルからidを取得するときは$this->Answers->get($id)と$idを使っているのに、
Authのときは$this->Auth->user('id')となるのは何故でしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/06 03:06

公式ドキュメントをよめば質問は起きない項目です
m.ts10806

2020/03/06 04:16 編集

公式ドキュメントを読んだかどうかはこの質問内容からは誰も汲み取れません。本当になにも調べず試さず丸投げる人との区別は他人にはできませんよ。 それに「学習本」の書籍名やページも明示されてないので確認しようがないですし。 そういう自分本意なコミュニケーションの取り方は嫌われないんですか?
dedenne008

2020/03/06 04:34

この件では、公式ドキュメントを読んだか読んでいないかは関係ありません。 質問サイトを使って『教えてください』と言っている人に対して、『ググれ』と回答するような人は嫌われますよという意味です。 学習本の書籍名やページを記載してほしいと思うのなら、 『学習本の書籍名やページを記載してください。でないと、答えようがありません』と書けばいいじゃないですか?初心者って書いてますよね? 質問サイトで質問に関係のないコメント付けて楽しいですか?
dedenne008

2020/03/06 04:38

『調査したこと・試したことを記入する』とアドバイス頂いた方、 ありがとうございます。 当方、本日初投稿の初心者なのでそういったことも知らず、大変助かります。
m.ts10806

2020/03/06 04:45

質問に関係ありますよ。 むしろガイドラインやヘルプも読まず利用するのはどこの世界でも批難されて然るべきという話をしています。 指摘を受けてるのですから言い返すのではなく質問修正するのが正しい対応ではないですか? 技術的な初心者は仕方ないですがルールを確認しないのは初心者以前の問題かと思います。
m.ts10806

2020/03/06 04:51 編集

ちなみに勘違いされているようですが、「低評価」による自動コメントは「アドバイス」ではないです。 ルールを守ってないことによる「ルール見直して出直せ」というメッセージとして使われることが多いです。複数集まるということは「わざわざコメントで指摘するのも面倒なくらい明らかな不備」ということですよ。 ですから、質問を修正して返すのがこのteratailでやっていく上での対応です。 今回の対応はマズいと思います。「指摘を受け入れず言い返す要注意人物」として捉えられてもおかしくないでしょう。 現にはじめのコメントが削除されてますよね。複数通報受けるようなマズイコメントだったということにもなります。 (自身で削除依頼だしたとしたら「都合の悪いコメントの証拠隠滅をはかった」として更によろしくないですけど) コメントで具体的な指摘があるだけまだマシなんですよ。
yodel

2020/03/06 05:59 編集

> 「質問サイトを使って『教えてください』と言っている人に対して、『ググれ』と回答するような人は嫌われますよ」「初心者って書いてますよね?」 これは回答者が言う言葉であって、質問者が言うととても印象悪いです。次回の質問時に気を付けてみてください。。
guest

回答2

0

ベストアンサー

CakePHPは少し触ったぐらいなので間違えていたらごめんなさい。

なぜか、というとCakePHPの開発チームがそういう設計にしたからということになると思います。
実際に開発者に聞いたわけではないので予想での答えにはなってしまいますが……
特に違和感のない設計かなと私は思います。

$this->Answers->get($id)Answersはおそらくエンティティーですよね?

データベースアクセス & ORM

エンティティーは、個々のレコードを意味し、 行/レコードレベルの振る舞いや機能の定義を可能にします。

Answersのレコードのidを取得するから$this->Answers->get($id)ということかなと。
Answersに限らず、エンティティーはEntityInterfaceを実装しているので、getやsetなどのメソッドを皆持っています。

一方、Authコンポーネントはコンポーネントなので、エンティティーとは別物です。

コンポーネント

コンポーネントはコントローラー間で共有されるロジックのパッケージです。 CakePHP には、様々な共通のタスクを支援するための素晴らしいコアコンポーネントが 用意されています。あなた独自のコンポーネントも作成できます。 もしコントローラー間で コピー&ペーストしたい箇所があった場合、その機能を含むコンポーネントの作成を 検討しましょう。コンポーネントを作成することで、コントローラーのコードを綺麗に保ち、 プロジェクト間のコードの再利用につながります。

エンティティーの場合、1つのレコードのとある値を取得するという用途で、getという広い意味のある言葉を使っても、どのような動作をするかは予想がつきます。
コンポーネントは、上記に引用した説明にあるように、様々なロジックが含まれるものです。
Authコンポーネントなので、認証認可の共通ロジックがあるのでしょう。
そこにgetという名前のメソッドを作ったとき、何を取得するのかは曖昧になりませんか?
認証認可の共通ロジックからユーザーの情報を取得したいので、より取得する対象が明確になるuserという名前を使ったのだと思います。

投稿2020/03/06 04:30

編集2020/03/06 04:31
aaharu

総合スコア441

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

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

dedenne008

2020/03/06 04:53

ご回答いただきありがとうございます! エンティティとコンポーネントの違いで、そういう設計をしているということですね。 もう少し深く勉強してみます。
guest

0

aaharuさんの書いている通り、そもそもクラスも違うし用途も違うからなのですが、$id が指し示すものは何かを考えてください。

通常、アクションの引数には、URLのアクション部分以降が入ってきます。

例) /articles/delete/2 にアクセスしたら $id には 2 が入っている

というわけで、

Answersテーブルからidを取得するときは$this->Answers->get($id)と$idを使っているのに、

$this->Answers->get($id) は Articlesテーブルから $id に入っているプライマリキーを持つレコードをエンティティとして取得するです。

参考: Cake\ORM\Table::get - データの取り出しと結果セット - 3.8

例で言えば、$this->Answers->get(2) となり、id=2のレコードを取得することになります。

Authのときは$this->Auth->user('id')となるのは何故でしょうか?

$this->Auth->user() は、Authコンポーネントに格納されているユーザー情報を取得するメソッドです。
引数としてフィールド名の文字列を与えることで、格納されているユーザー情報の対応するフィールドの値のみを取り出せます。

参考: AuthComponent::user - AuthComponent - 3.8

というわけで、$this->Auth->user('id') は、Authコンポーネントに格納されているユーザー情報から idフィールドの値を取得する です。

ここで、 $this->Auth->user($id) としたらどうなりますか?

例で言えば $this->Auth->user(2) ということになります。ログインユーザー情報に2というフィールドはないはずなので、期待した動作にはならないですよね。

投稿2020/03/06 05:57

nojimage

総合スコア957

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問