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

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

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

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

Laravel 5

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

Q&A

解決済

3回答

5631閲覧

[Laravel] 共通する処理はどこに書くのが良いのでしょうか?

hirolog

総合スコア32

Laravel

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

Laravel 5

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

0グッド

0クリップ

投稿2018/07/11 12:33

編集2018/07/12 01:37

Laravel5.6 でコードを書いています。

Laravelというか、PHPの質問になるのかもしれないのですが(そこがわかってないのですが)、Laravelの流儀では共通する処理はどこに切り出して書くのかを知りたいです。

例えば、ページのあるボタンを押すと、

function1 「外部のAPIを読んで値を取得してデータベースに格納する」

という処理(関数)があったとします。

これを実現するためにGETで受け取り、Controllerで処理(=function1)して、Viewに返すという一連の処理を書くことは問題ありません。

ですが、他のViewでも同じボタンがあった場合、現状では同じコード function1 をまた別のControllerに書いています。

さらにボタンクリックではなく毎日1回、同じ処理をすることになった場合は、Console\Kernel.php にまた同じ処理 function1 を書いています。

このように function1 をコピーして貼り付けて問題なく動いているのですが、明らかにスマートではありません。

こうした場合、どこに、どのように切り出すのが良いのでしょうか?

ググるにしてもどう探っていくのかわからず、ヒントでもいただけるととても助かりますm(_ _)m

追記:
LaravelとはいってもPHPプログラムの一種なので究極的には、好き勝手に何でも書けるということだと思うのですが、例えば app配下に○○を追加 とか Middlewareは○○の役割 とか、○○ならServiceProviderに追加とか、拡張機能なら ○○フォルダ配下 とか、この辺りの理解を深めたいと思っています。
artisanコマンドで Model等 の追加はよく行っていますが、共通処理の切り出しで使えるコマンドがある、とかでも。

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

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

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

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

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

guest

回答3

0

結論から先に申しあげますと、「自由」というのが答えになります。

まず、Artisan コマンドとして実装して、そのコマンドを(Artisan ファサード等を使って)Controller や他の Artisan コマンドなどの、各所から呼び出すというのもひとつの手であり、設計の方向性としては悪くない考え方だと思います。
同じコードを複数箇所に書くよりも、一箇所に書いて、それを色んな場所から呼び出す方が、無駄が減って見通しがよくなるので、保守もしやすいですし、新しく参加したメンバーも理解がしやすくなります。

しかし、単にメソッドを呼ぶのであれば、Artisan コマンドの機能(例えばコマンドライン引数を解析する機能や、タスクスケジュールやキューを使って後から実行させられること等が Artisan コマンドを使うメリットの一つです)を使うまでもなく、単に PHP のクラスとして実装すれば、Laravel の機能に頼らずとも、どこからでも呼び出すことができます。

その際に、どこにクラスを作ればいいのかとか、何か継承しといた方がいいクラスはないのかと不安に思われる気持ちは分かりますが、Laravel には外部 API を呼び出す機能も、そこから値を取り出す機能も今のところ用意されていません。
そのため、特に継承すべきクラスもありませんし、どこにクラスを作るべきかを Laravel が縛る理由もありません。

そもそもどうして名前空間(フォルダ)を使って分類しているのかというと、ソースコードを整理したいからです。
自宅のキッチンや机の引き出しでもそうだと思いますが、たくさんの道具があるのなら、細かく分類した方が探すのが早くなって便利になりますが、道具が少ししかないのに細かく分類しても、かえって不便になってしまいます。
ソースコードもそれと同じで、規模の大小によって、どのような分類をするのがよいかは変わってきます。
Laravel では色んな規模のプロジェクトに対応できるようにするため、あえて自分が提供する機能以外は、自由な分類をさせるようにしているのです。
(もちろん Laravel は柔軟なので、Laravel が提供している機能の分類もカスタマイズ可能です)

