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

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

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

用户 ID 存储在 BaseController class 内的全局变量中,任何使用 $this->userId 的控制器都可以访问它,但是,我不想必须显式传递每个模型调用的用户 ID,所以我希望能够从我的各种模型访问 $this->userId,但是 laravel 模型显然不允许你通过引用以这种方式与控制器交谈$this->userId.

任何人都可以告诉我该怎么做吗?我已经挖掘了几个小时,却找不到任何我需要的东西?

非常感谢, 韦德

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

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

在控制器中你可以通过

传递用户ID
$allArticlesFromCurrentAuthor = Article::userid($this->userId)->get();

希望对您有所帮助。

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

1 - 使用会话:您可以将 ID 存储在会话中并在任何需要的地方获取它

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

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

$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');

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

最后一点:以这种方式编写的代码闻起来像 'bad global stuff',因此您应该考虑尽可能长时间地将依赖项传递给您的模型