開発日記:Laravel

2024-06-26 20:15:06 #Laravel

アクセスログ

先週、昔作ったサイトを色々見てて、アクセスログページを見つけた。

WordPressにした頃かその前やったか、世の中がGoogle Analyticsばっかになって、どんなもんやろかと使ってみるまでは、その都度で自作してた。
そのうちGoogle Analiticsは色々要らん情報まで取られるようになって、EUの法規制が厳しくなり始めた頃に自作のサイトから排除した。

その後特に必要ないまま、自作することもなかったが、今回サイトを新しくしてからお問い合わせにスパムがそこそこ来るw。レンサバの管理画面でアクセスログをチェックしよかと見たら、集計画面が無くなって、ログテキストのダウンロード(しかも日別)だけになってた。おいー。
うーん、取りあえず動向チェックして自動でスパム振り分け機能とか入れたいなあ、と思いつつ、そこまでモチベが無く進んでなかった。

という経緯があって、あーこれでええか、と実装決定。

見つけたアクセスログは2005年頃に書いたやつで、当時は当然スクラッチで、対象ページでaccess_log()とかいちいち書いてた。Laravelならファサードか、と思ったが、ルーティングあるし一括でフックする方法があるやろと調べたら、Middlewareとやらでやるらしい。
処理したいクラスを書いたらapp/Http/Kernel.php$middlewareに追加するか、名前を付けてルートで指定するだけ。おー、分かりやすい。

前のテーブルそのまんまでマイグレーション書いて、Middleware書いて、常に記録するんでKernel.phpの$middlewareに追加したら動いた!お手軽!
Laravelて、IPとかuser agent(header)とかも$requestに入ってんのなあ。

そうしてアクセスログの集計ページも、前に使ってたクエリそのまんまをクエリビルダに書き換えて作成。
fromをサブクエリで書く方法がクエリビルダのマニュアルに見つからず「あれ?無いんか?」と思ったら、ググったらLaravelのソース調べて見つけたって記事があった。助かる。

前の集計グラフは太古の技術で1ピクセル画像を広げてたりして、全てが前世代HTML+CSSやったんで、当然の全書き換え。bootstrapでどう並べるんや?と手間取りながら何とかまとめる。

動作確認してたら自分のアクセス毎にカウントアップするのがやっぱ気になる。
元のはログにユーザIDを入れて集計時に除外してたけど、Middlewareの処理でログイン情報取得出来んかったんで放置してたんやった。
改めて調べると、$next()でそのページの処理をやってて、$next()の前で事前処理するか、後で事後処理するかということ。なら事後処理ならログイン情報も取れてるか?と改修したら取れてた。

そうしてアクセスログが設置完了。テストして本番適用。

