2013-11-14 46 views
0

在Laravel 4中,我如何創建模型的實例並使其全局可用?即使在看法。我正在尋找類似於使用Auth :: User-> name(我的意思是,不存儲在一個會話中的語法)的方式來獲得User實例,但在這種情況下它將是ModelName :: DefaultEntity-> attribute 。如何訪問laravel 4中的全局模型實例?

更詳細一點...

我寫一個應用程序,將容納多個網站 - 有點像一個CMS。所以我有一個網站模型。每個網站模型將具有URL屬性,以便當用戶訪問URL時,應用程序可以從數據庫中檢索網站模型並適當地標記該網站,例如,標題,標誌,主題等...

我希望當前的網站模型可以在任何地方使用,而無需在每個控制器/方法中創建網站的新實例。所以在我的佈局和視圖我可以這樣說:

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

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

{{ CurrentWebsite::name }} 

我已經在網站模型製作一個靜態方法實現了第一個

但是有了它,每次我說:

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

再加上它感覺不對。

任何人都可以幫忙嗎?

親切的問候,

羅賓

+0

我不認爲你需要在這裏做任何事情,而且我對你「全球」可用的含義有點不清楚。即使有你所描述的,你仍應該能夠按照預期使用Laravel。如果您擔心數據庫調用,請不要使用'Website :: current() - > name'輸出當前網站的名稱,而是先將模型存儲到變量中。 '$ website = Website :: current();',那麼你可以在沒有第二次數據庫調用的情況下執行'$ website-> name'和'$ website-> otherProperty'。對於關係,看看急切的加載。 –

+0

嗨感謝您的建議。當我在全球範圍內說我的意思是我只想創建一個可以在我的路線,控制器,視圖等中使用的實例,而無需手動將$ website對象傳遞給其他任何類或視圖。我希望這是有道理的。我認爲我所追求的是一個外觀,但我不知道模型的一個實例是否可行。 – user1094128

回答

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

將在第一次執行中顯示查詢,但不在第二次顯示,因爲它已被緩存。

2

你可能正在尋找 '共享容器綁定'。請參閱docs here

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

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

謝謝,那差不多是這樣,但是我只想在視圖或控制器或路由中說出foo :: name,而不必執行App :: make('foo'); 也許沒有辦法做我想要的東西。 – user1094128

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.Go到你的config/app.php並添加如下因素:

'providers' => array(
     'WebsiteServiceProvider' 
) 

'aliases' => array(
     'WebsiteFacade' 
) 

5.Refrech自動加載器。現在你可以在任何地方訪問網站類是這樣的:

Website::a();