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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

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

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

2回答

1524閲覧

Laravel Eloquentを使うときのロジック置き場所がわかりません

Tatsuki-sth

総合スコア35

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

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

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2020/01/29 06:38

LaravelでEloquentを使った開発をしています。

公式等のサンプルではコントローラからEloquentモデルのwhereだったりgetだったりを使っているようです。
ただ、記事や講演会で「コントローラにロジックが書かれるのは良くない」と目に耳にします。

このような場合、Eloquentモデルクラスに関数を書いて、それをコントローラから呼び出すのが良いのでしょうか?
それとも、コントローラでもEloquentモデルクラスでもない別の場所の方が良いのでしょうか?

サンプルなどでよく見る例

UserController

1<?php 2 3use App\User; 4 5class UserController extends Controller 6{ 7 public function showUser(){ 8 $users = User::all(); // これが「ロジックの流出」? 9 return view('view.users')->with("users", $users); 10 } 11} 12

User

1<?php 2 3namespace App; 4 5class User extends Model 6{ 7 protected $table = "user"; 8 9 // ここに関数を書いて、叩くようにする? 10 // 例えば static getAllUsers() のような関数? 11}

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

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

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

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

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

guest

回答2

0

ベストアンサー

例えば、1ヶ月いないに支払いをした有効なユーザーを一覧表示する機能があったとして

HogeController

1public function showUser() 2{ 3 4 $users = User::where('status', 'active')->where('last_payment_at', '>=', Carbon::now()->subMonth()); 5 return view('user.show',compact("users")); 6} 7

みたいなコードがあるとします。
また、1ヶ月いないに支払いをした有効なユーザー`にメールを送るバッチ処理があるとします

HogeCommand

1 2public function handle() 3{ 4 $users = User::where('status', 'active')->where('last_payment_at', '>=', Carbon::now()->subMonth()); 5 foreach($users as $user) { 6 // ... 7 } 8 9}

同じコードが複数の場所に散見されてしまうようになります。
このようになんども1ヶ月いないに支払いをした有効なユーザーを書くようならModelに書いてまとめた方がよいと思いますが

例示されているUser::allだけなら、コントローラから呼び出すUser::allがUser:: getAllUsersに変わるだけなので意味がないと思います

投稿2020/01/29 07:44

mikkame

総合スコア5036

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

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

Tatsuki-sth

2020/01/29 08:46

ありがとうございます。 実際はいくつかのコントローラから同一の処理を呼ぶことが予測されていましたが、例示のために背景を省いた簡潔な処理を書きました。 後々リファクタリングする可能性もありますが、一旦はモデルに処理を詰め込んでいこうと思います。
mikkame

2020/01/29 08:51

流れとしてはコントローラー肥大化しすぎ(FatController)→モデルに詰め込む→モデル肥大化しすぎ→(FatModel)→サービス層を作ろう! って流れなんですけど、量が多くなければ適当に書いていいと思います
guest

0

要件次第です。
なんでもかんでもコントローラに書くのは良くないですが、なんでもかんでもモデルに書くのもよくありません。
デフォルト機能だけで済むならわざわざラップする必要ないでしょうし。

そもそも、その講演会ではなんの前提や例もなく「良くない」と言っていたのでしょうか。

「ロジック」と言っても一概にこれと言えない部分があります。

なので「要件次第」
または「プロジェクトのルール次第」

実装は統一されたほうが良いので、もし今ないならルールを整備するところからでしょうか。

投稿2020/01/29 06:43

m.ts10806

総合スコア80842

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

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

Tatsuki-sth

2020/01/29 07:15

なるほど、ありがとうございます。 ルールを決めるとは言うものの、ある程度スタンダードな様式や、ベストプラクティス的なものがあるのかと思いこの質問をしました。 実際のところ、私が回答で書いたようなモデルに関数を書くといったことはよくあるのでしょうか?
m.ts10806

2020/01/29 08:16

んー。 どのようにも書けるのでしたらひとつのことを実現するためにとれる手段はひとつのではないので、 そういった意味ではプログラミングの世界って「ベストプラクティス」って存在しないと思って良いです。 回答序盤に書いた通り、もしデフォルトの機能だけで済むならわざわざラップした別機能を自ら準備する必要はないと考えます。 htmlspecialcharsのように「長いから短縮したい」という要件でもあれば別でしょうけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問