なんか毎日結構な量のハックなアクセスあんなあ。(;´Д`)
あんま変なとこばっか覗いてたら痛い目に遭わせたくなるやでw。


2024-06-24 13:13:24 #Laravel

LaravelでWebサイトを作ろう2

*このサイトの開発記録です。

テンプレートのトップにあるキャラクタを変更。
そういやAffinityにしてからイラスト的なの描いたこと無かったなあ。まあ元絵がプリミティブな図形の組み合わせっぽいんで、それに合わせて簡単に描く。

元絵の雰囲気が出んなあw。まあいいや。

さていよいよCMS機能の実装。認証処理のlaravel/uiと合わせたCRUDをチュートリアルで再確認(後にlaravel/uiはLarave 6時代の遺物と知って、Breezeを使う事になる。実装周りがコンパチブルでよかった)。チュートリアルって書いてるまんまをトレースするだけなんで、何回やってもあんま頭に残らんのよなあ。

とりあえず実装予定の「お知らせ」「ポートフォリオ」「お問い合わせ」のデータベースの各テーブルを設計。といってもお知らせはテキスト1行、ポートフォリオはタイトルとアイコン画像と説明文、お問い合わせはタイトルとメールアドレスと本文と返信文と、今のところリレーションも無くシンプル構成。これにID、登録日時、更新日時、公開フラグを付けてとりま完成。

artisanコマンドでマイグレーションを作成して、テーブル設定を書いてマイグレート。グループ開発はこれが非常に便利やが、個人ではただ面倒くさいだけやなw。まあスキル習得目的もあるんできっちりやろう。

Laravelのセキュリティ面の運用周りをまだよく把握してないんで、サーバはartisanコマンド周辺は入れてない。なのでマイグレートできないんで、ローカルDBからのクエリダンプで作成。
後にマイグレートに--pretendオプションを付けることでクエリ吐き出しが出来ると知ってからは、先ずはオプションの実行でクエリ取得するフローにした。

当初は管理画面は別ページで作ろうと考えてたが、ログイン周りは色々と制御しやすそうなのと、コスパが良さ気で面白そうという理由で、今回は公開ページそのまんまで、ログイン時に管理画面化する事にした。
デザインやレイアウトの変更時の面倒くささもあるんで、将来的には別画面にするかもしれない。

さて、先ずはテンプレートにどっかとあるメールフォームの実装。フォームの入力を受け取って、バリデーション、DB登録、メール送信。メールは自分への通知メールと、併せてメールアドレスの入力があった場合に「お問い合わせを受け付けました」メールを送信しようと思ってたが、今時は何に使われるか分からんので、自分への通知メールだけにした。

メール送信のLaravel的実装作法も知れればと、当時試してたwrtn.jpで「Laravelでのメール送信方法を解説して」と聞いて、回答に倣ってメールサーバの設定とコードの実装。
まあAIなんで、メールサーバ設定周りの細々したとこやテンプレートの書き方、メール送信の取り回し等々の微妙にあちこち間違えてたり足らんかったりで、それら細々を調べて補完しながらなんとか設える。この頃はまだLaravel理解の理解度が低くていちいちが面倒くさい。
どーやってもメールサーバにつながらんかったのが、キャッシュクリアしたらすんなりつながったりしながら実装完了。

面倒くさそうなメール実装を抜けたんで、いよいよ各コンテンツのCRUD実装。
ここまでLaravelはBladeとBootstrapが標準、と思ってたが、Laravel 8でBootstrapからTailwindに変更されてる事を知る。まあそれでもBootstrapはまだスタンダードっぽいし、何より今回使ったテンプレートがCDNでBootstrapを使ってるんで、今後もBootstrapの使用で続行。
BladeとBootstrapを調べながら、各コンテンツの組み付けを進める。

bladeまとめのメモ

この頃Laravel自体についても色々調べてて、2017年辺りでPHP FWのトレンドがCakePHPからLaravelに移った事を知った。VR始めたタイミングに入れ替わりしてたとかなあ。(;´Д`)
そしてここまではサイトに残ってたLaravel 6を使ってたが、(当時の)現状はバージョン10と知った。おぉ。これはせめて8にはしとかなあかんやろと、新たにLaravel 8をセットアップ。そしてBreezeを導入。ここまで作ったテンプレートやメール送信周りを移植。

そして今回の目的のひとつ、サイト更新にGit導入。
使ってるレンタルサーバはだいぶ前にGitレディになってたが、WordPressにしたり、他の自作Webアプリも長く放置状態で、設定も面倒くさいし特に必要性が無いままで使ってなかった。
今回は、今後の色々な拡張性も考えて、テストサイトと本番サイトの運用と、サイトにGit pullを組み込んでの、開発環境(エディタ内Git操作)とブラウザでのGit pullで、サイト更新を完結しよう、という目論見。

今まで作ったサイトもローカルでは既にGitで管理してて、たんびたんびで機能拡張や改修をしてきてたが、サイト更新はSSHだったんで、時間が開くほど更新確認が面倒になってw、結果ローカル環境はどんどんバージョンが進んでるが、サーバ上は昔のまんま、という状況がここ数年続いて、差分がエグいことになってたりしたw。

せっかくの今回のサイトリニューアルも、サーバ側Gitを導入しとかんと面倒くさいサイトがまたひとつ増えるだけになりかねないという懸念w。しかし設計から設定、設置まで全部自分でやらんとならんのでイニシャルが面倒くさ過ぎんよなあw。
そして面倒の甲斐あって、サーバ側Git設置の効果は非常に成功。機能拡張や改修から更新が実にスムースで、Gitの便利さを再認識した。

