【问题标题】:How to use Jenssegers Optimus in Laravel Models?如何在 Laravel 模型中使用 Jenssegers Optimus?
【发布时间】:2017-05-26 09:49:31
【问题描述】:

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

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

例如:

use Jenssegers\Optimus\Optimus;

    class ResponseController extends Controller
    {
        protected $optimus;

        public function __construct(Optimus $opt)
        {
            $this->optimus = $opt;

        }

        public function index()
        {

            $labels = Label->get();

            foreach ($labels as $key => $label){
              $label->id = $this->optimus->encode($label->id);
              $labels[$key] = $label;
            }

            return view('responses/index', compact('labels'));
        }

        public function show($id)
        {
            $id = $this->optimus->decode($id);

            $label =  Label::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 的包就是为了做到这一点。我试图在我的项目中实现它,但没有奏效。我很确定我可以自己处理它,因为这似乎是一项简单的任务。

【问题讨论】:

  • 请用确切的错误更新您的问题,以便我们对其发表评论
  • @Gayan 当然。我没有把它放在那里,因为我丢失了我的特征文件。很快我将重新创建它以重现错误。回到家后,我会更新我的问题。谢谢
  • @Gayan 我刚刚添加了完整的错误。

标签: php laravel eloquent


【解决方案1】:

Get mutators(AKA 访问器)与单个参数一起调用。这就是为什么您会收到 expected to be a type of Jenssegers\Optimus\Optimus 错误,因为在调用访问器或修改器时(就像控制器一样),框架没有注入 Jenssegers\Optimus\Optimus

只需从源代码(2632 行)中阅读此 sn-p:

  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);
        }

        //...    
    }

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

 protected function mutateAttribute($key, $value)
    {
        return $this->{'get'.Str::studly($key).'Attribute'}($value);
    }

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

解决方案

你可以试试这样的:

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

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

【讨论】:

  • 哦。实际上我认为这可能是问题所在。我看到文档示例只传递了一个参数,但我不确定是否只允许一个参数。我尝试使用 encode 作为 Optimus 的静态方法,它显然不起作用。回家后我会测试你的解决方案。
  • @Leandro 我没有测试建议的解决方案,但是从容器中获取 Optimus 实例是可行的方法。 --- Eu não testei ainda, mas obter a instância do Optimus do container é a direção certa。
猜你喜欢
  • 2018-12-28
  • 2018-07-10
  • 1970-01-01
  • 2019-08-27
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2020-10-17
相关资源
最近更新 更多