我在Laravel 4项目中使用“Steam Condenser”软件包。用户登录我的应用程序后,我会设置一个带有ID(steamId)的会话。此ID可用于获取各种数据(名称,头像等),例如:
$steamUser = new SteamId( Session::get('steamId') );
$username = $steamUser->getNickname();
现在这可行,但是我将在很多页面(以及控制器)中使用这些数据。我不想做的是每次都宣布一个新课 - 所以我的问题是:
$username = $steamUser->getNickname();
- 显然只有(Session::has('steamId'))
为真。我看到两种方法:
'before' => 'filter'
创建一个新的过滤器名称和每个路由。然而,这可能会过度过度。我希望这是有道理的(我的PHP知识不是很好) - 基本上我不想一直new SteamId( Session::get('steamId') );
!
答案 0 :(得分:6)
使用Dave Ganley提到的IoC容器。它允许您定义如何调用/处理对象,并在时间到来时简单地解析该类,例如:
App::singleton('SteamId', function($app)
{
return new SteamId(Session::get('steamId'));
});
然后当你需要它时,解决它:
$steamIdObject = App::make('SteamId');
将为您提供该课程的所有方法。而且因为它会像单身一样 - 它只会被实例化一次。
此外,您可以将其与路由过滤器和组联系起来,以确保始终在每个页面上调用它,并设置所需的数据。然后在你的控制器中,只需通过App :: make调用同一个对象,你就可以了:)
答案 1 :(得分:1)
构造函数将是最直接的。如果你倾向于在一个类中反复运行相同的代码,那么这就是构造函数有用的东西。
class WhateverController extends BaseController
{
private $steamUser;
private $data = array();
public function __construct()
{
$this->steamUser = new SteamId(...);
$data['steamUser'] = $this->steamUser;
parent::__construct();
}
public function doSomething()
{
$nickname = $this->steamUser->getNickname();
$something = Whatever:all();
$this->data['something'] = $something;
return View::make('myview', $this->data);
}
}
您也可以随时扩展自定义基类控制器。
答案 2 :(得分:1)