如何在laravel 4中访问全局模型实例?

时间:2013-11-14 10:32:47

标签: laravel-4

在Laravel 4中,如何创建模型实例并使其全局可用?甚至在观点中。我正在寻找类似于使用Auth :: User-> name获取User实例的方式(我的意思是语法,不存储在会话中)但在这种情况下它将是ModelName :: DefaultEntity-&gt ;属性

更详细一点......

我正在编写一个包含多个网站的应用程序 - 有点像CMS。所以我有一个网站模型。每个网站模型都具有URL属性,以便当用户访问URL时,应用程序可以从数据库中检索网站模型并对网站进行适当的标记,例如标题,标志,主题等......

我希望当前的网站模型随处可用,而无需在每个控制器/方法中创建新的网站实例。所以在我的布局和视图中,我可以这样说:

{{ Website::Website()->name }}

{{ CurrentWebsite::name }}

我通过在网站模型中创建静态方法实现了第一个方法:

public static function current()
{
    return Website::find(1); // just to test it for now
} 

但是,每当我说:

时,它将不得不进行数据库查询
{{ Website::current()->name }}

另外,感觉不对。

有人可以帮忙吗?

亲切的问候,

罗宾

3 个答案:

答案 0 :(得分:2)

您可能正在寻找'共享容器绑定'。请参阅docs here

<?php
App::singleton('foo', function()
{
    return Website::whereCode('whoop')->first();
});

App::make('foo'); // every where you need it

答案 1 :(得分:0)

  1. 创建普通类。喜欢当前网站或网站或其他。

    class Website {
        public function a() {
          //your code
        }
     }
    
  2. 创建外观(WebsiteFacade.php)

    use Illuminate\Support\Facades\Facade;
    
    class WebsiteFacade extends Facade {
    
        protected static function getFacadeAccessor() { return 'website'; }
    
    }
    
  3. 创建服务提供商

        use Illuminate\Support\ServiceProvider;
    
        class WebsiteServiceProvider extends ServiceProvider {
    
        public function register()
        {
             $this->app->bind('website', function()
             {
                  return new Website();
              });
        }
        } 
    
  4. 4.转到config / app.php并添加以下内容:

     'providers' => array(
          'WebsiteServiceProvider'
     )
    

     'aliases' => array(
          'WebsiteFacade'
     )
    

    5.Refrech自动装载机。现在您可以在任何地方访问网站类:

        Website::a();
    

答案 2 :(得分:0)

你已经拥有的是好的,但如果你只想阻止每次执行查询,你可以缓存它:

public static function current()
{
    return Website::remember(10)->find(1); // just to test it for now
}

为routes.php添加一个监听器:

 DB::listen(function($sql, $bindings, $time) { var_dump($sql); var_dump($bindings); });

执行它:

{{ Website::current()->name }}

将在第一次执行时显示查询,但在第二次执行时不显示,因为它已缓存。