Symfonyプロジェクトの作成と実行
ServBayは、macOSおよびWindows向けに設計されたローカルWeb開発環境です。PHP、Node.js、Python、Go、Javaなどの各種ランタイムに加え、MySQL、PostgreSQL、MongoDB、Redisといったデータベース、ApacheやCaddyのWebサーバーもサポートしています。本ガイドでは、ServBayを活用してmacOSまたはWindowsでSymfonyプロジェクトを迅速に構築・起動する手順を詳しく解説します。
Symfonyとは?
SymfonyはSensioLabsが開発したオープンソースのPHP Webフレームワークで、柔軟性・効率性・高機能なツール群を提供し、最新のWebアプリケーションやAPIの構築を支援します。Web標準のベストプラクティスを遵守し、ルーティングやテンプレートエンジン(Twig)、フォーム処理、認証、依存性注入など、一般的なWeb開発タスクを大幅に容易にする豊富なコンポーネントを備えています。
Symfonyの主な特徴とメリット
- モジュール構造:再利用可能なコンポーネントライブラリによる柔軟な設計で、軽量から大規模までプロジェクトに応じて部品を選択可能。
- 高いパフォーマンス:洗練されたアーキテクチャ、優れたキャッシュ機構、最新PHP機能への対応により、優良な処理能力を発揮。
- 強力なコミュニティ:大規模な開発コミュニティ、多数のサードパーティ製バンドルや詳細なドキュメントが用意されており、課題解決が容易。
- 拡張性と柔軟性:各種サードパーティライブラリや拡張を簡単に統合でき、あらゆる規模・難易度のアプリ開発に対応。
- 安定性と保守性:堅牢なコーディング規約や設計パターンに従っているため、アプリケーションのテスト・保守・拡張も容易。
Symfonyは、小規模APIから大規模エンタープライズシステムまで、あらゆるWebプロジェクト構築に適しています。
ServBayによるSymfonyプロジェクトの作成と実行
ServBayは、Symfonyプロジェクトの実行に必要なPHPバージョン、Composer、Webサーバー、各種データベース・キャッシュサービスなど、完全な環境を提供します。このセクションでは、ServBayの機能を使って新規Symfonyプロジェクトを構築&設定する流れを案内します。
事前準備
始める前に、以下の準備を完了してください。
- ServBayのインストール:macOS上でServBayをインストール・起動済みであること(未インストールの場合はServBayインストールガイドを参照)。
- ServBayが正常稼働していること:コアサービス(CaddyまたはApache、利用するデータベース)が起動していること。
- 基本知識の確認:PHPやComposer、Symfonyの基本的な概念をある程度理解していること。
Symfonyプロジェクトの作成
ServBayでは、Webサイトプロジェクトを /Applications/ServBay/www
ディレクトリに統一して保存することを推奨しています。これによりServBayがプロジェクトを認識・管理しやすくなります。
Composerの利用確認
ServBayにはComposerがすでに組み込まれ、環境変数も自動設定されています。別途インストールは不要です。ターミナルで
composer --version
を入力し、利用可能か確認してください。プロジェクトフォルダの作成
推奨のWebルートディレクトリで、Symfony用の新規ディレクトリを作成します。
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2ComposerによるSymfony骨組み作成
新規ディレクトリに移動し、
website-skeleton
を基盤としたSymfonyプロジェクトスケルトンを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:db_password@127.0.0.1:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:db_password@127.0.0.1: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
は十分にランダムな値へ置き換えてください。DB接続はServBay既定のユーザーroot
・パスワードpassword
を利用しますが、本番環境では必ず変更しましょう。サンプルDB名にはservbay_symfony_app
を使います。
Webサーバー(ServBayサイト)の設定
ブラウザからSymfonyプロジェクトへアクセスするため、ServBayの「サイト」機能でローカル仮想ホストを構成します。SymfonyのWebルートは public/
ディレクトリになります。
ServBayコントロールパネルから「サイト」(旧Verは「ホスト」)設定画面を開き、新しいサイトを追加:
- 名前(Name):例)
My Symfony Dev Site
といった識別しやすい名前。 - ドメイン(Domain):例)
servbay-symfony-test.local
などローカル専用ドメイン(ServBayが自動解決します)。 - サイトタイプ(Website Type):
PHP
を選択。 - PHPバージョン(PHP Version):Symfonyに最適なPHPバージョン、例)
8.3
などServBay最新安定版。 - Webルート(Website Root):最重要。Symfonyはプロジェクト配下の
public/
をWebルートに設定。/Applications/ServBay/www/servbay-symfony-app/public
設定完了後は保存して反映。ServBayがWebサーバー設定を自動更新します。ServBayではCaddy/ApacheがDomainごとの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("/")
アノテーションでWebサイトのルート/
へ割り当てられます。アクセス時、"Hello ServBay and Symfony!"と画面表示されるHTTPレスポンスを返します。
サイトへのアクセス
Webブラウザを開き、ServBayで設定したドメイン(例:https://servbay-symfony-test.local
)へアクセスしてください。
以下の表示が現れれば設定成功です。
Hello ServBay and Symfony!
1
SymfonyプロジェクトがServBayのWebサーバー上で正常に動作しています。SSLも自動設定されているため、https://
からのアクセスがお勧めです。
データベースとキャッシュの実用例
Symfonyでは主にDoctrine ORMによるリレーショナルDB操作、Symfony Cacheによるキャッシュ/NoSQL管理が主流です。ServBayには各種DBサービスやPHP拡張が組み込まれており、容易にプロジェクトに導入できます。
リレーショナルデータベース例(Doctrine ORM)
ServBayはMySQL・PostgreSQL両対応。下記では基本設定と利用方法例を解説します。
データベース接続設定
プロジェクトの
.env
ファイルで、利用するDBに応じたDATABASE_URL
のコメントを外し、内容を書き換えます。- MySQLの場合: ServBay既定のMySQLユーザーは
root
、パスワードはpassword
、ポートは3306
です。自身の設定に合わせて記入しましょう。dotenv# .env DATABASE_URL="mysql://root:password@127.0.0.1:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - PostgreSQLの場合: ユーザー
root
、パスワードpassword
、ポート5432
です。dotenv# .env DATABASE_URL="postgresql://root:password@127.0.0.1:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
ServBayコントロールパネルで該当DBサービスが起動していることも確認してください。
- MySQLの場合: ServBay既定のMySQLユーザーは
データベースの新規作成
servbay_symfony_app
DBが未作成の場合、ServBayの管理ツール(phpMyAdmin, pgAdmin、コントロールパネルからアクセス可能)で新規作成、またはSymfonyコマンドで作成しましょう。bashphp bin/console doctrine:database:create
1Entity(エンティティ)とマイグレーションファイルの作成
Doctrine EntityはDBテーブルに相当するクラスです。Maker BundleでEntity・マイグレーションファイル生成が簡単です。
- Entity作成(例:Userエンティティ)bash質問に従い
php bin/console make:entity User
1name
(string)、email
(string, unique)などフィールド追加。 - マイグレーションファイル作成 Entityの変更に対応しDBマイグレーションファイル生成:bash
php bin/console make:migration
1src/Migrations
ディレクトリに、users
テーブル作成などSQL文入りのファイルが作成されます。
- Entity作成(例:Userエンティティ)
マイグレーションの適用
下記コマンドで、DB構造を実際のDBへ反映します。
bashphp bin/console doctrine:migrations:migrate
1DB操作例の追加
src/Controller/DefaultController.php
を編集し、Doctrine経由でDBへの書き込み・読み取りを実演するメソッドとルートを追加します。EntityManagerInterface
をDIで注入します。まずはコンストラクターでDIします:
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; // DIで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
30config/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
8コントローラーにメソッド追加:
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; // JsonResponseインポート 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('demo-user@servbay.test'); // 永続化(保存準備) $this->entityManager->persist($user); // 実際にDBへ書き込む $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のCacheコンポーネントで簡単に接続・利用できます。
キャッシュ接続設定
.env
ファイルでCACHE用DSNを設定します。- Memcachedの場合 ServBay既定ポートは
11211
です。dotenvServBayコントロールパネルでMemcachedサービスを起動してください。# .env # ... その他設定 ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redisの場合 ポートは
6379
です。dotenvRedisサービスも同様に起動してください。# .env # ... その他設定 ... CACHE_DSN=redis://127.0.0.1:6379 # Redisにパスワードが必要な場合(ServBay既定はなし): # CACHE_DSN=redis://:your_password@127.0.0.1:6379
1
2
3
4
5
- Memcachedの場合 ServBay既定ポートは
キャッシュ実装例の追加
src/Controller/DefaultController.php
を編集し、Symfony Cacheを使ったMemcached・Redisデータ操作を追加。CacheInterface
をDIで注入します。コンストラクターでDI:
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プロパティ追加 // DIで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ルートを追加:
yaml# config/routes.yaml # ... その他のルート ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5コントローラーにキャッシュ例メソッド追加:
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
にアクセス
初回はコールバックでデータ生成・キャッシュ保存、以降は未期限ならMemcached/Redisから即応答。
よくある質問(FAQ)
Q: https://servbay-symfony-test.local
へアクセスできない、もしくは500エラーになる場合?
A: 以下を確認してください。
- ServBayが稼働中でWebサービス(Caddy/Apache)が起動しているか。
- サイト設定のDomain(servbay-symfony-test.local)が正しく入力され、Webルートが
/Applications/ServBay/www/servbay-symfony-app/public
になっているか。 - Symfonyプロジェクトのログ(
var/log/dev.log
)でエラー情報を確認。 - 依存パッケージ導入漏れがあれば
composer install
を実行。 - PHPバージョンがSymfony対応バージョンかどうかも重要です。
Q: データベース接続ができない場合?
A: 下記を確認してください。
- ServBayコントロールパネルでMySQL・PostgreSQLサービスが起動しているか。
.env
ファイルのDATABASE_URL
に正しいユーザー名・パスワード、ホスト(127.0.0.1)、ポート(MySQL:3306, PostgreSQL:5432)、DB名が入力されているか。- DBユーザー・パスワードはServBay既定または独自設定と一致するか。
- 接続先DB(servbay_symfony_app)が作成済みかも確認。
Q: php bin/console
コマンドが動作しない?
A: ターミナルの作業ディレクトリが/Applications/ServBay/www/servbay-symfony-app
になっているか、ServBayのPHPがPATHへ正しく追加されているか確認。
(which php
でServBayのPHPパスかどうか確認できます。)
まとめ
本ガイドを通じて、ServBayを使ってmacOS環境下でSymfonyの基本プロジェクトを構築・設定・起動する手順を身につけることができました。ServBayはSymfony開発に必須の主要コンポーネント(PHP、Composer、Webサーバー、データベース、キャッシュ)を統合的に提供し、環境構築を強力にサポートします。
本プロジェクトを基盤としてSymfonyの機能習得を進めたり、ServBayのその他ソフトウェア・サービスも活用して開発を効率化していきましょう。