プログラミングは面白い

プログラミングの事を中心に色々書いていきます

共通処理を普通に関数でまとめた

さて、昨日記事にした内容なのですが、とりあえず関数でまとめました。

修正前の月別アーカイブとコントローラーはこんな感じでした。

// namespaceとかは省略。ファンクションから

    public function index() {
        $posts = Post::latest()->get();

        // 最新記事5件
        $five = Post::latest()->take(5)->get();

        // 月別アーカイブ処理
        $posts = Post::all();
        $monthList = [];
        foreach($posts as $post) {
            $monthList[] = $post->created_at->format("Y-m");
        }
        $countArray = array_count_values($monthList);
       

        return view("posts.index", compact("posts", "five", "countArray"));
    }

    public function show($post) {
        $post = Post::find($post);

        // 最新記事5件
        $five = Post::latest()->take(5)->get();

        // 月別アーカイブ処理
        $posts = Post::all();
        $monthList = [];
        foreach($posts as $post) {
            $monthList[] = $post->created_at->format("Y-m");
        }
        $countArray = array_count_values($monthList);
        

        return view("posts.show", compact("post", "five", "countArray"));
    }

月別アーカイブの処理をindexアクションとshowアクションで同じ記述をしています。
これを一つにまとめたい。まとめて簡単にオンオフみたいなので処理を流したい。
そんな機能はないだろうか?と思って探してみたのですが、ありませんでした。

なので普通にそれ用の関数作って呼び出す事にしました。

    private function archive() {
        // 月別アーカイブ処理
        $posts = Post::all();
        $monthList = [];
        foreach($posts as $post) {
            $monthList[] = $post->created_at->format("Y-m");
        }
        $countArray = array_count_values($monthList);

        return $countArray;
    }

    public function index() {
        $posts = Post::latest()->get();

        // 最新記事5件
        $five = Post::latest()->take(5)->get();

        // 月別アーカイブ呼び出し
       $archive = $this->archive();

        return view("posts.index", compact("posts", "five", "archive"));
    }

    public function show($post) {
        $post = Post::find($post);

        // 最新記事5件
        $five = Post::latest()->take(5)->get();

        // 月別アーカイブ呼び出し
        $archive = $this->archive();

        return view("posts.show", compact("post", "five", "archive"));
    }

viewに渡す変数名が最初と変わってるので読みづらいかもしれません。
変数名つけるのほんと苦手...
とまぁこんな感じで一応スッキリはしたのですが、それでもやっぱり同じ処理をアクション毎に書くのってスマートじゃない気がするんだけど、これはしょうがないのかな?
最新5件表示の処理に関してもやっぱりその都度書かないとならないし。

railsのbefore_actionって処理を作ったらその処理をどのアクションで適用するか設定出来た気がするんだけど、記憶違いかな?
そんな機能があったらもっとスッキリするんだけどなぁ。
まぁこの辺は今後のブラッシュアップの課題としますか。

さて、残る機能はログイン、編集、削除、ページネーションですか。
Laravelはどうしても調べる時間が長くなっちゃって中々進まないなー。

あ、そう言えば月別アーカイブ作ってる時に出会っためっちゃ便利な関数array_count_valuesを今度紹介しよう。そうしよう。