2013-06-19 42 views
2

我在Laravel 4项目中使用“Steam Condenser”软件包。一旦用户登录到我的应用程序,我使用他们的ID(steamId)设置了一个会话。这个ID可以用来抓取各种数据(姓名,头像等),一个例子:Laravel 4 - 全球声明课程?

$steamUser = new SteamId(Session::get('steamId')); 
$username = $steamUser->getNickname(); 

现在这个工作,但是我将要使用在很多页面的这个数据(也包括控制器)。我不希望做的是宣告一个新的类,每次 - 所以我的问题是:

  • 可以创建SteamId,所以在我的控制器,我只需要说$username = $steamUser->getNickname(); - 显然只有(Session::has('steamId'))是真实的。

我看到这样的方法有两种:

  1. 通过一个__constructor,但我不能得到这个工作(可怕的失败)。
  2. 通过路由过滤器。因此,制作一个新的过滤器名称并为每条路线做一个'before' => 'filter'。然而,这可能会变得相当过度。

我希望这是有道理的(我的PHP知识不是很好) - 基本上我不想做new SteamId(Session::get('steamId'));所有的时间!

回答

6

使用IoC容器,如由Dave甘利提及。它允许你定义一个对象是如何调用/处理,你根本解决阶级在时机成熟时,如:

App::singleton('SteamId', function($app) 
{ 
    return new SteamId(Session::get('steamId')); 
}); 

然后,当你需要它,解决它:

$steamIdObject = App::make('SteamId'); 

威尔为您提供该班的所有方法。而且因为它会像一个单身人士一样 - 它只会被实例化一次。

此外,您可以将它与路由过滤器和组配合使用,以确保始终在每个页面上调用此过滤器,并设置所需的数据。然后在你的控制器中,通过App :: make调用相同的对象,你很好:)

+0

感谢这工作 - 但有一件事,因为我的应用程序将严重依赖使用$ steamIdObject,是否有可能在BaseController中加载它,所以我可以在每个其他控制器内使用该变量?如果是这样,那么正确的做法是什么? – Alias

+0

你绝对可以。我仍然会使用IoC,但也可以将它添加到基础控制器的构造函数中,如下面答案中所述:) 所以,只需要: $ this-> steamIdObject = App :: make(' SteamId'); 然后在你的控制器中,只需参考$ this-> steamIdObject :) – Oddman

+0

顺便说一句,使用这种方法的好处意味着你的控制器更具可测试性。如果可以,请始终使用IoC对象 - 如果不能,请使用Facades :) – Oddman

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

    } 
} 

你总是可以扩展一个自定义的基类控制器。

+0

这只会为控制器做,而不是视图和其他文件。 – rmobis

+0

我打算通过控制器发送数据。但是,我收到错误未定义的属性:SteamController :: $ steamUser。如果有帮助,这是我的减少代码:http://paste.laravel.com/xxN希望你看到我想要做的事! – Alias

+0

对于您需要将值传递给视图或在View Composer中获取值的视图。我已更新我的代码以显示如何轻松自动将'steamUser'传递到视图。就像你将'$ this-> data'传递给视图一样,它将在视图中被访问。 –