実は最初の更新で、ローカルMAMPはPHP8がやったが、サーバはPHP7.6やったという事実を認識。(;´Д`)
サーバに上げてもエラーで動かずで「なんでや?」ってなった。ガチガチのバージョン縛りなんやなあ。artisan周りを入れてなかったんで、そこら辺かと思ったりして原因究明を手間取らせた。(;´Д`)
そしてローカルLaravelをPHP7.6ベースにしてインストールし直して、ここまでの機能を移植。サーバ側も8にした時用にブランチを残しつつ、新たに7.6用にブランチ切り直すというちょーめんどくさい行程が入った。ホンマ勘弁。(;´Д`)
何がめんどいって、ローカル環境でパス無しで実行するPHPがMAMPで無いバージョン8なんで、artisanとか実行する時はMAMPまでのパス付きのPHPを実行せんならんという。ホンマ面倒くさい。


2024-05-15 16:18:44 #Laravel

LaravelでWebサイトを作ろう

*このサイトの開発記録です。

2023年にUnityでWebGLで色々とやり始めて、コンテンツをアップする環境作りたいなあと考えてた。WordPress使いたくなくてwサイトも長く放置してるし、Laravelの収得もせなあかんよなあと思ったりで、2024年になって「Laravelでサイトをリニューアルしよう計画」を発動。

先ずはLaravelの最低限の概要を収得。
2021年頃にチュートリアルとかをやってた資料が残ってたが、ほとんど記憶に無いw。資料を読み返しつつ、ディレクトリ構成やルーティング、ViewとBladeという基本構成を再履修。

その時にインストールしたと思われるLaravelの残骸がローカルにいくつか残ってたんで、これを使ってWebページを表示してみよう。
*動かんかったりしてたが、トラブル時演習としてエラーメッセージから生成AI使ってライブラリのアップデートとかして復旧。

WPにする以前のサイトはフロントもHTMLとCSSの演習として作ってたが、まあデザインセンスが無いんでw、今回はネットからデザインテンプレートをチョイスしてさっくりと組み付けたい。
色々と見て回り、Free Bootstrap Themes & Templates - Start Bootstrapから、Freelancer - One Page Theme - Start Bootstrapをチョイス。ポップ感が良き。

LaravelはBladeというテンプレートエンジンが標準装備され、専用タグを使ってテンプレートに各コンテンツViewを差し込んで表示する事で、デザインとロジックを分離できる。
今のところはトップページだけなんで、何ならそのまんま組み付けてとっとと公開してもいいけど、テンプレート化することで、他のページへのでザジン適用が容易になり、今後デザインやレイアウトを変更する場合にお手軽になる。

ということで、テンプレート化していこう。
ダウンロードしたデザインテンプレートのファイル名「index.html」を「index.blade.php」に変更して、/resources/views/layouts/にコピー。

  • index.blade.phpの内容を編集する。
    • <title>~</title><title>{{ config('app.name', 'Laravel') }}</title> にすると、.envAPP_NAMEの値が入る。@yield('title')にして、Viewで@section('title', '[タイトル]')として置き換えてもいい。
    • コンテンツを表示したい箇所に@yield('[セクション名]')を書く。Viewの@section('[セクション名]')〜@endsectionの内容が表示される。
    • その他、とりあえず不要な部分は{{-- ~ --}}で挟んでコメントアウトしていく。
  • 画像素材は/public以下にそのままコピー。
    • テンプレート内の画像参照のリンクを href="{{ asset('[public以下の画像ファイルパス]') }}" に修正する。
  • css、js等のファイルをpublic/csspublic/jsにそのままコピーする。
    • css内の参照リンクを asset('[public以下の画像ファイルパス]') に修正する。
  • テンプレートを利用するViewを、 resource/viewindex.blade.phpで作成
    • テンプレートの指定「@extends('layouts.index')」(パスは「/」を「.(ドット)」、「.blade.php」は省いて記述)と、@section('')@endsectionの間に、テンプレートに表示するコンテンツを書く。

コンテンツはデザインに合わせて「お知らせ」と「ポートフォリオ」を置く予定。「ポートフォリオ」の内容が込み入ってるんで、どう組み付けるかを検討しつつ、とりあえずは表示テストとしてcontentセクションをひとつだけ置く。

シンプルにテンプレート設定とcontentセクションのみの構成のテスト用のViewを/viewsの直下に「index.blade.php」で書く。

/views/index.blade.php

@extends('layouts.index')
@section('content')
  テストです。
@endsection

これを表示するルートを設定する。ルートはURLに対する表示対象の設定で、/routes/web.phpに書く。
コントローラは今のところ無いんで、ルート('/')のリクエストに、上の「index」View(index.blade.php)を返すよう設定。

/routes/web.php

Route::get('/', function () {
    return view('index');
});

これで、ブラウザからLaravelのルートにアクセスすると、テンプレートが表示される(はず)。

LaravelはWebサーバ機能を持っていて、コンソールから$ php artisan serveとするとブラウザからアクセスできる。
今はローカル環境のMAMPに入ってたLaravelを使ってるんで、ブラウザから設置のLaravelパスのpublicにアクセスすると、無事テンプレートが表示された。やったー。

取りあえずテンプレート表示まで完了。ここから別件やり始めてしばしLaravelから離れた。