数据库
使用数据库
你几乎肯定希望应用程序持久化结构化数据。为此,NativePHP 支持 SQLite,它在 iOS 和 Android 设备上都能工作。
你可以用你习惯的任何方式从 PHP 与 SQLite 交互。
配置
你不需要做任何特殊的事情来配置应用程序使用 SQLite。NativePHP 将自动:
- 在构建应用程序时切换到使用 SQLite。
- 在应用容器中为你创建数据库。
- 根据需要在应用每次启动时运行迁移。
迁移
编写迁移时,你需要考虑使用 SQLite 的任何特殊建议。
例如,在 Laravel 11 之前,SQLite 外键约束默认是关闭的。如果你的应用程序依赖于外键约束,你需要在运行迁移之前启用 SQLite 对它们的支持。
在发布更新之前,在生产构建上测试你的迁移很重要! 你不希望在用户更新应用时意外删除他们的数据。
使用迁移填充数据
迁移是在移动应用程序中填充数据的完美机制。它们提供了你想要的数据填充自然行为:
- 运行一次:每个迁移在每次安装时只运行一次。
- 跟踪:Laravel 跟踪哪些迁移已执行。
- 版本化:新的应用版本可以包含新的数据填充迁移。
- 可逆:你可以创建迁移来删除或更新种子数据。
创建种子迁移
为填充数据创建专用迁移:
php artisan make:migration seed_app_settingsuse Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
public function up()
{
DB::table('categories')->insert([
['name' => 'Work', 'color' => '#3B82F6'],
['name' => 'Personal', 'color' => '#10B981'],
]);
}
};彻底测试
这是发布新版本应用时最重要的步骤,尤其是有新迁移时。
你的迁移应该对首次安装(或重新安装)应用的用户_以及_已将应用更新到新版本的用户都能工作。
确保你在用户数据库可能处于的不同场景下测试你的迁移。
注意事项
- 由于你的应用安装在单独的设备上,你无法远程访问数据库。
- 如果用户从设备上删除你的应用程序,任何数据库也会被删除。
我可以获得 MySQL/Postgres/其他支持吗?
不可以。
SQLite 是唯一支持的数据库驱动是一个深思熟虑的安全决定,以防止开发人员意外地将生产数据库凭据直接嵌入移动应用程序。为什么?
- 移动应用分发到用户设备并且可以被逆向工程。
- 嵌入应用中的数据库凭据可能对任何拥有应用二进制文件的人都是可访问的。
- 直接数据库连接绕过了速率限制和访问控制等重要安全层。
- 网络连接问题使移动设备的直接数据库连接不可靠,并且可能对你的数据库造成麻烦。
API 优先
如果你的应用程序的关键部分依赖于在中央数据库和客户端应用之间同步数据,我们强烈建议你通过移动应用可以通信的安全 API 后端来实现。
这提供了多种安全和架构优势:
安全优势:
- 数据库凭据永远不会离开你的服务器
- 实施适当的身份验证和授权
- 速率限制和请求验证
- 所有数据访问的审计日志
- 能够立即撤销访问权限
技术优势:
- 更好的错误处理和离线支持
- 更容易扩展和维护
- 为向后兼容性版本化你的 API
- 专门为移动消费转换数据
保护你的 API
出于同样的原因,你不应该在 .env 文件或应用代码的其他地方共享数据库凭据,你也不应该存储 API 密钥或令牌。
如果有的话,你应该提供一个仅允许客户端应用请求令牌的客户端密钥。一旦你验证了用户,你可以将访问令牌传递回移动应用,并使用它与你的 API 通信。
使用 SecureStorage API 将这些令牌安全地存储在用户设备上。
确保这些令牌具有高熵值以便它们很难被猜测,并且生命周期短,这是一个好的做法。生成令牌很便宜;泄露个人客户数据可能会变得_非常_昂贵!
使用行业标准工具,如基于 OAuth-2.0 的提供商、Laravel Passport 或 Laravel Sanctum。
推荐
Laravel Sanctum 是移动应用和 Laravel 后端之间 API 身份验证的理想解决方案。它提供安全的、基于令牌的身份验证,而没有 OAuth 的复杂性。
注意事项
在你的移动应用中:
- 始终使用
SecureStorage存储 API 令牌 - 对所有 API 通信使用 HTTPS
- 使用 SQLite 在本地缓存数据以实现离线功能
- 在进行 API 调用之前检查连接性
在 API 端:
- 使用基于令牌的身份验证
- 实施速率限制以防止滥用
- 验证和清理所有输入数据
- 使用带有适当 SSL 证书的 HTTPS
- 记录所有身份验证尝试和 API 访问