PHP 7 和 Laravel 8 使用私有变量序列化模型

Posted

技术标签:

【中文标题】PHP 7 和 Laravel 8 使用私有变量序列化模型【英文标题】:PHP 7 and Laravel 8 serialize model with private variables 【发布时间】:2021-07-29 02:42:43 【问题描述】:

我正在将一个项目从 php 5.4、Laravel 4.2 升级到 PHP 7.4、Laravel 8。

使用 PHP 5.4 和 Laravel 4.2,我会 serialize() 具有关系和私有变量的模型 存储在redis中。当用户完成更改后,我们存储到 DB 并从 redis 中删除。 对于 PHP 5.4 和 Laravel 4.2,使用 serialize() 效果很好。

对于 PHP 7.4 和 Laravel 8,使用 serialize() 不包括我的模型中的私有变量 序列化时。我需要将我的模型与所有加载的关系和私有变量一起存储在 redis 中 当用户与模型交互时。

如何让 PHP 7.4 和 Laravel 8 序列化我的模型,包括私有变量?

class MyParent extends Model

  private $privatevalueone = 1;
  private $privatevaluetwo = 2;
  
  public function childeh()
   return $this->hasOne('ChildEh'); 
  
  public function childbee()
   return $this->hasMany('ChildBee'); 
  
  public function childsea()
   return $this->hasMany('ChildSea'); 
  
  // there are a total of 11 relations

  public function calc()
  
    // - does calculations that can change model properties in relations
    //   and properties in the parent model.
    // - stores values needed while the model is cached using private variables,
    //   the private variables are only needed while cached and not needed when
    //   written to DB
  



/**
 * With PHP 5.4, Laravel 4.2, using serialize preserved
 * the entire model, including private variables in the model
 *
 * With PHP 7.4, Laravel 8, using serialize does not
 * include the private variables in the model,
 */
public function cacheSet($key, $model)

  Redis::set($key, serialize($model));


public function cacheGet($key)

  return unserialize(Redis::get($key));

【问题讨论】:

php.net/manual/en/function.get-object-vars.php 也是积累私人会员的良好开端。还要检查 __serialize() 魔术方法php.net/manual/en/language.oop5.magic.php#object.serialize 【参考方案1】:

感谢@nice_dev 的回复。 我的解决方案是将以下特征添加到我的模型中,它可以执行您所引用的操作:

\Illuminate\Queue\SerializesModels

【讨论】:

以上是关于PHP 7 和 Laravel 8 使用私有变量序列化模型的主要内容,如果未能解决你的问题,请参考以下文章

作曲家和 laravel 7 不适用于 php 8.1 [关闭]

PHP 致命错误:未捕获的错误:使用 Laravel 5.8 和 PHP 7.4 调用未定义函数 Whoops\Exception\xdebug_is_enabled()

laravel 安装步骤

Zend Opcache 不缓存所有文件(CentOS 6.7 + Nginx 1.8.1 + PHP 7 + Laravel 5.1)

使用 Laravel 在控制器中使用私有变量

Laravel 5.8 - 时区环境变量