Closed7

【自分用備忘録】LaravelとVue.jsで作成したコードの追い方

おおくぼおおくぼ

はじめに

新しく案件ジョインされ、そこがLaravelとVue.jsを使用したWeb開発だったため
勉強&忘れたときに見返す用に作成。

おおくぼおおくぼ

補足

⚠️ あくまでもフロントエンドを書く者としての視点です

⚠️ 自分がジョインした案件のコードを読むためのものです
前提条件とか知識とか飛ばしているものも多いです

おおくぼおおくぼ

まずは画面とコードから

画面を見てもそのコードがどこにあるか分からんと遊んでみることもできない...
ということでURL(画面)とコードの関係性を明らかにしてみる。

ChatGPTくんによると

一般的に、LaravelとVue.jsで構成されたWebサイトのコードディレクトリ構成を教えてください。

という質問に対して

LaravelとVue.jsを組み合わせたWebサイトの場合、一般的なコードディレクトリ構成は以下のようになります。

- app/
  - Http/
    - Controllers/
    - Models/
  - Providers/
- resources/
  - js/
    - components/
    - views/
- routes/
- database/
- public/

と教えてくれたので名前的に routes/ 配下に記載があると予測、
実際入ってみたらそれっぽいコードが書いてあった。

routes/web.php
// ホーム画面に遷移したときはこんな感じ
Route::get('/', 'HomeController@index');

// ログインするときはこんな感じ
Route::post('/login', 'Auth\LoginController@login');

// どっかで参照できるnameなるものも付けられるらしい
Route::post('/login', 'Auth\LoginController@login')->name('login');

// middlewareなるものを使うときはこういう書き方をするっぽい
Route::middleware('middleware')->group(function () {
    Route::get('/', 'HomeController@index');
});

後はLaravelで書いてあるのControllerをみてビューを特定し、そこの.vueファイルとかでうじゃうじゃやってみるという計画で進めます。

不明点

ジョインした案件では routes/ 配下に記載がないところもあったので
他で制御している部分もあるかも...??

おおくぼおおくぼ

Controllerを見てみる

さっきのホーム画面を例に。

routes/web.php
Route::get('/', 'HomeController@index');

と記載があったので app/Http/Controllers/HomeController.php を確認して index() を見てみる。

app/Http/Controllers/HomeController.php
public function index()
{
    return view('home.index');
}

ということでここでビューを呼んでいるんだろうなと推測できました。

変数を渡したいときは↓みたいな書き方をしてビューを呼ぶときに一緒に定義してあげる

app/Http/Controllers/HomeController.php
public function index()
{
   $variable = 'こんな感じで変数を入れてあげる';
    return view('home.index')
        ->with([
            'variable'=> $variable
        ]);
}
おおくぼおおくぼ

viewsを見てみる

ここでvueファイルにありつけると思ったらそんなことなかった。
どうやらLaravelには Blade というものがあるらしく、まずはそこを確認する。

BladeについてChatGPTに聞いてみた

Bladeは、Laravelフレームワークに組み込まれているテンプレートエンジンです。テンプレートエンジンは、HTMLコードの中に動的なデータを埋め込むための仕組みを提供します。

Bladeテンプレートエンジンは、直感的で簡潔なシンタックスを持っており、可読性や保守性の高いテンプレートを作成することができます。例えば、ループや条件分岐などの制御構造を含むテンプレートを簡単に記述することができます。

Bladeテンプレートは、.blade.phpという拡張子のファイルとして保存されます。これらのファイル内では、通常のHTMLコードに加えて、Blade独自の指示や構文を使用することができます。例えば、{{ $variable }}のような形式で変数の値を表示したり、@if@forなどのディレクティブを使用して条件分岐やループ処理を行ったりすることができます。

Bladeはパワフルなテンプレートエンジンであり、コードの再利用性やメンテナンス性を向上させるための便利な機能を提供します。また、ビューのレンダリングやコンポーネントの再利用に最適です。Laravelフレームワークでは、Bladeテンプレートエンジンがデフォルトで使用されており、Laravelの文法と互換性があります。

resources/views/home/index.blade.php
@extends('layouts.layout')

@section('head')
@endsection

@section('title') ホーム画面 @endsection

@section('content')
    <div class="home-container">
        <home-title :title="Hello, World"></home-title>
    </div>
@endsection

見た所感としてはページのレイアウトを記載する場所という印象。
同時に、 extends という英語から共通レイアウトを :resources/views/layouts/ layout.blade.php で作成されているなということを予測。

そして home-title は新規のHTMLタグではなくvueで作成したコンポーネントだろうということも予測。

だいぶ雰囲気が掴めてきたなという気持ちになってきました。

おおくぼおおくぼ

components/たち

先ほど予測した home-title コンポーネントは resources/components/HomeTitle.vue にあり、そこでHTMLなりCSSファイルに書いていないスタイルや挙動なりが記載されている。

というわけで、後はこの conponents/ たちを見て色々やってみればOK!

とは思ったものの、1つ疑問点が残っていました。
bladeから使用しているコンポーネントはどこで指定しているんだ...??

おおくぼおおくぼ

JavaScriptの皆様

ここまででコンポーネントを指定する件がなかったなと思ったらJavaScriptのファイルが活躍してくれていた。

resources/js/app.js にパスに対応するコンポーネントを呼んでいる処理がありそうだったので見てみる。

resources/js/app.js
page('/', () => {
  import(/* webpackChunkName: "home" */ './Home').then(
    ({ Home }) => {
      return new Home();
    },
  );
});

routes/web.php で定義したパスに対して必要な処理があればここで記載してあげるってイメージ。

なので resources/js/home.js に行ってみると↓があったので詳細なHTML構成とかは.vueファイル見れば分かりそう!

resources/js/home.js
import Vue from 'vue';
import HomeTitleComponent from '../components/HomeTitle.vue';

class Home {
  constructor() {
    const app = new Vue({
      el: '#app',
      components: {
        'home-title': HomeTitleComponent,
      },
    });
    app.$mount('#app');
  }
}

export { Home, Vue };

でひとまず追えたかなと!
詳細なコードはまだまだ勉強しつつ他のスクラップとか記事とかにまとめます

このスクラップは6ヶ月前にクローズされました