Laravel 4 - 全球宣布课程?

时间:2013-06-19 21:24:20

标签: php laravel

我在Laravel 4项目中使用“Steam Condenser”软件包。用户登录我的应用程序后,我会设置一个带有ID(steamId)的会话。此ID可用于获取各种数据(名称,头像等),例如:

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

现在这可行,但是我将在很多页面(以及控制器)中使用这些数据。我不想做的是每次都宣布一个新课 - 所以我的问题是:

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

我看到两种方法:

  1. 通过__constructor,但我不能让它工作(失败可怕)。
  2. 通过路由过滤器。因此,为'before' => 'filter'创建一个新的过滤器名称和每个路由。然而,这可能会过度过度。
  3. 我希望这是有道理的(我的PHP知识不是很好) - 基本上我不想一直new SteamId( Session::get('steamId') );

3 个答案:

答案 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)