アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

Laravel触ってみた

環境はざっくり↓こんなん
Windows×XAMPP(ApacheMySQL/MariaDB×PHP

自分のスキルの前提としては

  • 本職はWindowsServer×Apache×SQLServer×PHP(CodeIgniter)
  • DBについてはMySQLの方が経験長い
  • FWはZendベースの自社FWの経験が長かった
  • Cake、Fuelあたりも経験あり、あまり好きじゃないタイプだった
  • Laravelも一瞬触ったがなんか肌に合わず挫折した経験あり、実質未知の世界

という感じ。

CodeIgniter個人的にはわかりやすくて超好きなんですが
Laravelが人気なのは知ってるしユーザーが多いことのメリットもわかってるつもりだし、
なにより挫折したままなのは気に食わないので、やる。

他FWに比べると処理速度が懸念点といえばそうだけど、
まあ別に大量の細かいアクセスを捌く系のシステムでないならひとまずは気にしなくていいレベルかなとは思ってる。
Phalconも好きだよ。速いしかっこいいし。

自分用の覚書?作業記録?みたいな記事なので、知ってることに関してはそんなに書かない。
あと、触って覚えるタイプの人間なので、まず調べず触るところからやってる部分もある。
ということでもしこれを参考にしようとしている人がいたら、あてにしすぎないでください。
あとめんどくさいのでスクショで済ませてる部分が多く、コピペにも向かないです。

はいスタート。

準備

  • 以下をインストールする
    • XAMPP
    • Composer
    • Laravel
  • 諸々調整して、Laravelのスタートページが出てくる状態にする

やり方は自分の過去記事を参考にしつつ。
複数プロジェクトの開発環境構築 - アナログCPU:5108843109
Windows×nginx×PHP8×Laravel ローカル環境構築してみる - アナログCPU:5108843109

まあここは本題じゃないのでどうでもいい。

ディレクトリ構造を把握する

マジで何もかもわからないところからスタートなんで、まずはデフォルトのディレクトリ構造についてググる

  • app
    • だいたいのコードはここに書くらしい
  • bootstrap
    • 初期化用の諸々 autoloadとか
  • config
    • 名前のとおり、設定ファイルとか置く
  • database
    • 名前のとおりDB関連の諸々を置く…っぽいがいまいち分かっていない .envに接続設定書く(※後述)だけじゃアカンのか?
  • lang
    • 言語情報用。多言語対応サイトでもないと使う必要がない気はする
  • public
    • 公開ディレクト
    • 最初に実行されるindex.phpとか、画像とかCSSとかJSとかはここ
  • resources
  • routes
    • ルーティング用の設定を置くところっぽい。
  • storage
    • キャッシュファイルなどがここに入るらしい。あとは「ユーザーがアップロードしたファイル」なんかもここっぽい。
  • tests
    • テストコードを置くところ。本番環境には置かないディレクトリってこと?
  • vendor
    • Composerの依存内容を置くらしい。Composerについてもよくわかってないので未知すぎる
    • 本番環境には置かなくていいのかなと思ったけど、autoload.phpがここにあったので必要だった。

Laravelのスタートページを移動させる

Laravelの新規プロジェクトを作った直後がこの状態。

f:id:honey8823:20220210215521p:plain

バージョン9なんだ~、と何気なく調べたらかなり直近のリリースだったのか。
(これ書いてるのが2022/02/10、リリースが2022/02/08っぽい)
Laravel 9 Upgrade Memo

まあそれはともかくとして。
これはなんかの実装サンプルになるかもしれないけどここに居座られても困るので、ちょっと別の場所に移動してもらおうと思います。
どうやって表示してんのかな? と public/index.phpから順に追う…のは面倒そうだったので、
逆にviewレベルから見てみることに。
試しにこの英文の一部でgrepかけてみると、viewファイルらしきもの見つかりました。
resources\views\welcome.blade.php
あと、
storage\framework\views\0e9b7b4…74ed85a.php
みたいなファイルも見つかりました。
どうやら、controllerやview的な諸々からコンパイルしたもの?というかキャッシュファイル的なもの?をstorageに置いてるっぽいですね。

それはともかくviewファイルですが、
軽く調べたところ、LaravelにはデフォルトでBladeというテンプレートエンジンが乗っかっていて、それで書かれてますね。
f:id:honey8823:20220210220652p:plain:w400
おお~~わかりやすい。ある程度はこれ真似するだけでも書けそうじゃん。

で、このviewを呼んでるのはどこかな?ということで「welcome」でgrepかけてみると、
routes\web.php
内にありました。ルーティングですね。

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

ほ~。
じゃあこのwelcomeページは別URLによけておこう。

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

はいオッケー。わかりやすいじゃん。
これで、「/」だと404になり、「/sample」で先ほどのページが表示されるようになりました。

けどちょっと思ってたのと違ったというか。
知りたかったのは「特定のController呼び出して、処理の結果をviewに渡す」みたいな部分だったというか…。
ルーティングで直接view返すの⁉っていうのが衝撃でした。
普段使ってるCodeIgniterだと、必ずController経由することになるので。

で、そのへんのサンプルはないみたいなので、ぐぐってきました。
Laravelのルーティングの書き方を10分でサクッと学ぶ | Web Apps Labo
Laravelのルーティング(Routing)のまとめ! | codelikeなブログ
Laravel8でのルーティングで、コントローラーの指定の仕方4選 - Qiita

いや~待って ちょっとおっさん一気に覚えらんない 書き方のクセがでかい
ひとまずは

  • web.phpapi.php の2種類がある
    • 画面で動かすやつはweb.php
    • SPAな実装する場合とか、外部から叩いてもらうようなAPIの場合はapi.php
  • viewや値などを直接返す方法と、Controllerを呼び出す方法がある
  • Laravel7以前と8以降で書き方違うので注意

…という感じですね。

で、今回使ってるLaravelは9なので新しい書き方でいく必要があり、
先にルーティングするの難易度高そうなので、まずControllerを実際に作ってみます。

Controllerを作ってみる


…いや、どこにどう作るんだコレ?

またぐぐった結果、
コマンドプロンプト

cd プロジェクトのディレクトphp artisan  make:controller HogeController

を実行
だそうです。
えっコントローラ作るのに毎回コマンド打つ…んですか…? ほんとに?

f:id:honey8823:20220210230034p:plain
f:id:honey8823:20220210230106p:plain
ほんとにできた。

お試しでHelloWorldするだけのメソッドを設置。
f:id:honey8823:20220210231347p:plain

で、ルーティングに戻ります。
app\Http\Controllers\IndexController.php の index()なので、

Route::get('/', 'App\Http\Controllers\IndexController@index');

をweb.phpに追記してみました。

f:id:honey8823:20220210231837p:plain
成功です。

Controllerからviewに値を渡して表示してもらう

じゃあ次はControllerでいろいろごにょごにょ処理して、それをviewに渡し、表示してもらうやつ。
といってもこれはさほど難しくはなさそう。
Laravel controllerからViewへ値(変数)を渡す

↓Controller
f:id:honey8823:20220210233805p:plain

↓View(新しく作った)
f:id:honey8823:20220210233829p:plain

↓結果
f:id:honey8823:20220210233856p:plain

HTMLタグのエスケープ勝手にやってくれるの優秀ですね…しかもやりすぎてもない(inputタグの中とか)。

DBにアクセスし、テーブルの中身を取ってきて表示する

まずテーブル作って適当にデータ入れておきます。詳しくは省略。

Laravel側は、まず接続設定。
.envの中の↓を調整します。
f:id:honey8823:20220210235053p:plain
今回はローカル環境ということでテーブル名だけ変更して終わり。

次、Controllerの中でSELECTしてくる処理を書きます。
f:id:honey8823:20220210235619p:plain

最後、それをViewでもにょもにょします。
f:id:honey8823:20220210235641p:plain

いや~そんな
こんな少ないわけないし、ぐぐりながら10分で書いたやつが一発で動くわけないじゃ~ん
f:id:honey8823:20220210235744p:plain

動いた!?
動きました。ここまでできれば勝ったも同然ですね。

とりあえずここまで

あとは細かいところぐぐりながらいけばなんとかなりそうってレベルな気がします。
昔速攻で挫折したのどこだろう。ルーティングかな。