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

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

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

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

Laravel 5

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

Q&A

解決済

4回答

704閲覧

laravel mailableを使うときのコンストラクタの引数

s_hiro

総合スコア10

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2019/05/25 12:43

laravelで mailableを使ってメールを送信しようとしています。
ここでご質問ですが、色々と調べるとコンストラクタの引数がインスタンスで渡されているもの、単なる変数で渡されているものが存在しますが、どちらが理想でしょうか。
また、インスタンスで渡しているものは受け取り方・渡し方をどのように定義すればよろしいでしょうか。

例えば、laravelのドキュメントでは、

php

1 public function __construct(Order $order) 2 { 3 $this->order = $order; 4 }

と、途中でいきなり Order が出てきて、定義がどこにあるのか、どのように定義するのかわかりません。
色々と調べると、渡し方も両方あるようでした

インスタンス渡しのもの:
https://readouble.com/laravel/5.8/ja/mail.html
https://liginc.co.jp/369690

変数渡しのもの:
https://qiita.com/sayama0402/items/dd10cdb2aa22c8a035b3
https://www.ritolab.com/entry/38
https://atuweb.net/201706_laravel-mail-mailable/

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

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

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

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

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

guest

回答4

0

ベストアンサー

Orderが必ずEloquentモデルを継承したものとは限りません。
Kosuke_Shibuyaさんが回答しているように use されているものを確認すべきです。
useされていない場合は同じネームスペース配下のクラスとなります。

また、Laravelの設計思想上、そもそもClassで統一することが望ましいのか、変数渡しでも良いのか?が気になります。

この表現が微妙なのでただすと型宣言、またはタイプヒンティングです。
https://qiita.com/kazu56/items/50b35c9ee0e5c6c4e75e

もし、クラス、インスタンスの違いが付いていないようならその辺もおさらいした方が良いでしょう
(インスタンスを渡しても、変数を渡す事に代わりはないし、クラスを渡しているわけでもないので・・・)

特定のクラスのインスタンスのみ受け付けたい場合は、タイプヒンティングをつければ、違うインスタンスが来た時にエラーで落とせますので、全て設定していった方がよりよいアプリケーションになるかと思います。

コメントでいただいた下記の件について

nameとpriceがOrderクラス内で宣言されいているのでは無いかと思うのですが

これについては宣言されていません。Eloquent前提の話ですが
プロパティが設定されている訳ではなく、マジックメソッドが利用されていて
「存在しないプロパティにアクセスされた場合は、この関数の結果を返してあたかもプロパティが設定されているように振る舞う」
という処理になっているためです。

投稿2019/05/26 13:09

mikkame

総合スコア5036

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

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

s_hiro

2019/05/26 23:32

ありがとうございました! マジックプロパティ、マジックメソッドについて今まで知見がなかったので大変参考になりました!
guest

0

受け取るパラメーターは自由ですが、参考までに自分の場合は
0. mailableの処理は別にどれもこれも同じで良い
0. だけどテンプレートは変えたい
0. テンプレートで使う変数も変えたい

というような点を簡単に考えて引数はコレで作りました。

public function __construct($template, $data = null)

投稿2019/05/25 20:11

hentaiman

総合スコア6415

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

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

s_hiro

2019/05/26 11:54

hintaimanさん、ありがとうございます! 私も色々考えて最終的にこの形にたどり着きました。 bladeを分けるのは必要、だが、mailableを分ける必要性が今の所感じられないので、一旦この形で実装を行おうと思います。ありがとうございました!
hentaiman

2019/05/26 12:08

他の回答者の言うタイプヒンティングってのはこの場合は public function __construct($template, $data = null) の部分を public function __construct(String $template, Array $data = []) と言うように型指定するって事ですね。 ※型名が合っているかは不勉強ゆえ分かりません 上に書いたような型指定だとあまりメリット無さそうだけど、独自のモデルを実装済みでmailableの引数ではそのモデルしか受け取らないようにする場合に有効ですね。モデルの設計次第ではバリデーション済みである事が保障されるとか、その辺りは作り方次第。 と言いつつ自分はタイプヒンティング使ってないのでシラン
s_hiro

2019/05/26 23:39

今回の実装では、templateでbladeを指定して、メールに仕込むデータをMailData(ちょっとダサい)モデルを作成してマジックプロパティで渡す、という処理にしました。 するとほぼviewだけで完結する、コーディングが少なくても機能は果たせるので(なるべくコーディングしない、ということが賛否が分かれるところですが)そうしました。 ありがとうございます!
hentaiman

2019/05/27 03:46

