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

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

ただいまの
回答率

90.52%

  • Laravel 5

    1879questions

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

  • Laravel

    665questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 378

hirolog

score 22

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等 の追加はよく行っていますが、共通処理の切り出しで使えるコマンドがある、とかでも。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 00:30

    実にわかりやすく、また、何より質問した意図を完全に汲んでのご回答をいただき、とても感激いたしました。

    はい、「自由」であるから故に、逆にどこに書くのかが気になってしまっていたのですが、いただいたアドバイスはとても参考になりました。
    App\Models以下にしたらどうかというご意見も助かります、Laravelをもっと使い込んでみようという意欲もわきました。

    ご丁寧な返答、まことにありがとうございます。

    キャンセル

check解決した方法

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/11 21:51

    ご回答ありがとうございますm(_ _)m

    処理内容に関しては、何か例が無いとイメージわかないかなと思ったので、今回はあまり気にしないでください。

    「別の部品として切り出してコントローラ外に出してどのコントローラからも参照できるようにする」

    がまさにお聞きしたいことです!

    具体的にどのフォルダにどのように切り出すのが Laravel流 なのかを知りたいと思っています。
    どこでも好き勝手に置いて動くようにはできますが、Laravelの思想があるような気がしており、それがもしあるなら、どこにファイルを置くのだろう、と。

    キャンセル

  • 2018/07/11 21:55

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

    キャンセル

  • 2018/07/12 10:31

    ご意見まことにありがとうございます、参考にいたします。

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

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Laravel 5

    1879questions

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

  • Laravel

    665questions

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