Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 4-全局声明类?_Php_Laravel - Fatal编程技术网

Php Laravel 4-全局声明类?

Php Laravel 4-全局声明类?,php,laravel,Php,Laravel,我在Laravel 4项目中使用了“蒸汽冷凝器”软件包。一旦用户登录到我的应用程序,我就用他们的ID(steamId)设置一个会话。该ID可用于抓取各种数据(姓名、化身等),例如: $steamUser = new SteamId( Session::get('steamId') ); $username = $steamUser->getNickname(); 现在可以了,不过我将在很多页面上(以及控制器中)使用这些数据。我不想每次都声明一个新类,所以我的问题是: 可以创建蒸汽ID,

我在Laravel 4项目中使用了“蒸汽冷凝器”软件包。一旦用户登录到我的应用程序,我就用他们的ID(steamId)设置一个会话。该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的值?当我的回答用额外的细节扩展你的回答时,增加了你的回答。