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

时间:2015-12-31 15:42:02

标签: php laravel laravel-4 model global

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

用户ID存储在BaseController类内部的全局变量中,任何使用$ this-> userId的控制器都可以访问它,但是,我不希望必须将该用户ID显式传递给每个模型电话,所以我希望能够使用我的各种型号访问$ this-> userId,但laravel模型显然不会让你通过引用$ this-> userId来与控制器交谈。 / p>

有谁能告诉我如何解决这个问题?我一直在挖掘几个小时,找不到能满足我需要的东西?

非常感谢, 涉

2 个答案:

答案 0 :(得分:1)

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

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

在控制器中,您可以通过

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

我希望它有所帮助。

答案 1 :(得分:1)

基本上,如果您不想传递依赖关系,您有两种方式:

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

2 - 创建一个服务提供者或类来存储您想要的数据,并在以后使用app Registry检索它:

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

$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来访问它

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