Symfony+React Ver.2

10月中旬に会社の健康診断がありました。

久しぶりの健康診断で恐る恐る体重計に乗ったのですが、新卒のときと比べて5,6キロ増加しておりました(涙)

デスクワークということもあるので本気で運動をしないとまずいなと感じた秋の始まりでした。

それでは今回は前回の続きということでSymphonyとReactの連携について備忘録を残していこうと思います。

バンドルのインストール

StimulusBundleのインストール

SymphonyとReactを使用するためにSymfony UX React Bundleが必要です。

そのためにStimulusBundleが必要なため、下記コマンドでインストールします。

composer require symfony/stimulus-bundle

Webpack Encore bundleのインストール

Reactのファイルをコンパイルするための機能を追加する必要があります。

Symfony UX React Bundleではドキュメントを確認すると、「This package works best with WebpackEncore」

と記載があるのでWebpackEncoreのバンドルを使用します。

ただ初期ではAssetMapperという別のバンドルが搭載されているので切り替え作業をしていきます。

AssetMapperの削除

下記コマンドにてAssetMapperを削除します。

composer remove symfony/ux-turbo symfony/asset-mapper

WebpackEncoreの追加

下記コマンドでWebpackEncoreを追加します。

composer require symfony/webpack-encore-bundle symfony/ux-turbo

依存関係リフレッシュ

下記コマンドにて依存関係をリフレシュし、WebpackEncoreに合わせる。

// npmの場合
npm install --force

// yarnの場合
yarn install --force

Symfony UX React Bundleのインストール

下記コマンドでバンドルインストールします。

composer require symfony/ux-react

React用のパッケージインストール

下記パッケージをインストールしていきます。

// npmの場合
npm install -D @babel/preset-react --force 

// yarnの場合
yarn add @babel/preset-react --dev --force

これで準備は整いました!

プロジェクトのassetsディレクトリにapp.jsがあるので、このファイルを元に

/assets/react/controllersの中身コンパイルしてSymphonyのテンプレートに組み込んでいきます。

Reactのファイルのコンパイル

下記スクリプトでファイルをコンパイルします。

// npmの場合
npm run watch

// yarnの場合
yarn encore dev --watch

Symphonyのテンプレートに埋め込む

下記のようにテンプレートに埋め込み、Symphonyのコントローラーでテンプレートをrenderすると無事表示されました(涙)

{# レンダリングするテンプレートは別途用意する必要があります。#}
{# templates/home.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <div {{ react_component('Hello(表示したいファイル名)', { fullName(プロパティ): 'Fabien' }) }}>
        Loading... <i class="fas fa-cog fa-spin fa-3x"></i>
    </div>

    {# Component living in a subdirectory: "assets/react/controllers/Admin/OtherComponent" #}
    <div {{ react_component('Admin/OtherComponent') }}></div>
{% endblock %}

終わりに

少し長くなりましたが、自分は上記で実装することができました。

Symphony自体触れることが少なく、実装までに時間がかかってしまいました。

ドキュメントも英語ばかりなので気力が必要そうです・・・

それではこのあたりで失礼いたします👋