というわけで、「自由」というのが答えになるのですが、もし不安であれば、まずは Web アプリケーションで最も有名な MVC というデザインパターンに習って、App\Models というフォルダを作って、その中にクラスを作っていくことをおすすめします。

クラスの数が少なければそのままでもいいですし、数が増えてきたら自然ともっと細かい分類がしたくなると思います。
そのときに、データベースを操作するクラスと外部 API を実行するクラスに分けてみたり、データを操作するクラスとデータ自体を扱うクラスに分けてみたりといった、他の色んなデザインパターンを学ぶと、すんなりと入ってくるのではないかと思います。

投稿2018/07/14 19:41

yuuAn

総合スコア44

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

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

hirolog

2018/07/16 15:30

実にわかりやすく、また、何より質問した意図を完全に汲んでのご回答をいただき、とても感激いたしました。 はい、「自由」であるから故に、逆にどこに書くのかが気になってしまっていたのですが、いただいたアドバイスはとても参考になりました。 App\Models以下にしたらどうかというご意見も助かります、Laravelをもっと使い込んでみようという意欲もわきました。 ご丁寧な返答、まことにありがとうございます。
guest

0

外部のAPIを読んで値を取得してデータベースに格納する

上記だけでも2つ以上の処理が連なっているので「共通化」と言えるかどうかですね。
「外部のAPIを読んで値を取得」と「データベースに格納」はわけられると思います。

それぞれ別の部品として切り出してコントローラ外に出してどのコントローラからも参照できるようにしておいては?
そうすることで適宜使いたい箇所でそれぞれを取り出せばいいだけになります。
もっと言えば「外部のAPIを読んで値を取得」についても「外部のAPIが複数ある可能性」も加味すると
引数でAPIの情報(URLとか、直が嫌であれば設定ファイルに置いた番号とか)で切り替えることで利用できますし、
「データベースに格納」とかはまさにテーブル毎に準備できそうですし。

いずれにしてもあまり機能に依存しすぎる作りは避けるような形で考えます。

投稿2018/07/11 12:45

m.ts10806

総合スコア80850

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

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

hirolog

2018/07/11 12:51

ご回答ありがとうございますm(_ _)m 処理内容に関しては、何か例が無いとイメージわかないかなと思ったので、今回はあまり気にしないでください。 「別の部品として切り出してコントローラ外に出してどのコントローラからも参照できるようにする」 がまさにお聞きしたいことです! 具体的にどのフォルダにどのように切り出すのが Laravel流 なのかを知りたいと思っています。 どこでも好き勝手に置いて動くようにはできますが、Laravelの思想があるような気がしており、それがもしあるなら、どこにファイルを置くのだろう、と。
m.ts10806

2018/07/11 12:55

Laravelの思想はどうか分かりません。そもそも結構自由なフォルダ構成が実現できるようになっているはずなので。 「どこでも好き勝手に置いて動くようにできる」となっているということは、そういうことです。自由です。 ルールは自身で作るもの(開発現場で決まりがあればそれに従うもの)と思います。 共通処理としてそれ用のネームスペース区切ってやってはいかがでしょうか。
hirolog

2018/07/12 01:31

ご意見まことにありがとうございます、参考にいたします。 <引き続き、どなたか> 思想というのか、流儀というのかわからないのですが、 Laravelを使っている方なら、こうした処理をどこに書くのかをお聞きできないかなと思っているので、引き続き、 「Laravelでこうした処理は、ここに書くのが良いのでは?」 といったご意見いただけると助かります。
guest

0

自己解決

解決というわけではないのですが、当面は以下のようにすることにしました。

なるべく artisanコマンド を使う
(好き勝手に追加するよりは、Laravelの流儀に沿うかなと)

今回のケースだと、make:modelでモデル追加。

また根本的な理解をするために、海外のサイトやソースコードを見てフレームワークそのものをもう少し勉強します。

ご回答いただいた方、まことにありがとうございます。

投稿2018/07/14 03:18

hirolog

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問