当前位置: 首页 > 知识库问答 >
问题:

在Laravel 4中构建SAAS的正确方法

杨俊茂
2023-03-14

好吧,大约一年前,我写了一个网络应用程序,帮助我父亲的公司安排约会。他现在“没有它就做不成生意”。我决定用它建立一个SAAS订阅模型,并向公众开放。

它目前建立在codeigniter和php上,我认为这不适合SAAS版本。我计划在laravel 4中从头开始重建它,并使用stripe作为支付网关。

我关心的是如何最好地处理多个客户机的数据库/应用程序结构。目前,它只服务于一家公司,非常抽象,而且是针对我父亲的公司需要的。我需要它能够根据使用它的业务处理不同的数据。

我已经研究过多租户,但我不确定这是否适合这种情况。我认为“gmail”方式会更好。一个应用程序/域,用户登录后将看到他们的定制仪表板,只有他们的数据。

在我陷入编码之前,我需要找出如何最好地在一个数据库上处理多个“账户”。我不想为每个用户创建一个表,也不想为每个用户创建一个数据库。

我想我的问题是,有谁能给我指出正确的方向,让我知道如何最好地处理Laravel的月度付款订阅?与其说是我在纠结代码,不如说是我需要构建什么来处理每月向客户收费,以及在计费失败时拒绝他们访问等问题。

谢啦

共有2个答案

戚京
2023-03-14

作为一个粗略的概述,我将有一个客户端表和一个订阅表。任何其他需要存储的数据,如联系人或约会,都可以使用外键与客户端表相关联。

在laravel中,您可以使用ORM获取当前登录的客户端,然后通过关系获取属于它们的约会和联系人。

cartalyst的laravel有一些有用的工具。com,包括sentry和sentry social for user auth,以及将用户帐户与facebook/google/twitter等集成。

Stripe将允许你配置经常性的支付,并将通知你通过web钩子每次有支付企图.你可以在支付表中记录这些,并将它们与用户/客户关联.你可以用它来跟踪谁已经支付,以及最近。

此外,请记住,您可能不想在付款失败时立即取消帐户。

Stripe会重新尝试,你最好的回应可能是在延迟两三天之后,或者你收到一个无效的卡通知后,与客户联系,并提示他们更新付款详细信息。

这也可能是一个检查他们最后一次登录的机会。如果是一个多月前,你可以给他们一个免费的月,并提醒他们你的应用程序能为他们做多少。通过这样做,你也许能让人们继续使用(并支付)他们忘记订阅的东西。

许安邦
2023-03-14

你会有很多阅读和大量的工作!

首先,让我们暂时完全忽略这个应用程序的计费方面——归根结底,应用程序的这一部分实际上相当微不足道。从37signals Rework(第93页和第94页)中抽出一页,在你开始实施之前(你应该知道如何实施)推出你的产品,免费试用30天。

第二,为什么你认为“gmail”不使用多租户,URI结构与底层数据库结构无关。我很有信心,他们并不是在为每个客户克隆数据库模式。因此,您可能已经回答了自己的问题——您想要实现多租户。

你会想要抽象你的数据库(和应用程序架构),老实说,没有比泰勒·奥特威尔(Laravel的创造者)的书《Laravel:从学徒到工匠》更好的资源来帮助你做到这一点。他的书不适合初学者,当你读完它的时候,你可能已经能够自己回答这个问题了。

您不会为每个用户创建一个表或数据库,甚至不会为每个组织创建一个表或数据库。相反,您将在代码中创建抽象数据库结构,这将从数据库中提取用户数据。

将检查访问组织的权限视为另一层用户身份验证。在每个请求中,您都将检查该用户是否可以访问特定的组织。您可能还会检查以确保该组织仍然活跃(它过期是因为他们没有付费吗?)这将在每个请求中再次发生,并且可能在laravel中使用过滤器。

这就引出了开发SaaS应用程序的下一个非常重要的因素。

我不知道你的情况,但我有妄想症,如果我不确定用户号4506看不到他不属于的组织的数据,我晚上就睡不好觉。确保这一点的唯一好方法是通过单元测试,如果你还没有单元测试,我强烈建议你学习单元测试。

在Laravel 4中做到这一点的最好方法是阅读Jeffrey Way的书Laravel测试解码。这本书非常先进,但如果你对基础知识有很好的掌握,仍然很容易理解。

最后但并非最不重要的一点是参与社区——我建议最简单的方式就是在#laravel IRC频道(freenode)上闲逛。问一些问题,也许回答一些问题,频道里的每个人都很好,反应迅速。

你肯定是在冒险,不要害怕问问题和犯错误。祝你好运

 类似资料:
  • 我尝试在Spring Boot应用程序中配置apache kafka。我阅读了这篇文档,并按照以下步骤操作: 1)我将以下行添加到: 2)我创建新主题:

  • 我正在处理一个数据库,我用AutoCloseabe的extends创建了一个名为Dao的公共接口,所以我有一个实现这个接口的类,但我想在那里创建一些私有方法,但它们仍然需要Autocloseable。所以我的问题是,我不能在接口中创建私有方法而不在接口中定义它们。如果我在类中创建一个私有方法,但不从DAO重写,就会发生这种情况?他们不会有自动关闭的,是吗?。如果没有,我可以实现哪种解决方案?

  • 好吧,这看起来有点傻,但是我很难找到一个函数来从切片的内容返回静态大小的数组。 关于阵列和切片的铁锈书章节对此一无所知。(它确实显示了如何从数组中获取切片,但我想换一种方式。)我还检查了和的文档,但是如果它在那里,我就看不到它了。 当然,可以一个接一个地写下每个元素,但这似乎很荒谬。现在,我最终写了一个python单行线来为我做这件事。 所以我最后得到了这个: 我想知道是否有合适的方法,比如或者类

  • 所以这就是我试过的。有更好的方法吗?

  • 我正在尝试构建一个通过Lettuce与redis通信的Denodo java存储过程。 我正在使用Denodo 4e eclipse extension和Denodo推荐的oxygen。 我显然遗漏了一些东西,因为所有的文档都表明 而且 抛出的错误被调试方法所掩盖,我所知道的是,在第一个实例中,构建器失败,在第二个实例中,客户端失败。 当我调用redis-cli时,我看到redis正在以127.0

  • 我们有一个C#可执行文件,它加载一个用C++编写的32bit dll,它动态加载另一个32bit dll(第一个dll是包装器)。 当它构建在32位机器上(使用VS toolset v100)时,它都能正常工作。