Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel还是流明只读模型?_Laravel_Eloquent_Lumen - Fatal编程技术网

Laravel还是流明只读模型?

Laravel还是流明只读模型?,laravel,eloquent,lumen,Laravel,Eloquent,Lumen,我们的系统中有一些表是使用第三方API提供的,我们的系统应该只从这些表中读取数据,从不插入或更新任何内容 在Laravel/Lumen中是否有任何功能,我们可以在模型中提到禁止/禁用插入/更新查询,就像我们有选项public$timestamps=false一样;要禁用时间戳 这些表位于同一数据库中,否则我们将基于MySQL用户进行限制。最安全的方法是使用创建第二个MySQL用户。 然后在Laravel中,您可以在config/database.php中创建与受限MySQL用户的特定连接 然后在

我们的系统中有一些表是使用第三方API提供的,我们的系统应该只从这些表中读取数据,从不插入或更新任何内容

在Laravel/Lumen中是否有任何功能,我们可以在模型中提到禁止/禁用插入/更新查询,就像我们有选项public$timestamps=false一样;要禁用时间戳


这些表位于同一数据库中,否则我们将基于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';
    ...
    }