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

2023-12-20

好吧,大约一年前,我编写了一个网络应用程序,可以帮助为我父亲的公司组织约会。现在他“没有它就无法做生意”。我决定建立一个 SAAS 订阅模式并向公众开放。

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

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

我研究过多租户,但我不确定这是否适合这个。我认为“gmail”风格的方法会更好。登录后用户将看到其自定义仪表板和仅其数据的一个应用程序/域。

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

我想我的问题是有人能给我指出正确的方向,如何最好地处理 Laravel 中的每月付款订阅吗?我所困扰的并不是代码,而是我到底需要构建什么来处理每月向客户收费并在计费失败时拒绝他们的访问等。

Thanks


你需要大量的阅读和大量的工作!

首先,让我们暂时完全忽略计费方面 - 归根结底,应用程序的这一部分确实相当微不足道。取出一页37信号Rework http://37signals.com/rework(第 93 和 94 页)并在开始实施之前启动您的产品并提供 30 天免费试用(那时您应该知道如何实施)。

其次,为什么你认为“gmail”不使用多租户,URI 结构没有告诉任何底层数据库结构。我相当有信心他们不会为每一位客户克隆数据库模式。因此,您可能已经回答了自己的问题 -您想要实施多租户.

您将想要抽象您的数据库(和应用程序架构),老实说,没有比 Taylor Otwell(Laravel 的创建者)的书更好的资源来帮助您实现这一目标了。Laravel:从学徒到工匠 https://leanpub.com/laravel。他的书不适合初学者,当你读完它时,你应该能够自己回答这个问题。

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

考虑检查访问组织的权限作为用户身份验证的另一层。对于每个请求,您都将检查该用户是否可以访问特定组织。您可能还会检查以确保该组织仍然处于活动状态(是否因为他们没有付款而过期?)这将在每次请求时再次发生,并且可能会出现以下情况:Laravel 内的过滤器 http://laravel.com/docs/routing#route-filters.

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

我不了解你,但我很偏执,如果我不确定那个用户号码,我晚上就睡不好觉4506无法看到自己不属于的组织的数据。确保这一点的唯一真正好的方法是通过单元测试,如果您还没有这样做,我强烈建议您学习。

在 Laravel 4 中执行此操作的最佳方法是阅读 Jeffrey Way 的书Laravel 测试解码 https://leanpub.com/laravel-testing-decoded。这本书非常先进,但如果你很好地掌握了基础知识,仍然很容易理解。

最后但并非最不重要的一点是,最重要的一件事是参与社区——我建议最简单的方法就是闲逛#laravel IRC 频道 http://laravel.io/irc(自由节点)。问一些问题,也许回答一些问题,频道中的每个人都非常友善且反应灵敏。

