この記事について
Udemyの動画講義,"Symfony 6 Framework Hands-On 2023"についての備忘録です
https://www.udemy.com/course/symfony-framework-hands-on/
Symfony6について,TwitterクローンのWebアプリを開発しながら学習するという内容になっています
Symfony 101
基本コマンド
# Symfonyの要件チェック
symfony check:require
# プロジェクトの作成
symfony new symfony-handson --version="6.1.*"
# プロジェクトの起動
symfony server:start
# コマンド一覧
symfony console
# プロジェクトでの脆弱性の確認
symfony check:security
プロジェクト構成
bin/
- Symfonyコンソール
- 基本的に編集する必要なし
config/
- プロジェクトの構成ファイル
public/
- エントリポイント
- スタイルシート,Javascript,画像,その他アセット等も配置される
src/
- Controller等
- アプリケーションのすべてのビジネスロジック
var/
- キャッシュ,ログ等
vendor/
- サードパーティライブラリ
- 直接変更することはない
composer.json
- すべての外部ライブラリ等を定義
composer.lock
- 直接変更はしない
- インストールされた依存関係等をリスト表示
.env
- 環境変数を定義
処理の流れ
ブラウザからのリクエスト
→HTTP Server→PHP Binary→Symfony Application(index.php)→Controller→テンプレート等のレスポンス→HTTP Server
→ブラウザへレスポンスを返す
Controllerの作成
src/Controller/HelloController.phpを作成
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController {
public function index() {
return new Response("Hi!");
}
}
ルーティングを定義
config/routes.phpに以下を追記
app_index:
path: /
controller: App\Controller\HelloController::index
これによって,symfony server:startコマンドで取得したURL(https://127.0.0.1:8000)でHelloControllerが読み込まれ,画面上にHi!と表示される
メモ
- コントローラーを定義したらルート定義を併せて行う
- Controllerの1つのファイルで複数クラスを定義してはならない
- symfony console debug:routerコマンドですべてのルートとコントローラーを表示できる
ルートの簡易定義
Controllerに以下のように追記することでルート定義をController内で行える
#[Route('/', name: 'app_index')]
public function index(): Response {
return new Response("Hi!");
}
Twig
Twigとは
- Symfonyのテンプレートエンジン(HTMLとデータを併せて表示)
- composer require twigでインストール
- 基本的にはtemplate/に配置
- HelloControllerに使用するTwigであればtemplate/hello/xxx.html.twig
以下のように,テンプレートエンジンをレスポンスとして返すことでHTMLにデータを埋め込める
- $this->render('Twigへのパス', データ);
#[Route('/{limit<\d+>?3}', name: 'app_index')]
public function index(int $limit): Response {
return $this->render('hello/index.html.twig',
['message' => implode(',', array_slice($this->messages, 0, $limit))]
);
}
Controllerから受け取った変数は{{ }}で表示
<div>
{{ message }}
</div>
render等
テンプレート継承
- 親テンプレートの中で子テンプレートを表示させられる
{% block body %}{% endblock %}
{% extends '親テンプレート名' %}
{% block body %}
// テンプレートを記述
{% endblock %}
for構文・if構文
- 通常のプログラミングと同様に使用可能
{% if messages|length > 0 %}
{% for message in messages %}
<div>{{ message }}</div>
{% endfor %}
{% else %}
There's nothing yet!
{% endif %}
フィルタ・関数
- ドキュメント【フィルタ】:https://twig.symfony.com/doc/3.x/filters/index.html
- ドキュメント【関数】:https://twig.symfony.com/doc/3.x/functions/index.html
- 例えば,messages|lengthは配列の要素数を返す
テンプレートの再利用
- {{ incluce("呼び出すTwigのパス", {渡し先のデータ名: 渡すデータ}) }}
{{ include("hello/_message.html.twig", {message: message}) }}
<div>This is message.</div>
<div>{{ message }}</div>
リンクの生成
pathを利用
- https://symfony.com/doc/current/reference/twig_reference.html#path
- path('遷移先のルート', {データ名: 渡したいデータ})
<a href="{{ path('app_show_one', { id: key }) }}">{{ message.message }}</a>
コードの自動生成
Maker Bundle
- https://symfony.com/bundles/SymfonyMakerBundle/current/index.html
- 以下コマンドでインストール
- composer require --dev symfony/maker-bundle
- 以下コマンドで一覧
- symfony console list make
Controllerの自動作成
- 以下コマンドを実行
- symfony console make:controller
- 任意のコントローラー名を入力
profiler
注意
- 本番環境にインストールしたり有効にしてはいけない
profilerとは
- https://symfony.com/doc/current/profiler.html
- 開発環境上でのデバッグツール
- リクエスト,レスポンス,パフォーマンス,SQL,コントローラー等を確認できる
- 以下コマンドでインストール
- composer require --dev symfony/profiler-pack
パフォーマンスの悪いボトルネックを発見するのに便利
最後に
昔Symfonyの公式ドキュメントのチュートリアルを触ったことがあり,今回の内容はほぼチュートリアルの内容でした(ただしチュートリアル以降はほぼ触ってなかった)
最後のProfilerはほぼ見たことなかったのですごく便利そうだと思いました
https://symfony.com/doc/current/setup.html
最近アウトプットしてなかったので,次回以降も備忘録的に書いていこうと思います(かなり雑メモになってしまった)
ではまた