基于通配符子域的多租户laravel应用程序会话

时间:2014-11-18 14:19:17

标签: php session laravel

我正在创建一个基于laravel的多租户电子商务应用程序。当用户创建商店时,他将获得一个子域。因此,为了迎合应用程序的未来用户,我创建了一个通配符子域。

每个店主拥有独立于其他人的产品/物品等。我的问题是,我如何才能仅针对该特定子域使用会话?例如,当一个人在mystore.site.com添加特定项目时,我希望它只在该商店中,所以当他浏览其他商店时,除非他回到mystore.site.com,否则他的购物车应该是空的。

这可能吗?因为当我打开session时,其会话Cookie路径位于根目录中,我认为它将应用于域范围。我只使用1个laravel安装

1 个答案:

答案 0 :(得分:2)

真的有两种选择。

首先,您可以在应用程序中挂钩启动过程的开始,并在运行时覆盖session.domain配置选项。您基本上需要一个早期阶段来确定当前子域的租户并更改设置,如下所示:

Config::set('session.domain', $tenant->domain . '.site.com');

同样,您可以使用让您获得租户的对象来设置请求的上下文(使用存储库模式更容易)。

第二个选项是在会话数据中包含实际域,例如。

Session::push('shopping_cart.' . $tenant->domain, $cart);

假设您在会话中使用push方法,它只会将内容附加到会话的特定部分,例如shopping_cart.mystore,因此您可以拥有shopping_cart.mystoreshopping_cart.theirstoreshopping_cart.whosstore。然后你可以为Session创建一个漂亮的小包装器,它会自动附加它,这样你就可以简单地调用Session::get('shopping_cart')

你会注意到,上面我假设域名字段只包含子域名,减去实际域名。