您肯定会经历一次冒险,不要害怕提出问题和犯错误。祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Laravel 4 中构建 SAAS 的正确方法 的相关文章

  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • Laravel 4 使用资源控制器轻松删除记录

    我是 Laravel 框架的新手 但我真的很喜欢它 我最大的问题是我一直在寻找如何使用资源控制器删除单个记录 控制器方法 public function destroy id department Department find id de
  • PHP Laravel:未找到特征

    我在命名空间和使用方面遇到一些问题 我收到此错误 未找到特征 Billing BillingInterface 这些是我的 Laravel 应用程序中的文件 计费 php namespace Billing BillingInterface
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • .NET 的 BLOB 分布式存储?

    我正在寻找一个经过相当好的测试的库 服务器来存储持久的分布式哈希表 我对使用基于 SQL 的解决方案犹豫不决 因为数据是高度面向文档的 由数百万个约 64KB 的 blob 组成 只有一个索引 由所述 BLOB 的哈希计算 并且需要能够进行
  • 致命错误:PHP 从版本 7.0 升级到 7.2 后找不到类“SoapClient”

    我升级了PHP 7 0 to 7 2在Ubuntu中 执行升级后 我安装了 Laravel 5 6 升级之前 类 SoapClient 是true 但是升级之后 我遇到了 致命错误 未找到 SoapClient 类 我检查了php ini
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • 如何使用 Laravel IoC 将数据库注入构造函数

    我想使用 DB 类与 IoC 容器进行事务处理 use Illuminate Database Connection as DB public function construct DB db this gt db db 但是当使用 db
  • 创建费用前验证 CVC 代码

    我正在尝试检查用户输入的 cvc 代码 我已经存储了条带 customer id 和条带 card id 我想在向用户收费之前验证 CVC 代码 以下是创建费用的代码 charge Stripe Charge create amount g
  • Laravel - 保存在存储文件夹中的图像不向用户显示

    我有这段代码可以将图像保存在 storage app uploads 文件夹中 image main Image where property id id gt get file request gt file file destinati
  • Eloquent 模型中的 UUID 主键存储为 uuid 但返回为 0

    我有一个 mysql 表 其中使用 UUID 作为主键 这是创建迁移 Schema create people function Blueprint table table gt uuid id table gt primary id ta
  • 如何在自定义组件中使用 Vue.js 插件?

    我需要输出一个表格及其内容 可以通过 Ajax 进行更新 所以我打算使用vue tables 2 https github com matfish2 vue tables 2 https github com matfish2 vue ta
  • Laravel 验证规则仅针对字母

    我正在尝试添加验证规则以仅接受信件 我正在使用regex规则 但它仍然不起作用 下面是我的代码 Validate request input this gt validate request name gt required regex p
  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • SQLite中的ROWID是自动设置的吗?

    所以 我在 Ionic 上有这个应用程序 它使用SQLite ngCordova 插件 https github com litehelpers Cordova sqlite storage用于内部存储 在其上 我使用以下命令创建一个表 d
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array

