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

Laravel 4 如何访问laravel 4中的全局模型实例?,laravel-4,Laravel 4,在Laravel4中,如何创建模型实例并使其全局可用?即使在视野中。我希望做一些类似于使用Auth::User->name(我的意思是语法,不存储在会话中)获取用户实例的方法,但在本例中,它将是ModelName::DefaultEntity->attribute 再详细一点 我正在写一个应用程序,将容纳多个网站-有点像一个CMS。所以我有一个网站模型。每个网站模型都有一个URL属性,因此当用户访问URL时,应用程序可以从数据库中检索网站模型,并适当地为网站添加品牌,例如标题、徽标、主题等 我希

在Laravel4中,如何创建模型实例并使其全局可用?即使在视野中。我希望做一些类似于使用Auth::User->name(我的意思是语法,不存储在会话中)获取用户实例的方法,但在本例中,它将是ModelName::DefaultEntity->attribute

再详细一点

我正在写一个应用程序,将容纳多个网站-有点像一个CMS。所以我有一个网站模型。每个网站模型都有一个URL属性,因此当用户访问URL时,应用程序可以从数据库中检索网站模型,并适当地为网站添加品牌,例如标题、徽标、主题等

我希望当前的网站模型在任何地方都可用,而不必在每个控制器/方法中创建新的网站实例。因此,在我的布局和视图中,我可以这样说:

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

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

public static function current()
{
    return Website::find(1); // just to test it for now
} 
但这样一来,每次我说:

{{ Website::current()->name }}
而且感觉不对劲

有人能帮忙吗

亲切问候,


Robin

您可能正在寻找“共享容器绑定”。看


  • 创建普通类。比如现在的网站,网站或者其他什么的

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

  • 创建服务提供商

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

     'providers' => array(
          'WebsiteServiceProvider'
     )
    

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

        Website::a();
    

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

    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 }}
    

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

    我认为您不需要在这里做任何花哨的事情,我有点不清楚“全局”可用是什么意思。即使有了您所描述的,您仍然应该能够按预期使用Laravel。如果担心数据库调用,请不要使用
    website::current()->name
    输出当前网站的名称,而是首先将模型存储到变量中<代码>$website=website::current()
    ,则无需第二次数据库调用即可执行
    $website->name
    $website->otherProperty
    。对于人际关系,请查看渴望加载。您好,谢谢您的建议。当我说全局时,我的意思是我只想创建一个实例,我可以在我的路由、控制器、视图等中使用它,而不必手动将$website对象传递给其他所有类或视图。我希望这是有道理的。我想我想要的是一个外观,但我不知道在一个模型的实例中是否可能。谢谢,差不多就是这样,但我想在视图、控制器或路由中只说foo::name,而不必做App::make('foo');也许没有办法做我想做的事。
        Website::a();
    
    public static function current()
    {
        return Website::remember(10)->find(1); // just to test it for now
    }
    
     DB::listen(function($sql, $bindings, $time) { var_dump($sql); var_dump($bindings); });
    
    {{ Website::current()->name }}