それならわざわざクラス作らないでarray渡せばいいような、クラスという形に拘りたいだけなら新たにモデル作らないでもstdClassで済むような MialDataに何かしら定義をした上で独自のプロパティをという事ならこれらの考え方は合いませんが。 laravelは極力コントローラーだけで済ませてしまいたいというの考えには共感します。
guest

0

どこを見たらEloquent Modelということが判断つくのでしょうか?

イメージ説明

Class渡しと変数渡しが今、ごちゃ混ぜになっていてViewの変数表示がすごく汚く、どちらかに統一したほうが良いのでは無いかと思っているところです。

クラスを渡す方が、保守性が高まると思います。

投稿2019/05/25 13:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mikkame

2019/05/25 13:56

> クラスを渡す方が、保守性が高まると思います。 補足 想定されてないクラスを渡してしまった時点でエラーで落とす事ができる。 PHPdocなんかで引数の型の指定がしっかりできるため
s_hiro

2019/05/25 15:02

Kosuke_Shibuyaさん、mikkameさん ありがとうございます! やはりクラスで受け渡しするのが良いのですね、ありがとうございます。
guest

0

コンストラクタには「なんでも渡せる」

ドキュメントのメール送信部分。OrderはEloquentモデル。

$order = Order::findOrFail($orderId); // 配送処理… Mail::to($request->user())->send(new OrderShipped($order));

引数は減らしても増やしてもいいし自由。

Mail以外にもJobやNotificationも同じ。
Mailableの追加は後からなのでキューのドキュメント見たほうが分かる。

投稿2019/05/25 13:20

kawax

総合スコア10377

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

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

s_hiro

2019/05/25 13:44

ご回答ありがとうございます! OrderがEloquent Modelということ、ありがとうございます。 追加のご質問で申し訳ありませんが、どこを見たらEloquent Modelということが判断つくのでしょうか? また、Laravelの設計思想上、そもそもClassで統一することが望ましいのか、変数渡しでも良いのか?が気になります。 Viewに渡すときも同様かと思いますが、Class渡しと変数渡しが今、ごちゃ混ぜになっていてViewの変数表示がすごく汚く、どちらかに統一したほうが良いのでは無いかと思っているところです。
mikkame

2019/05/25 14:02

> OrderはEloquentモデル。 補足です。 Orderが必ずEloquentモデルを継承したものとは限りません。 Kosuke_Shibuyaさんが回答しているように use されているものを確認すべきです。 useされていない場合は同じネームスペース配下のクラスとなります。 > また、Laravelの設計思想上、そもそもClassで統一することが望ましいのか、変数渡しでも良いのか?が気になります。 この表現が微妙なのでただすと型宣言、またはタイプヒンティングです。 https://qiita.com/kazu56/items/50b35c9ee0e5c6c4e75e もし、クラス、インスタンスの違いが付いていないようならその辺もおさらいした方が良いでしょう (インスタンスを渡しても、変数を渡す事に代わりはないし、クラスを渡しているわけでもないので・・・)
s_hiro

2019/05/25 14:56

mikkameさん、ありがとうございます。 useで使われているものを確認するのは必要なのですが、laravelのドキュメントでは use App\Order と書いてあるだけで、その中身がまだ見つけられていません。 なので、make:model Order をしただけで中を触らなくても良いものなのか、どうなのか悩んでいます。 他のmodelでインスタンスを作りそれで渡したのですが、それでも動いていてすごく気持ち悪いです。 本来であれば、例えば上記の部分ですと、 ``` public function build() { return $this->view('emails.orders.shipped') ->with([ 'orderName' => $this->order->name, 'orderPrice' => $this->order->price, ]); } ``` の部分、nameとpriceがOrderクラス内で宣言されいているのでは無いかと思うのですが、その宣言の仕方がわからず、かつ、手元で試してみたときには宣言がなくても動作してしまっているので、すごく気持ち悪いです。
mikkame

2019/05/26 03:10

> 他のmodelでインスタンスを作りそれで渡したのですが、それでも動いていてすごく気持ち悪いです 特定のクラスのインスタンスのみ受け付けたい場合は、タイプヒンティングをつければ、違うインスタンスが来た時にエラーで落とせます > nameとpriceがOrderクラス内で宣言されいているのでは無いかと思うのですが これについては宣言されていません。Eloquent前提の話ですが プロパティが設定されている訳ではなく、マジックメソッドが利用されていて 「存在しないプロパティにアクセスされた場合は、この関数の結果を返してあたかもプロパティが設定されているように振る舞う」 という処理になっているためです。
s_hiro

2019/05/26 11:51

mikkameさん、ありがとうございます! mikkameさんのコメントがマトを得ていたので、ベストアンサーにしたいのですが、コメントだけなので、ベストアンサーにできません。 もし上記のコメントを回答で起こしていただければ、ベストアンサーにさせていただきたいと思いますので、是非お願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問