検索機能にSlimを導入した話



サーチサービス開発Gの前田です。サーバーサイドのエンジニアとして活動しています。
主な業務はレストラン検索周りの開発です。

今回の記事では業務で扱っているSlimというPHPのフレームワークと、検索機能での活用事例を紹介します。

Slimとは

フレームワークは大きく分けてフルスタックフレームワークとマイクロフレームワークの2つがあります。サーバーサイド、ネイティブアプリ、Webサービスなど、開発をするために必要なモジュールを提供する様々なフレームワークが存在します。

以下はPHPのフレームワークの例です。

PHPのフルスタックフレームワーク

サーバーサイドの開発をするために必要なモジュールが一通り提供されています。

(例)

  • Laravel
  • CodeIgniter
  • Zend

PHPのマイクロフレームワーク

サーバーサイドの開発をするための何かに特化したモジュールが提供されています。

(例)

  • Slim
  • Lumen
  • Silex

Slimはルーティングに特化したPHPのマイクロフレームワークです。

検索システムにSlimを導入した目的と背景

私がサーチサービス開発Gに入る以前にSlim3が導入されていました。

最近はLaravelが流行しており様々な機能が用意されています。良いフレームワークだと思いますが、流行しているという理由だけで技術選定すると、プロダクトの目的に合わずにプロジェクトが失敗する可能性は低くないと思います。

先輩に導入した目的を伺ったところ、PC版とスマホ版のHTTP周りとルーティングシステムが分かれており、それを共通化することにより保守性を高めるためとのことでした。

あわせて、以下の2つの背景が存在しました。

  • 既存のPHPのソースコードの量が多く、検索システムのボリュームが大きい
    • 部分的に導入できるフレームワークがいい
  • 学習コストが低めがいい

まとめると、

  • 達成したいこと : PC版とスマホ版のHTTP周りとルーティングシステムを共通モジュールに置き換え
  • 条件1 : PHPに導入可能であること
  • 条件2 : 検索システムのボリュームが大きいので検索システム全体に影響を及ぼさないように、部分的に置き換えること
  • 条件3 : 学習コストが低くなるように、規模が小さい技術を選択すること

上記を満たす最適な技術がSlimというPHPのフレームワークでした。

Slimの特徴

Slimの特徴を挙げてみます。

  • PSR-7に沿ったHTTP RequestとResponse
  • ルーティング処理を楽に実装できる
  • ミドルウェアによる拡張性

ルーティングとGETメソッドやPOSTメソッドに応じてパラメータを取得し処理を実行できるので、RESTful APIの作成時に利用しやすいと思います。

Slimの開発活発度

有名なPHPのフレームワークの直近3年間のリリース頻度はこちらとなります。特に枯れている様子もなく、今後もアップデートがリリースされていくのではないでしょうか。

f:id:gnavi_developers:20181122100435p:plain 図は各フレームワークのGitHubリポジトリ「Releases」をもとに制作

速度

このgithubのページにまとめられているPHPフレームワークのBenchmarkを見ると、 速度的には中くらいです。

github.com

PSR-7に準拠

SlimではhttpのRequestやResponseを利用しています。
PSR-7の規約に準拠しており正しい設計になっているのが担保されているので、保守性が高いフレームワークだという印象を受けます。

Slim3を用いたルーティング処理の導入方法

先ほど、PC版とスマホ版のHTTP周りとルーティングシステムを共通モジュールに置き換えている
、と述べました。

ここで、Slim3を用いたルーティング処理の導入方法を説明したいと思います。図で表すとこのようになります。

f:id:gnavi_developers:20181122100553p:plain

「Routing」

f:id:gnavi_developers:20181122100623p:plain

Routingの書き方はこのようになります。

$app->{httpメソッド}(ルートパターン, ルートコールバック);


(例)

Routing

$app = new \Slim\App();
$app->get(
    ‘/api/food/shop.php’
    ‘ApiController:initializeShop’
);

ApiController

public function initializeShop(
RequestInterface $request,
ResponseInterface $response,
array $shops
){
    ・・・
}


「Middleware」
f:id:gnavi_developers:20181122100725p:plain

ここでいうMiddlewareとは、アプリケーションでRequestとReaponseオブジェクトを処理する前後にはさむ処理です。
例えば、CSRFからアプリケーションを守る前処理や認証をはさんだり、処理が終わった後にリダイレクト先を変えることが可能です。

(例)

Middleware

$app = new \Slim\App();
$app->add(‘AuthMiddleware’);
$app->get(‘/’, ‘TopController:index’)
        ->add(‘GenerallyRedirect’);

AuthMiddleware

class AuthMiddleware
{
    public function __invoke($request, $response, $next)
{
    ・・・
}
}

運用していて気づいたこと

  • ルーティングに関係する処理が新しく必要になったときに、新規で作ったミドルウェアを適用しやすい
  • テストコードでもuseするだけでSlimが使える
  • Slimの書籍が少ない

最後に

SlimというPHPのマイクロフレームワークについて説明しました。人気や流行にとらわれず、目的を達成するために手段を選ぶことが大切であると改めて実感しました。

今回は真面目な記事になりましたが、こういった記事も書いていて楽しかったです。

検索チームでは課題や不便だと感じる点に対して技術的アプローチで解決することが多いので、今後も記事としてアウトプットしていきます。


前田
趣味はダーツと麻雀です。ぐるなびダーツ部に所属し活動してます。月に1回のペースで先輩や同期とダーツを楽しんでいます。麻雀の活動もプライベートの時間で積極的におこなっています。


お知らせ
今年はぐるなびアドベントカレンダー2018も実施します!