【发布时间】: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 我刚刚添加了完整的错误。