我正在建立一个在线商店网站作为Laravel 5.3的副项目。我的目标是实施匿名和认证购物。到目前为止,以下是Customer
,Cart
和CartItem
表:
// (1) customers table...
table->increments('id');
$table->integer('user_id')->unsigned(); // -> User hasOne('App\Customer') rel.
$table->string('first_name');
// last_name, dob, phone, etc. + timestamps
// (2) carts table...
$table->increments('id');
// -> Customer identification (and not user_id, because admins don't have carts!):
$table->integer('customer_id')->unsigned()->nullable();
// -> Guest identification:
$table->string('session_id');
$table->timestamps();
// (3) cart_items table...
$table->increments('id');
$table->integer('cart_id')->unsigned();
$table->integer('product_id')->unsigned();
$table->integer('quantity')->unsigned();
$table->timestamps();
但是,我不确定如何识别访客用户并将其与购物车绑定。我们的想法是,如果您以访客身份购物然后注册或登录,您的购物车应该经过身份验证,即我需要$cart->customer_id = Auth::user()->customer->id
。但是如何将客人与他们的匿名购物车绑在一起(即$cart->customer_id == null
时)?
Session::getId();
时将$cart->session_id
存储在Cart
,那么我处于风险,因为Laravel中的会话ID为重新生成非常频繁(例如during login authentication)。因此,如果访客登录,我将无法再找到他们的购物车Cart::where('session_id', Session::getId())
,因为他们的Session
ID刚刚在登录后重新生成!session_id
,例如在$table->uuid('guest_id')
迁移中写carts
。此令牌将保留在数据库和客户端cookie中(如Snapey在similar question on Laracasts中所建议的那样)。User
,可能角色为guest
,但没有密码或电子邮件。当客户决定注册时,我可以使用注册表中的值填充这些字段。我用cookies看到的问题是它们不那么“持久”,我仍然认为在会话中存储购物车(匿名和经过身份验证)更安全。与此同时,我无法将会话lifetime
更改为例如30天,因为会话还存储身份验证信息,因为这可能只是服务器的过度杀伤。对于访客用户,我需要在email
表中使password
和users
可以为空,这听起来像是一种不好的做法(不要更改你不拥有的代码类型的事物。)
有没有其他方法可以解决这个问题?识别访客用户并将其与匿名购物车绑定的最佳和最安全的做法是什么?最后,如果我要使用Laravel会话,使用database
个会话或更确切地说file
会话是否有意义?我需要对customers
,carts
或cart_items
表格进行任何更改吗?
P.S。我知道Laravel 做的购物车包存在,但到目前为止我还没有找到一个包含匿名+认证购物和/或与users
表集成的购物车。