Php 如何在Laravel模型中使用Jenssegers Optimus?

Php 如何在Laravel模型中使用Jenssegers Optimus?,php,laravel,eloquent,Php,Laravel,Eloquent,我正在使用Jenssegers Optimus包来混淆我的URL 目前,我正在处理get请求的每个控制器中调用它。问题是,我需要在控制器中的几乎所有方法中不断地编码和解码我的ID 例如: 我考虑创建访问器和变异器,以便始终加密我需要在URL中混淆的模型的ID。所以我把它们放在一个特性中,以重用代码。我试过: use Jenssegers\Optimus\Optimus; trait EncodeId{ public function getIdAttribute($

我正在使用Jenssegers Optimus包来混淆我的URL

目前,我正在处理get请求的每个控制器中调用它。问题是,我需要在控制器中的几乎所有方法中不断地编码和解码我的ID

例如:

我考虑创建访问器和变异器,以便始终加密我需要在URL中混淆的模型的ID。所以我把它们放在一个特性中,以重用代码。我试过:

  use Jenssegers\Optimus\Optimus;

    trait EncodeId{

       public function getIdAttribute($value, Optimus $optimus)
       {

        return $optimus->encode($value);
       }

    }
然后我把这个特性添加到我的模型中。然而,Laravel会抛出一个错误,抱怨方法定义中的Optimus$Optimus。它说$optimus应该是Jenssegers\optimus\optimus的一种类型,尽管我已经声明了它。这对控制器很管用,但显然对模型不管用。或者我不应该尝试在这种情况下使用特征

以下是实际错误:

FatalThrowableError in EncodeId.php line 10:
Type error: Argument 2 passed to App\Label::getIdAttribute() must be an instance of Jenssegers\Optimus\Optimus, none given, called in /home/../vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2734
如果我可以在模型级别使用Optimus模糊处理,而不是在控制器中多次调用其编码和解码函数,那将是非常好的

还有另一个叫做FakeID的软件包就是用来做这个的。我试图在我的项目中实现它,但没有成功。我很肯定我自己能处理,因为这似乎是一项简单的任务

Get mutators(又名访问器)与单个参数一起调用。这就是为什么在调用acessor或mutator(像控制器一样)时,框架不会注入
错误,因此
应该是一种jensegers\Optimus\Optimus
错误

只需从源代码(第行)中阅读以下代码片段:

现在调用
$this->mutateAttribute($key,$value)(第行)

你现在明白了吗? Acessor/get mutator只随一个参数一起调用:
$value

解决方案

您可以尝试以下方法:

public function getIdAttribute($value)
{
    return app(Optimus::class)->encode($value);
}

从容器(
app()
)调用Optimus实例就可以了。

请用确切的错误更新您的问题,以便我们对其进行评论it@Gayan当然我没有把它放在那里,因为我的特征文件丢了。很快我将重新创建它以重现错误。回到家后,我会更新我的问题。Thanks@Gayan我刚刚添加了全部错误。事实上,我认为这可能是问题所在。我看到doc示例只传递了一个参数,但我不确定是否只允许传递一个参数。我尝试使用编码作为Optimus的静态方法,但显然不起作用。我一到家就要测试你的解决方案。@Leandro我还没有测试建议的解决方案,但从容器中获取Optimus实例是一个不错的选择在欧洲,马斯获得了一份证书。
  public function getAttributeValue($key)
    {
        $value = $this->getAttributeFromArray($key);
        // If the attribute has a get mutator, we will call that then return what
        // it returns as the value, which is useful for transforming values on
        // retrieval from the model to a form that is more useful for usage.
        if ($this->hasGetMutator($key)) {
            return $this->mutateAttribute($key, $value);
        }

        //...    
    }
 protected function mutateAttribute($key, $value)
    {
        return $this->{'get'.Str::studly($key).'Attribute'}($value);
    }
public function getIdAttribute($value)
{
    return app(Optimus::class)->encode($value);
}