Php Laravel 4-全局声明类?
我在Laravel 4项目中使用了“蒸汽冷凝器”软件包。一旦用户登录到我的应用程序,我就用他们的ID(steamId)设置一个会话。该ID可用于抓取各种数据(姓名、化身等),例如:Php Laravel 4-全局声明类?,php,laravel,Php,Laravel,我在Laravel 4项目中使用了“蒸汽冷凝器”软件包。一旦用户登录到我的应用程序,我就用他们的ID(steamId)设置一个会话。该ID可用于抓取各种数据(姓名、化身等),例如: $steamUser = new SteamId( Session::get('steamId') ); $username = $steamUser->getNickname(); 现在可以了,不过我将在很多页面上(以及控制器中)使用这些数据。我不想每次都声明一个新类,所以我的问题是: 可以创建蒸汽ID,
$steamUser = new SteamId( Session::get('steamId') );
$username = $steamUser->getNickname();
现在可以了,不过我将在很多页面上(以及控制器中)使用这些数据。我不想每次都声明一个新类,所以我的问题是:
- 可以创建蒸汽ID,所以在我的控制器中,我只需要说
$username=$streamuser->get昵称()代码>-显然,只有当
为真时才可以(Session::has('streamid'))
”。然而,这可能变得过于过度
我希望这是有意义的(我的PHP知识不是很好)-基本上我不想做
newsteamid(Session::get('SteamId'))代码>所有时间 构造函数是最简单的。如果您倾向于在一个类中反复运行相同的代码,那么构造函数就是有帮助的
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);
}
}
您也可以随时扩展自定义基类控制器。查看IOC容器使用IOC容器,如Dave Ganley所述。它允许您定义如何调用/处理对象,并且您只需在时机成熟时解析该类,例如:
App::singleton('SteamId', function($app)
{
return new SteamId(Session::get('steamId'));
});
然后,在需要时,解决它:
$steamIdObject = App::make('SteamId');
将为您提供该类的所有方法。因为它的行为就像一个单例,所以它只会被实例化一次
此外,您可以将其与路由筛选器和组绑定,以确保始终在每个页面上调用它,并设置所需的数据。然后在控制器中,只需通过App::make调用相同的对象,就可以了:)这只适用于控制器,而不适用于视图和其他文件。我计划通过控制器发送数据。但是,我得到了错误的未定义属性:streamcontroller::$streamuser。下面是我的简化代码,如果有帮助的话:希望你能看到我在做什么!对于视图,您需要将值传递给视图,或者在视图生成器中获取值。我已经更新了我的代码,以显示如何轻松自动地将streamuser
传递到视图。只要将$this->data
传递给视图,它就可以在视图中访问。请尝试将父项::\u construct()
移到if语句之外。它应该是在构造函数末尾运行的最后一件事。我不确定问题的其余部分是什么,只是看看它……因为$steamUser在我的BaseController中,所以我将其公开(并且它做了一些事情(不确定这是否正确)),但是现在我得到了“对非对象的成员函数getNickname()的调用”。现在还删除了if语句。我似乎无法在SteamController中创建构造,因为它说我无法再次重新声明_构造。感谢这一点——不过,有一件事,因为我的应用程序将严重依赖于使用$steamIdObject,是否可以在BaseController中加载它,以便我可以在其他每个控制器中使用该变量?如果是这样,正确的方法是什么?你绝对可以。我仍然会使用IoC,但也会将其添加到基本控制器的构造函数或其他东西中,如下面的答案所述:)所以,只需这样做:$this->streamidobject=App::make('streamid');然后在您的控制器中,只需参考$this->streamidObject:)顺便说一句,使用这种方法的好处意味着您的控制器更易于测试。如果可以,请始终使用IoC来处理对象。如果不能,请使用外观:)非常感谢!很好地解释:)是否可以修改singleton的值?当我的回答用额外的细节扩展你的回答时,增加了你的回答。