我正在创建一个基于laravel的多租户电子商务应用程序。当用户创建商店时,他将获得一个子域。因此,为了迎合应用程序的未来用户,我创建了一个通配符子域。
每个店主拥有独立于其他人的产品/物品等。我的问题是,我如何才能仅针对该特定子域使用会话?例如,当一个人在mystore.site.com
添加特定项目时,我希望它只在该商店中,所以当他浏览其他商店时,除非他回到mystore.site.com
,否则他的购物车应该是空的。
这可能吗?因为当我打开session
时,其会话Cookie路径位于根目录中,我认为它将应用于域范围。我只使用1个laravel安装
答案 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.mystore
, shopping_cart.theirstore
和shopping_cart.whosstore
。然后你可以为Session
创建一个漂亮的小包装器,它会自动附加它,这样你就可以简单地调用Session::get('shopping_cart')
。
你会注意到,上面我假设域名字段只包含子域名,减去实际域名。