随机推荐

  • 我可以在改造方法声明中使用可变参数吗?

    我有一个 API 端点 定义为 GET https api server com something id or ids where ids可以是一个单个对象 IDor以逗号分隔的 ID 列表 e g https api server co
  • uint 数据类型的 ODP .NET 参数问题

    从本机 NET oracle 数据提供程序更新到 Oracle ODP NET 后 我遇到了以下问题 我有一个存储过程 它是包的一部分 它接受 32 个参数 除了一个指定为 OUT 参数之外 全部为 IN 参数 无论如何 这是我遇到的问题
  • Android Gcm 接收器/Gcm 侦听器服务在接收时强制应用程序到前台

    我在 Android 最低 SDK 15 上实现 GCM 时遇到了问题 我完全能够接收来自 GCM 的推送通知 并且我的GcmListenerService实施已发挥作用onMessageReceived 打回来 但我的问题是 每当一个或另
  • 如何在 Spring IoC XML 配置中从 web.xml 获取显示名称

    准确地说 我怎样才能得到的值
  • 我可以将 UIToolbar 项目居中吗?

    我正在 UIToolbar 上放置一个标签 根据此提示 将 UILabel 添加到 UIToolbar https stackoverflow com questions 333441 adding a uilabel to a uitoo
  • 使用 ACCOUNT_FORMS 覆盖 Django allauth 登录表单

    我已经用简单的设置变量覆盖了注册表单ACCOUNT SIGNUP FORM CLASS但要覆盖您需要使用的登录表单ACCOUNT FORMS login yourapp forms LoginForm 我有我想要的表单 并且它可以通过 Cr
  • Java对象的内存分配过程的步骤

    当一个类实例化以下对象时 内存中会发生什么 public class SomeObject private String strSomeProperty public SomeObject String strSomeProperty th
  • 如何区分USB设备类型?

    读完后这个问题 https stackoverflow com questions 68749 working with usb devices in net关于使用 USB 设备 我想知道操作系统使用什么方法来区分 USB 设备类型 例如
  • 重新映射键的热键不会触发热字符串

    我有一个热键和热字符串似乎不能一起工作 9 ob0 left 1 为了提供一些上下文 在代码的一部分中 我将所有符号重新映射到它们下面的数字 反之亦然 所以9打印括号 后来 我放置了一个热字符串 该热字符串将在左括号后键入右括号 然后将光标
  • 如何制作具有最小高度的可扩展div

    如果我有一个高度 100 和宽度 100 的div 它的背景颜色将主要取决于浏览器的高度和宽度 但是 如果该 div 内的内容动态增长 则该 div 将不会根据内容扩展 文本将重叠并流过该 div 另一方面 如果我将 min height
  • 将“任何 CPU/首选 32 位”设为 VS 中的默认构建设置背后的基本原理

    假设在 x64 Windows 机器上使用最新版本的 Visual Studio 和 C 并分配大量数据 果然 当使用默认构建设置进行编译时 如下图所示为 VS 2019 Preview 2 1 当进程达到 4 GB 时 您将耗尽用户虚拟地
  • 多线程性能超越核心

    如果我有一个启动的进程X线程数量 是否会有性能增益X高于数量CPU核心 假设所有线程都同步工作 没有对存储 网络的异步调用 例如 如果我有两个核心CPU 我会减慢应用程序启动 3 个以上持续工作线程的速度吗 这实际上取决于您的代码的作用 它
  • gitignore 不忽略文件夹

    在我的项目的根目录中我有一个foo文件夹 在 的里面foo文件夹我有一个bar文件夹 我想忽略对我的内部所有文件的所有更改bar文件夹 我的里面有这个gitignore foo bar 检查该文件夹 它存在并且包含要忽略的文件 gitign
  • 此版本的 Microsoft.AspNetCore.All 仅与 netcoreapp2.1 目标框架兼容

    当我从 2 0 升级到 NET Core 2 1 后尝试将应用程序发布到 Web 服务器时 收到以下消息 此版本的 Microsoft AspNetCore All 仅与 netcoreapp2 1 目标框架兼容 请以 netcoreapp
  • 在 DOM 元素上调用自定义方法

    我想在 DOM 元素上调用自定义方法 像这样 div div 我该如何开发这个问题 是否有必要使用jQuery 您不需要使用 jQuery 您可以使用document getElementById MyObject 获取 DOM 节点的引用
  • 加载库 193

    我正在创建一个 C CLI dll 它将加载到旧版 C 应用程序中 遗留应用程序通过传统的 LoadLibrary 调用来完成此操作 应用程序和 C CLI dll 均以 64 位模式编译 当发生 LoadLibrary 调用时 它会失败并
  • Rails 中的社交网络 - 哪个框架

    我应该使用 社区引擎 Insoshi 少爱 轨道空间 自己卷 我希望快速建立一个支持移动浏览的社交网络 虽然我熟悉 Ruby 和 Rails 但我不是专家 已经构建了一些基本的 Rails 应用程序 已经编写了一堆用于企业集成的 Ruby
  • 创建方案 .avsc Avro 时出现问题

    我在创建 avro 方案时遇到问题 下面我将放置我的方案 推特 avsc type record name twitter schema namespace com miguno avro fields name id type recor
  • 发送 X11 点击事件不适用于某些窗口

    以下代码片段在大多数情况下都有效 除了在某些窗口中 例如 在最新的 Ubuntu 下 它无法在文件资源管理器中选择文件夹 它似乎在其他地方都适用 但这个差距是巨大的 我怀疑这与我使用 XQueryPointer 的方式有关 但我已经尝试了几
  • 在 Laravel 4 中构建 SAAS 的正确方法

    好吧 大约一年前 我编写了一个网络应用程序 可以帮助为我父亲的公司组织约会 现在他 没有它就无法做生意 我决定建立一个 SAAS 订阅模式并向公众开放 它目前基于 codeigniter 和 php 构建 我认为这不太适合 SAAS 版本