おっしゃほぼ完成した!
相変わらずコメント機能がなかったり、一部リンクを実装してなかったりはしますが概ね完成でしょう。
認証機能がどうなるか心配だったけど、割と簡単に出来て良かった。
もちろんめっちゃ調べたけど。
コーディング2割、調べてる時間8割くらいある気がする。
さて、これからデプロイという山を登らないといけないと思うとそれだけで心折れそうだけど頑張ろう...
また心が折れてしまったら...もう立ち直れないかもしれない...
いや、Djangoでもう一回挑戦する手もあるか...
いやいや、何としても今回はやり遂げたい。
webサーバーはApatchでDBは最近割と仲が良いmysqlを使おう。
てか、思ったんだけどプログラマーのポートフォリオってローカル環境で出来てれば良い説ある?なんかgithubとかに公開しておけば良いっぽいんだけど、どうゆう事なの。
私はデプロイして公開する事でポートフォリオになるのかと思ってたんけど。
わざわざLinux覚えるためにVPSまで借りてコマンドだったり初期設定だったり勉強したんだけどなぁ...
無駄にはならないと思うけど、すんごい遠回りした感はある。
次はスクレイピングを使った簡単なサイト作りたい。
デプロイ頑張る。
共通処理を普通に関数でまとめた
さて、昨日記事にした内容なのですが、とりあえず関数でまとめました。
修正前の月別アーカイブとコントローラーはこんな感じでした。
// 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
を今度紹介しよう。そうしよう。
共有処理
ブログを作っているので、ヘッダー、サイドバー、フッターは常に表示されます。
テンプレートを作って共通ページ項目を常に表示させてるわけですが、その中の処理をまとめられなくて困っています。
月別アーカイブも無事できたのですが、indexページで表示させるサイドバーの処理と、
記事単体ページ(show)ページでのサイドバーの処理が内部的に分かれています。
コントローラーでアクション毎に月別アーカイブの処理を書いているのですが、全然スマートじゃない...
ミドルウェア使うと出来るのかなと思い、色々試してみたのですが思った挙動をしません。
ググってるんですけどそれらしきページにも行き着かず。
機能的には問題なく動いてるので良いんですけど、すっごい気になる...
てか、ブログレベルのシステムなら大したことないけど、何かページが膨大に増えていくようなサイトだったらこんなの都度書いてたらとんでもない事になってしまう。
他の機能を実装しつつ、この問題も解決させたいな。
てか、なんかLaravel難しいんだよなー。
まだまだ勉強が足りないんかな。
がんばろ。
昨日少し頑張ってデザインだけは終わった
デザインは前にrailsで作ったやつを流用しようかなと思っていたのですが、
railsのコードが埋め込んであって切り分けるのが逆に面倒だったのと、HTML CSSのおさらいを兼ねてイチから作り直してみました。
とは言え、ベースのデザインは一緒なので完全にイチから作るより楽でした。
しかし、久しぶりにHTML CSSを書いたのでかなり忘れていましたね。
でも調べながらでもちゃんと出来たのでやっぱり今までの勉強は無駄じゃなかったなーと、一安心しました。
さて、デザインの大まかな骨組みは出来たので、あとはLaravel側でMVCを作ってつなぎ込んでいきますか。
月別アーカイブ機能をPHPで作れるか、権限がない人には投稿が出来ないようにするとか制限を掛けられるか、この辺が難所と思われますね。
まぁ多分大丈夫でしょう。
土日で開発終わらせたいなー。
最近はちょっとバタバタしてて
あまり勉強する時間が取れていませんでした。
それでも必ず2時間くらいは何かしらコード書くようにはしています。
何もやらないよりは数百倍いいでしょう。
JavaScriptも少しカジりましたね。
Vue.jsが気になっていますが、あれもこれもフレームワークに手を出しすぎなので今はLaravelに絞ろうと思っています。
お盆は八丈島に旅行に行ってきましたが、めっちゃよかったー。
海を見ながらお勉強するのも悪くなかったです。
島寿司うまし。
さて、もうLaravel自体の勉強はキリなさそうなのでblogを作っていこうと思います。
ちょっと認証と認可の違いが曖昧で、機能ごとに権限を振れるか心配ですが調べながやってくしかないですね。
ミドルウェアもいまいち把握できていません。
railsで言うberfore_actionみたいなのかな?
まだまだ謎多きLaravelですが、もうたぶん何か作りながらの方が覚えられそうです。
まぁどうせ何やってもクソコードになるんでしょうし、作ってからブラッシュアップ出来ればなと思います。
がんばるぞー。
Laravelの勉強が中々進まない
さてさて、前回紹介しました教本を使って勉強していますが、教材には主に2種類あるようです。
私が感じるメリットデメリットも含め書いてみましょう。
1. 機能を一つ一つ切り出して学習していくタイプのもの
メリット
色々な手法に触る事が出来る
やれる事の幅が広がる可能性は高まる
デメリット
必要ない手法まで学習してしまう
覚える項目が多すぎてキリがない
2. 何かを作りながら学習していくタイプのもの
メリット
メソッド等の使い所が理解できる
目標があるので勉強スピードが速い(そう感じるだけかも。何にせよ悪い事ではない)
デメリット
限定的な学習方法なので製作物に沿った手法しか覚えられない
カッチリやろうとすると応用が効かなくなる
ザクっとですが、私が感じるのはこんなところですかね。
現在、私は1のタイプの教本を使って勉強しているのですが、ちょっと合わないようです。
どうやら私は2のタイプで基礎を学んで行く方が性に合っているみたいですね。
1のタイプは辞書的な使い方をした方がいいのかな?
まだLaravelを理解していないけど、今ある知識でブログ作ってみようかなー。
割と今なら調べながら出来ちゃいそうな気もする。
てことで、ボチボチ開発着手。