2015-12-31 51 views
2

我创建用于复制到表中所做的更改更改日志系统中,从访问BaseController一个全局变量集。这个函数基本上使用了beforeUpdate()钩子,并允许我在该表的ChangeLog中创建一个旧数据的副本。我也想用一些特定的信息来标记它,例如发出请求的IP地址以及发出请求的用户ID。Laravel - 需要一个模型

用户标识存储在BaseController类的全局变量中,任何控制器都可以使用$ this-> userId访问该变量,但是,我不希望显式地将该用户标识传递给每个模型调用,所以我希望能够从我的各种模型中访问$ this-> userId,但是laravel模型显然不会让您通过引用$ this-> userId来以这种方式与控制器通信。

谁能给我一个想法,如何去了解呢?我一直在挖掘几个小时,找不到任何我需要的东西?

非常感谢, 韦德

+0

我使用Laravel 4 – Wade

+0

如果你不想传递依赖关系,你可以在会话中存储ID并获得它在任何地方你想 – Moppo

+0

这看起来像一个很好的建议,那么它会在英寸整个会话无需指定特定的模型。如果可以的话,我会给这个,但是谢谢你! – Wade

回答

1

基本上,如果你不希望传递的依赖,有两种方式:

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

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

最后一点:这样写的代码,闻起来像“坏全局的东西',所以你应该考虑将依赖关系传递给你的模型,只要你可以

+0

使用会话在我看来是最好的方法,因为这正是它应该使用的,并且比使它成为基本控制器的属性更有意义。这就是说,使用服务容器有一个更简单的方法。可以简单地将一个值绑定到它,而不需要额外的类。 'App :: bind('userid',function(){return'someUserId'});'。 – user3158900

+0

@ user3158900:你说的是真的,一个班会更适合存储更复杂的数据 – Moppo

+0

这是一种边缘情况。我通常会将我需要的东西通过控制器传递给模型,但是我使用beforeChange()挂钩完成了基于“完整记录”的更改,我希望全局获取该用户标识而不必将其传入。会议在这种情况下完美满足了我的需求,但我真的很喜欢你们发布的其他想法。我也可以尝试使用应用程序注册表的想法。我不知道这个功能。 我基本上是在原始记录被任何改变覆盖之前创建一个副本,并在信息中添加了几位信息,标识谁做出了改变。 – Wade

1

通过创建范围,你可以得到模型中的用户ID值。 例如,在文章的模型,如果我要检查文章的作者是当前用户或没有,我可以做我自己的范围为:

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

在控制器,你可以通过

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

我希望它能帮助。

+0

您忘记了'return'语句。 :)'return $ query-> where('user_id',$ id);' –

+0

感谢您的帮助。这个解决方案非常棒,但是看起来我需要将userId传递到我需要使用的EACH模型中,对吗? – Wade

+0

感谢托马斯的纠正,但它甚至没有返回声明。是的,我们必须将userId作为参数传递给每个模型。 – wupendra