Symfonyプロジェクトの作成と実行
ServBayはmacOS専用に設計されたローカルWeb開発環境であり、PHP、Node.js、Python、Go、Javaといった多様なランタイムや、MySQL、PostgreSQL、MongoDB、Redisなど複数のデータベースを標準搭載。さらにApacheやCaddyといったWebサーバーもサポートしています。本ガイドでは、macOS上でServBayを活用してSymfonyプロジェクトの立ち上げと実行を素早く行う方法を詳しく解説します。
Symfonyとは?
SymfonyはSensioLabsにより開発されたオープンソースのPHP Webフレームワークであり、開発者向けに効率的かつ柔軟、高機能なツールセットを提供し、モダンなWebアプリケーションやAPI構築を容易にします。標準的なWebベストプラクティスを踏襲しつつ、ルーティング、テンプレートエンジン(Twig)、フォーム処理、認証、依存性注入など多彩なコンポーネントを備えており、一般的なWeb開発タスクを大幅に簡素化します。
Symfonyの主な特徴と利点
- モジュール設計:Symfonyのコアは再利用可能なコンポーネント群で構成されており、開発者は用途に応じて柔軟に選択・利用可能。スモールなアプリからエンタープライズ級まで対応。
- 高パフォーマンス:最適化されたアーキテクチャ、効果的なキャッシュ機構、最新PHP機能への対応により、優れたパフォーマンスを実現。
- 強力なコミュニティサポート:巨大な開発者コミュニティ、豊富なサードパーティ製バンドル(プラグイン)、充実のドキュメントで課題も素早く解決可能。
- 高い拡張・統合性:多種多様な外部ライブラリや拡張と統合が容易。プロジェクト規模・複雑性を問わず柔軟に対応。
- 安定性・保守性:優れたコーディング規約・デザインパターンに準拠し、テスト・保守・拡張性の高いアプリ構築が可能。
Symfonyは小規模APIから大規模エンタープライズシステムまで、あらゆるWebプロジェクトの開発に適しています。
ServBayを使ってSymfonyプロジェクトを作成・実行する
ServBayはSymfonyプロジェクトに必要なPHPバージョン、Composer、Webサーバー、各種データベースやキャッシュサービスをワンパッケージで提供。本セクションでは、ServBayの機能を活用し新規Symfonyプロジェクトの作成と設定方法を順を追って解説します。
前提条件
始める前に、次をご準備ください。
- ServBayのインストール:macOSにServBayがインストール・起動済みであること。もし未インストールの場合はServBayインストールガイドをご参照ください。
- ServBayが正常動作中:CaddyまたはApacheなどWebサーバーや、必要なデータベースなどServBayのコアサービスが稼働していること。
- 基本知識:PHP、Composer、およびSymfonyの概要について初歩的な知識があること。
Symfonyプロジェクトの作成
ServBayでは、プロジェクトフォルダを/Applications/ServBay/www
配下に統一して格納することを推奨します。これによりプロジェクトの識別・管理が容易になります。
Composerの利用可否を確認
ServBayにはComposerが標準同梱されており、環境変数設定も完了済みです。別途インストールは不要です。
composer --version
をターミナルで実行し、Composerが利用可能かご確認ください。プロジェクトディレクトリの作成
推奨ルートディレクトリに新規Symfonyプロジェクト用のフォルダを作成します。
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2ComposerでSymfonyプロジェクト生成
作成したディレクトリへ移動し、
website-skeleton
ベースのプロジェクトスケルトンをComposerで構築します。website-skeleton
には従来型Webアプリに役立つ必須依存パッケージが含まれています。bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2実行すると、Symfonyコアや依存パッケージがこのディレクトリにダウンロードされます。
初期設定
Symfonyプロジェクトの主要な設定は環境変数で管理するのが一般的です。これらはプロジェクトルート直下の.env
ファイルに保存します。
環境変数の設定(
.env
)プロジェクトルートの
.env
ファイルを編集してください。ここにはアプリケーションの設定値(データベース情報、アプリキーなど)が記載されています。必要に応じて編集してください。以下のように、ServBay環境に合わせて適切な設定を行いましょう。
dotenv# .envファイル例 APP_ENV=dev # 開発環境 APP_SECRET=your_secret_key # セキュリティ用途の一意なランダム文字列に置き換えてください # データベース接続例(MySQL用。詳細は後述) # DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=13&charset=utf8" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
1
2
3
4
5
6
7
8your_secret_key
は安全なランダム文字列へ差し替えてください。データベースの接続情報は、ServBayのデフォルトユーザーがroot
、パスワードがpassword
であることが多いですが(本番環境では必ず変更してください)。データベース名にはservbay_symfony_app
を例示します。
Webサーバー(ServBay「サイト」機能)の設定
ブラウザ経由でSymfonyプロジェクトを表示するには、ServBayの「サイト」機能を用いてローカルのバーチャルホストを設定します。Symfonyではプロジェクト内public/
ディレクトリがWebルートとなります。
ServBayコントロールパネルを開き、「サイト」設定(または旧バージョンでは「ホスト」設定)から新サイトを追加してください:
- 名前:分かりやすいサイト名(例:
My Symfony Dev Site
)を入力。 - ドメイン:ローカル用開発ドメイン(例:
servbay-symfony-test.local
)を設定。ServBayが自動でローカルに解決します。 - サイトタイプ:
PHP
を選択。 - PHPバージョン:Symfonyと互換性あるPHPバージョンを選択(例:
8.3
など最新安定版推奨)。 - Webサイトのルートパス:ここが最重要設定。SymfonyのWebルートは必ず
public/
ディレクトリとなるため、/Applications/ServBay/www/servbay-symfony-app/public
と指定してください。
設定を保存・反映すると、ServBayがWebサーバー設定を自動更新します。CaddyやApacheを自動選択し、SSL証明書もローカルドメイン用に自動発行・信頼設定されるので、HTTPSでアクセス可能です。
手順の詳細はServBayで最初のサイトを追加する手順を参照してください。
サンプルコードを追加して動作確認
サイト設定の動作検証として、シンプルなルートとコントローラを用意し、トップページへのアクセスで簡単なテキストを出力する例を作成します。
ルーティングの設定(
config/routes.yaml
)config/routes.yaml
を開き、ルートパス/
をindex
コントローラメソッドへ割り当てます。yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4コントローラの作成(
src/Controller/DefaultController.php
)src/Controller/
配下にDefaultController.php
を新規作成し、以下を記述します。php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DefaultController { /** * @Route("/", name="index") */ public function index(): Response { // シンプルなHTTPレスポンスを返す return new Response('Hello ServBay and Symfony!'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18上記は
DefaultController
というコントローラを作り、そのindex
メソッドが@Route("/")
アノテーションでルートパスに紐づいています。アクセスすると"Hello ServBay and Symfony!"が表示されます。
サイトへアクセス
WebブラウザでServBayで設定したドメインhttps://servbay-symfony-test.local
を開いてください。設定が正常ならば次の内容が表示されます:
Hello ServBay and Symfony!
1
これでServBayのWebサーバー経由でSymfonyプロジェクトが正常稼働していることが確認できます。なお、ServBayはHTTPSを自動設定しますので、必ずhttps://
で接続しましょう。
データベースおよびキャッシュの利用例
Symfonyでは通常、リレーショナルデータベースにDoctrine ORM、キャッシュやNoSQLではSymfony Cacheコンポーネントが利用されます。ServBayには各種サービスと対応PHP拡張が標準搭載されているため、簡単に連携できます。
リレーショナルデータベースの利用例(Doctrine ORM)
ServBayはMySQL・PostgreSQLに双方対応。以下にSymfonyでの設定・利用方法を示します。
DB接続設定
プロジェクトルートの
.env
でご利用DBに応じたDATABASE_URL
のコメントアウトを外し、内容を編集します。- MySQLの場合 ServBayのMySQLはデフォルトでユーザー
root
、パスワードpassword
、ポート3306
です(状況に応じて調整)。dotenv# .env DATABASE_URL="mysql://root:[email protected]:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - PostgreSQLの場合 ServBayのPostgreSQLもデフォルトでユーザー
root
、パスワードpassword
、ポート5432
です。dotenv# .env DATABASE_URL="postgresql://root:[email protected]:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
サービスパネルで該当データベース(MySQLまたはPostgreSQL)が起動しているかをご確認ください。
- MySQLの場合 ServBayのMySQLはデフォルトでユーザー
データベースの作成
データベース
servbay_symfony_app
がまだ無い場合は、ServBayのDB管理ツール(phpMyAdmin, pgAdmin等。ServBayパネルから起動可能)や下記Symfonyコマンドで作成:bashphp bin/console doctrine:database:create
1Entityとマイグレーションファイルの作成
Doctrine Entity(DBテーブルに紐づくクラス)は、Maker Bundleで簡単に生成できます。
- Entity作成例(例:Userエンティティ)bashフィールド名(例:
php bin/console make:entity User
1name
(string)・email
(string, unique=yes)等)をプロンプトに従って追加。 - マイグレーションファイル作成 定義変更に合わせ、Migrationファイルを生成:bashこれで
php bin/console make:migration
1src/Migrations
に新しいMigrationファイルが作成されます。
- Entity作成例(例:Userエンティティ)
マイグレーションの実行
マイグレーション適用でDB構造を作成します:
bashphp bin/console doctrine:migrations:migrate
1DB操作サンプルの追加
src/Controller/DefaultController.php
を編集し、Doctrine経由でのデータ追加・取得サンプルルートを実装します。EntityManagerInterface
をDI(依存性注入)で受け取ります。まず、コンストラクタで
EntityManagerInterface
を受け取れるようにします:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; // EntityManagerInterfaceをインポート use App\Entity\User; // Userエンティティをインポート use Symfony\Component\HttpFoundation\JsonResponse; // JSONレスポンス用 class DefaultController { private $entityManager; // EntityManagerInterfaceを依存性注入 public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... 他のメソッド ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30続いて、
config/routes.yaml
に新規ルートを追加:yaml# config/routes.yaml # ... その他のルート ... mysql_add_user: path: /mysql-add-user # または /pgsql-add-user (DBに応じて) controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # または /pgsql-users controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8src/Controller/DefaultController.php
にサンプルメソッドを追加:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; // JSONレスポンス用 class DefaultController { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } /** * @Route("/add-user", name="app_add_user") */ public function addUser(): Response { $user = new User(); // ServBayブランドにちなんだサンプルデータ $user->setName('ServBay Demo User'); $user->setEmail('[email protected]'); // エンティティを永続化(保存準備) $this->entityManager->persist($user); // データベースへ書き込み $this->entityManager->flush(); return new Response('User added successfully!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // 全Userエンティティを取得 $users = $this->entityManager->getRepository(User::class)->findAll(); // 配列に変換しJsonResponseへ渡す $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // JSON形式で返却 return new JsonResponse($usersArray); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67動作確認
https://servbay-symfony-test.local/add-user
へアクセスでユーザー追加https://servbay-symfony-test.local/get-users
で登録ユーザー一覧をJSON出力
キャッシュ&NoSQLデータベース例(Symfony Cacheコンポーネント)
ServBayにはRedis・MemcachedサービスとPHP拡張がプリインストールされていて、Symfony側でのセットアップも簡単です。
キャッシュサービス接続設定
.env
ファイルにキャッシュDSNを記述してください。- Memcachedの場合 デフォルトポートは
11211
dotenvサービスがパネルで起動されていることもご確認を。# .env # ... 他の設定 ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redisの場合 デフォルトポートは
6379
dotenvサービスパネルでRedisが起動中かご確認ください。# .env # ... 他の設定 ... CACHE_DSN=redis://127.0.0.1:6379 # パスワード付きの場合(ServBayは通常パスワード不要) # CACHE_DSN=redis://:[email protected]:6379
1
2
3
4
5
- Memcachedの場合 デフォルトポートは
キャッシュ利用サンプル実装
src/Controller/DefaultController.php
を編集し、Symfony CacheでMemcached/Redisとやりとりする例を追加します。CacheInterface
のDIが必要です。まず、コンストラクタで
CacheInterface
を受け取るよう修正:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; // CacheInterfaceをインポート class DefaultController { private $entityManager; private $cache; // cacheプロパティを追加 // CacheInterfaceの依存性注入 public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; // 変数設定 } // ... 他のメソッド ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25さらに、
config/routes.yaml
へ新ルートを追加:yaml# config/routes.yaml # ... その他のルート ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5DefaultController.php
にメソッドを追加:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Component\Cache\Item\ItemInterface; // ItemInterfaceをインポート class DefaultController { private $entityManager; private $cache; public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... 他のメソッド ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // キャッシュからデータ取得 $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // キャッシュ未ヒット時はここが実行される $item->expiresAfter(3600); // 1時間有効 // 負荷の高い処理のシミュレーション(例:DB複雑検索) $data = "Data generated at " . date('Y-m-d H:i:s'); // キャッシュに保存 return $data; }); // $cacheItemにはキャッシュまたは生成データが入る $output = "From Cache: " . $cacheItem; return new Response($output); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48動作確認
https://servbay-symfony-test.local/cache-example
にアクセス 初回はデータ生成・キャッシュ格納、2回目以降は有効期限までMemcachedまたはRedisからキャッシュを取得します。
よくあるご質問(FAQ)
Q: https://servbay-symfony-test.local
へアクセス時にページが見つからない/500エラー?
A:
- ServBayが実行中か、Webサーバー(Caddy/Apache)が起動しているかを確認。
- サイト設定でドメイン
servbay-symfony-test.local
および「サイトルート」が/Applications/ServBay/www/servbay-symfony-app/public
に正しく設定されているか再確認。 - Symfonyプロジェクトのログ(
var/log/dev.log
)でエラー詳細を確認。 - プロジェクトルートで
composer install
を実行し依存パッケージ導入状況をチェック。 - PHPバージョンがSymfony対応版かを確認。
Q: データベース接続エラーの場合は?
A:
- ServBay制御パネルで該当DBサービス(MySQL/PostgreSQL)が稼働していることを確認。
.env
のDATABASE_URL
構文が正しいか(ユーザー名・パスワード・ホスト(127.0.0.1)・ポート(MySQL: 3306, PostgreSQL: 5432)・DB名)。- DBユーザー・パスワードがServBayのデフォルトと一致しているか確認(カスタム設定時は適宜修正)。
- データベース
servbay_symfony_app
が作成済みか。
Q: php bin/console
コマンドが動作しない?
A: ターミナルカレントディレクトリが/Applications/ServBay/www/servbay-symfony-app
になっているか、ServBayのPHPがPATHで先に解決されているかをご確認(which php
コマンドで確認可)。ServBayインストール時には自動でPATH設定される設計です。
まとめ
このガイドを通じて、macOS上でServBayを用いてSymfonyプロジェクトを新規作成・設定・実行するまでの基本手順がお分かりいただけました。ServBayはSymfony開発に必要なPHP・Composer・Webサーバー・DB・キャッシュすべてを一元提供し、面倒な環境構築を大幅に簡素化します。ぜひ本サンプルを基礎として、さらに発展的なSymfony機能やServBay同梱の各種サービス活用へとチャレンジしてください。