Laravel还是流明只读模型?
我们的系统中有一些表是使用第三方API提供的,我们的系统应该只从这些表中读取数据,从不插入或更新任何内容 在Laravel/Lumen中是否有任何功能,我们可以在模型中提到禁止/禁用插入/更新查询,就像我们有选项public$timestamps=false一样;要禁用时间戳Laravel还是流明只读模型?,laravel,eloquent,lumen,Laravel,Eloquent,Lumen,我们的系统中有一些表是使用第三方API提供的,我们的系统应该只从这些表中读取数据,从不插入或更新任何内容 在Laravel/Lumen中是否有任何功能,我们可以在模型中提到禁止/禁用插入/更新查询,就像我们有选项public$timestamps=false一样;要禁用时间戳 这些表位于同一数据库中,否则我们将基于MySQL用户进行限制。最安全的方法是使用创建第二个MySQL用户。 然后在Laravel中,您可以在config/database.php中创建与受限MySQL用户的特定连接 然后在
这些表位于同一数据库中,否则我们将基于MySQL用户进行限制。最安全的方法是使用创建第二个MySQL用户。
然后在Laravel中,您可以在
config/database.php
中创建与受限MySQL用户的特定连接然后在模型中,通过
受保护的$connection
属性指定所需的连接。是
作为一种安全的方式:
正如您可以限制数据库上的某些操作一样
只读模型
但你也可以禁用雄辩的模型
laravel模型是从illumb\Database\elount\Model
您可以从模型扩展ReadOnlyModel
然后从该类扩展您想要的任何模型
这个类应该覆盖在db中写入数据的任何方法
因此,我遵循源代码:
Update和updateOrFail、push等使用Model->save()
方法
create、creteOrFail、delete等是Builder中使用Model->save()方法的地方
save()方法将performUpdate或performInsert与someevent触发一起使用
所以,要阻止模型接触数据库,最简单的方法是实现:
<?php
namespace App\ReadOnlyDB;
use Illuminate\Database\Eloquent\Model;
/**
* Just Extend all of Your Models from This Class
*
*/
class ReadOnlyModel extends Model
{
public function save(){
// do nothing
}
}
我认为唯一正确的管理方法是在MySQL用户端设置访问限制。原因如下:
如果要从Eloquent类中存根(禁用)save/update方法,则只能禁用自己代码的save/updates。这类似于将钥匙挂在车门把手上时锁定车门。没有什么可以阻止您进行保存/更新,因为您不一定要使用Eloquent类
此外,第三方软件包可能会保留不依赖于您的代码的数据。您基本上必须检查他们的每一行代码,以确保您的数据库没有更新
因此,在数据库用户级别应用这些限制。然后,当您(或任何其他人)的代码出于某种原因调用$myModel->save()
时,您将面临来自ORM的异常,该异常表示您没有权限。然后,相应地处理它(如返回特定的HTTP状态代码)
创建具有只读权限的其他mySql用户
在.env文件中添加以下内容
'mysql2' => [
'driver' => env('DB_CONNECTION_SECOND'),
'host' => env('DB_HOST_SECOND'),
'port' => env('DB_PORT_SECOND'),
'database' => env('DB_DATABASE_SECOND'),
'username' => env('DB_USERNAME_SECOND'),
'password' => env('DB_PASSWORD_SECOND'),],
DB\u CONNECTION\u SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_端口_秒=3306
DB_DATABASE_SECOND=数据库
DB_USERNAME_SECOND=用户_2
DB_PASSWORD_SECOND=机密
在config/database.php中添加以下内容
'mysql2' => [
'driver' => env('DB_CONNECTION_SECOND'),
'host' => env('DB_HOST_SECOND'),
'port' => env('DB_PORT_SECOND'),
'database' => env('DB_DATABASE_SECOND'),
'username' => env('DB_USERNAME_SECOND'),
'password' => env('DB_PASSWORD_SECOND'),],
在控制器中指定连接名称
数据库::连接('mysql2')->选择(…)
有几种方法。
选项1:可能最快的是这种“只读”模型特性
它保护你不受
- 创造
- 强制创建
- 拯救
- 更新
- 第一个或创造
- firstOrNew
- 删除
- 毁灭
- 恢复
- 强制删除
- performDeleteOnModel
- 推
- 完成保存
- 穿孔
- 触碰
- 插入
- 截断
选项2:db配置和模型连接上有一种完全不同的方法。这有两个部分
project/config/database.php
复制并调整数据库连接
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
...
'readonly' => [
'driver' => 'mysql',
'read' => [
'host' => env('DB_HOST', '127.0.0.1')
],
'write' => [
'host' => 'this.will.404'
],
...
project/app/MyReadOnlyModel.php
class MyReadOnlyModel extends Model
{
protected $connection = 'readonly';
...
}
如果您陷入了希望模型有时可写的陷阱。。。我建议在同一张桌子上放两个型号
app/Normal/MyModel.php
class MyReadOnlyModel extends Model
{
protected $connection = 'readonly';
...
}
app/ReadOnly/MyModel.php
class MyReadOnlyModel extends Model
{
protected $connection = 'readonly';
...
}