Laravel-需要从模型中访问BaseController中的全局变量集


Laravel - Need to access a global variable set in BaseController from within a model

我正在创建一个更改日志记录系统,用于复制对表所做的更改。这个函数本质上使用了beforeUpdate()钩子,并允许我在ChangeLog中为该表复制旧数据。我还想用一些特定的信息来标记它,比如发出请求的IP地址和发出请求的用户ID。

用户id存储在BaseController类内部的一个全局变量中,任何使用$this->userId的控制器都可以访问该全局变量,但是,我不想将该用户id显式传递给每个模型调用,所以我希望能够使用我的各种模型访问$this->userId,但laravel模型显然不允许你通过引用$this->userId来与控制器进行这种对话。

有人能告诉我怎么做吗?我挖了好几个小时都找不到能满足我需要的东西?

非常感谢,Wade

基本上,如果你不想传递依赖项,你有两种方法:

1-使用会话:你可以将ID存储在会话中,并在你想要的任何地方获得它

2-创建一个服务提供商或类来存储您想要的数据,并在稍后使用应用程序注册表检索:

为此,您可以创建一个类来存储数据,然后将实例绑定到服务容器上:

$service = new ServiceClass( $id );  //this will contain the data you need: i.e the ID
$app->instance('your_key', $service);  //store the instante in the IoC Container 

现在,您可以使用在任何地方取回实例

$service = $app->make('your_key');

你也可以创建一个立面来访问它

最后要注意的是:以这种方式编写的代码闻起来像"糟糕的全局性东西",所以你应该考虑将依赖性传递给你的模型,只要你能

通过创建范围,您可以在模型中获得userID值。例如,在文章模型中,如果我想检查文章的作者是否是当前用户,我可以将自己的范围设置为:

public function scopeUserid($query,$id){
    $query->where('user_id',$id);
}

在控制器中,您可以通过传递用户ID

$allArticlesFromCurrentAuthor = Article::userid($this->userId)->get();

我希望它能有所帮助。