12.

Silex とは(Symfony2 ベースのマイクロフレームワーク・2018 EOL・移行先)

編集
この記事の要点
  • Silex は Symfony2 のコンポーネントを使った PHP マイクロフレームワーク。2011 年登場、Sinatra/Flask 風 API が特徴
  • 2018 年 6 月で EOL。公式に「Symfony 4.0 を使え」と宣言され、現在は新規採用非推奨
  • 直接の後継: Symfony 4.0+(Flex で薄く構成可能)
  • 別の代替: Slim Framework(同コンセプト)/ Laravel Lumen(Laravel 派生)/ Mezzio(旧 Zend Expressive、PSR-15)
  • 移行作業の中心はルート定義の書換Pimple DI から Symfony DI への置換

Silex とは

Silex は Fabien Potencier(Symfony の作者)が 2011 年に発表したPHP マイクロフレームワークです。Python の Flask、Ruby の Sinatra に強く影響を受けたルートとクロージャだけで API を組めるシンプルさで人気を博しました。

内部はSymfony2 のコンポーネントと DI コンテナPimpleで構成され、軽量ながら HttpFoundation / Routing / EventDispatcher 等の本格的な部品を持っていました。

典型的な Silex コード

get('/hello/{name}', function ($name) use ($app) {
    return 'Hello ' . $app->escape($name);
});

// POST
$app->post('/api/users', function (Symfony\Component\HttpFoundation\Request $request) {
    $data = json_decode($request->getContent(), true);
    return $app->json(['id' => 123, 'name' => $data['name']], 201);
});

// ミドルウェア
$app->before(function ($request) {
    // 認証チェック等
});

// サービス登録(Pimple)
$app['db'] = function () {
    return new PDO('mysql:host=localhost;dbname=app', 'user', 'pass');
};

$app->run();

EOL(End of Life)

Silex は2018 年 6 月 1 日に正式に EOL(開発終了)を迎えました。公式アナウンスは以下の通り:

  • セキュリティアップデート提供終了
  • 後継としてSymfony 4.0 を Flex で軽量構成することを推奨
  • GitHub リポジトリはアーカイブ状態

現在の代替候補

代替系譜特徴
Symfony 4.0+(Flex 構成)本家後継必要なバンドルだけ入れて軽量化、Silex に最も近い
Slim Framework 4独立同じマイクロ思想、PSR-7/15 完全準拠
Laravel LumenLaravel 派生Laravel API 互換、現在は Laravel 本体に統合進行中で位置付け曖昧
Mezzio(旧 Zend Expressive)LaminasPSR-15 ミドルウェアファースト
Flight独立超軽量、学習用

Silex → Symfony 4 への移行

公式が推奨する最短ルート。中心はルート定義の置換DI コンテナの置換です:

# 新規 Symfony プロジェクト
composer create-project symfony/skeleton:^4.4 new_app
cd new_app

# 必要なバンドルだけ追加
composer require annotations          # @Route アノテーション
composer require twig                 # テンプレ(不要なら省略)
composer require doctrine/orm         # ORM(不要なら省略)

# コントローラ生成
php bin/console make:controller HelloController
// src/Controller/HelloController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController
{
    /**
     * @Route("/hello/{name}", methods={"GET"})
     */
    public function hello(string $name): Response
    {
        return new Response('Hello ' . htmlspecialchars($name));
    }
}

Silex → Slim 4 への移行

マイクロフレームワーク同士で思想が最も近い移行先:

get('/hello/{name}', function (
    ServerRequestInterface $req,
    ResponseInterface $res,
    array $args
): ResponseInterface {
    $res->getBody()->write('Hello ' . htmlspecialchars($args['name']));
    return $res;
});

$app->post('/api/users', function ($req, $res) {
    $data = json_decode((string) $req->getBody(), true);
    $res->getBody()->write(json_encode(['id' => 123, 'name' => $data['name']]));
    return $res->withHeader('Content-Type', 'application/json')->withStatus(201);
});

$app->run();

DI コンテナの移行(Pimple → 各種)

移行先DI コンテナ
Symfony 4+symfony/dependency-injection(PSR-11)
Slim 4PHP-DI / Pimple / 任意の PSR-11 コンテナ
MezzioLaminas ServiceManager / PHP-DI / Pimple
// Silex (Pimple)
$app['db'] = function () { return new PDO(...); };
$pdo = $app['db'];

// Slim 4 + PHP-DI
$container = new DI\Container();
$container->set('db', function () { return new PDO(...); });
AppFactory::setContainer($container);
$app = AppFactory::create();
// 取得
$pdo = $app->getContainer()->get('db');

// Symfony 4+ (yaml で定義)
# config/services.yaml
services:
    PDO:
        factory: ['App\Factory\PdoFactory', 'create']
# コンストラクタインジェクション
public function __construct(private PDO $pdo) {}

移行戦略の選び方

あなたの状況推奨
Symfony の知識を活かしたいSymfony 4+ Flex 構成
マイクロのままがいいSlim 4
チーム人材確保が最優先Laravel(マイクロを諦める)
大規模化予定Symfony 5/6(フル構成)
標準準拠が重要(PSR-7/15)Slim 4 / Mezzio

EOL コードベースの運用

すぐ移行できない場合の最低限の防衛策:

  • PHP は最新 LTS に上げる(Silex 自体は PHP 7.x までは動く可能性)
  • 依存パッケージを composer audit で脆弱性チェック
  • 外部公開部分に WAF / Cloudflare を入れる
  • 移行計画を必ず立てる(先送りすると技術的負債が雪だるま式)

FAQ

Q: Silex は今でもインストールできる?
A: Composer で silex/silex はまだ取得可能。ただし PHP 8 では各所で警告・エラーが出る。新規採用は絶対避けるべき

Q: Symfony は重そう。マイクロのままがいい
A: Symfony 4+ は symfony/skeleton で最小構成から始められる。必要なバンドルだけ追加すれば Silex 並みに軽量。

Q: 移行に何ヶ月かかる?
A: 規模次第。小規模 API(10 ルート、コード 1000 行)なら 1-2 週間、中規模(50 ルート、外部連携あり)なら 2-3 ヶ月が目安。テストが無いと倍以上

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Laravel
  2. CakePHP
  3. Symfony
  4. zend framework
  5. DietCake
  6. phalcon
  7. CodeIgniter
  8. FuelPHP
  9. Slim
  10. Flight
  11. Yii
  12. Silex