2

我在我的 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'. 然而,这可能变得非常过分。

我希望这是有道理的(我的 PHP 知识不是很好)——基本上我不想一直这样做new SteamId( Session::get('steamId') );

4

3 回答 3

6

使用 Dave Ganley 提到的 IoC 容器。它允许您定义如何调用/处理对象,并且您只需在时机成熟时解析该类,例如:

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

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

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

将为您提供该类的所有方法。而且因为它会像一个单例一样 - 它只会被实例化一次。

此外,您可以将其与路由过滤器和组联系起来,以确保始终在每个页面上调用它,并设置您需要的数据。然后在你的控制器中,只需通过 App::make 调用同一个对象,你就可以开始了:)

于 2013-06-19T22:12:49.153 回答
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);

  }
}

您也可以随时扩展自定义基类控制器。

于 2013-06-19T21:34:02.623 回答
1

看看 IOC 容器http://four.laravel.com/docs/ioc

于 2013-06-19T21:59:16.343 回答