Laravelでマルチベンダー・マーケットプレイスを構築する方法

マーケットプレイスの構築は、データの問題です。

多くの開発者は、難しいのは出品者用ダッシュボードだと思っています。しかし、そうではありません。真の課題はマルチテナンシー(multi-tenancy)にあります。すべてのクエリが「このデータの所有者は誰か?」という一つの問いに答えるようにしなければなりません。

標準的なショップを構築してから後付けでベンダーを追加しようとすると、書き直し(リライト)が必要になります。すべてのモデル、すべてのクエリ、すべてのカートにベンダーIDを組み込まなければなりません。もしフィルターを一つでも忘れると、ある出品者が別の出品者の注文を見てしまうことになります。それはデータ漏洩です。

選択肢は3つあります:

  • 自力で構築する:すべてのスコープ句を自分で記述します。コストがかかり、リスクも伴います。
  • アドオン付きのシングルテナント・ショップを使用する:ベンダー用に設計されていないスキーマに、ベンダー用のカラムを継ぎ足します。分離状態は脆弱なままです。
  • マルチテナント基盤を使用する:Aimeosのような、初日からデータモデルに分離機能を組み込んでいるパッケージを使用します。

Aimeosを使用して、単一のショップをマーケットプレイスに変換する方法は以下の通りです:

1. 基盤をインストールする

開始するには、次のコマンドを実行します: composer create-project aimeos/aimeos myshop

2. マルチベンダーモードを有効にする

データベースを書き換える必要はありません。.env ファイルの1行を変更するだけです: SHOP_MULTISHOP=true

このフラグにより、すべてのルート、API、管理パネルが特定のサイトに自動的にスコープされます。システムがデータの分離を自動的に処理します。

3. セルフサービスによるオンボーディングを有効にする

スケールさせるには、ベンダー自身にサインアップさせましょう。.env に以下を追加します: SHOP_REGISTRATION=true

新しい出品者は、自身のカタログ、注文、顧客にのみアクセスできます。それ以外のものを見ることはできません。

なぜこれが機能するのか:

Aimeosはすべてを「サイト(site)」を中心に構成します。すべての商品、価格、注文にはサイトIDが付与されています。データレイヤーがこれを自動的にフィルタリングします。システムが自動で行うため、自分で where site_id = ? と書く必要はありません。

このアプローチは、3つの大きな問題を解決します:

  • セキュリティ:データの分離はデータベースの特性であり、書き忘れの可能性があるコードの一部ではありません。
  • 複雑さ:スキーマを変更することなく、ベンダーはサブスクリプションやセット商品のような複雑な商品を管理できます。
  • 決済:Stripeなどの拡張機能を使用して、即座に支払いを分割できます。プラットフォームが手数料を受け取り、残りが出品者に支払われます。

配管(インフラ)の構築はやめましょう。マーケットプレイスの構築を始めましょう。

Source: https://dev.to/aimeos/how-to-implement-a-multi-vendor-e-commerce-marketplace-397a