2013-06-23 58 views
4

我希望我知道如何更恰當地搜索這個問題/短語。這妨礙了我對以前的問題的搜索;如果這是重複的,請與我聯繫。Laravel 4:從數據庫中的字符串動態加載類

看到這個帖子的底部更新/編輯

背景/我想要做的事:

我有一個看起來很多像這樣的網址:

http://myapp.com/calculate/$fileID/$calculateID

$fileID$calculateID是我用來追蹤數據集和我稱之爲「計算」的關鍵。本質上,該URL表示對$fileID中的數據執行$calculateID

我去我的數據庫(mongo)並要求一個php類名或sring或文件路徑或你有什麼匹配$calculateID。例如起見假設表看起來是這樣的:

+-----+-------------------+ 
| _id |  phpFile  | 
+-----+-------------------+ 
| 1 | basicCalcs.php | 
| 2 | advancedCalcs.php | 
| 3 | summaryCalcs.php | 
+-----+-------------------+ 

注:是是安全的假設,在phpFile列中的每個文件都有一個共同的接口/套的公共方法。

例子:

http://myapp.com/calculate/23/2

會去到數據庫中,得到設定23數據,然後加載在advancedCalcs.php的功能。一旦加載了advancedCalcs.php,其中的一個函數將接收數據。從那裏開始,對數據進行一系列計算和轉換。

我的問題

我的問題是,什麼是「laravel 4友好」的方式來動態加載advancedCalcs.php和數據提供給一組的方法呢?有沒有辦法延遲加載這種類型的東西。目前,我只知道非常簡單的require_once()方法。我真的想避免這種情況,因爲我相信laravel 4具有動態加載底層類並將其掛接到通用接口的功能。

編輯1

感謝安東尼奧·卡洛斯·裏貝羅,我能夠取得一些進展。

運行轉儲自動加載的命令後,我vendor/composer/autoload_classmap.php文件有看起來像這樣的一些新的條目:

'AnalyzeController' => $baseDir . '/app/controllers/AnalyzeController.php', 
'AppName\\Calc\\CalcInterface' => $baseDir . '/app/calculators/CalcInterface.php', 
'AppName\\Calc\\basicCalcs' => $baseDir . '/app/calculators/basicCalcs.php', 

隨着像下面的示例代碼,我可以創建basicCalcs類的一個實例:

$className = "AppName\\Calc\\basicCalcs"; 

$instance = new $className; 

var_dump($instance); 

basicCalcs.php文件看起來像這樣:

//PATH: /app/calculators/basicCalcs.php 
<?php namespace Reporter\Calc; 


class basicCalcs { 


    public function sayHi(){ 
     echo("hello world! i am basicCalcs"); 
    } 

}; 

?> 

更新的問題: 如何創建類似於AnalyzeController條目的別名autoload_classmap.php,而不必使用全名稱空間來引用basicCalcs.php

回答

5

添加你的庫文件夾到你的composer.json自動加載:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/extended", 
     "app/calculators", <------- This is where you put all your calculators 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php" 
    ] 
}, 

更新你的自動加載類:

composer dump-autoload 

如果你想確保它沒有工作,檢查你的類自動加載打開文件

vendor/composer/autoload_classmap.php 

實例化,他們dinamically你最好有這樣的SA表類名:

+-----+-------------------+-------------------+ 
| _id |  phpFile  | namespace  | 
+-----+-------------------+-------------------+ 
| 1 | basicCalcs  | Reporter\Calc\ | 
| 2 | advancedCalcs  | Reporter\Calc\ | 
| 3 | summaryCalcs  | Reporter\Calc\ | 
+-----+-------------------+-------------------+ 

然後你只需要使用它

class CalculateController extends Controller { 

    public function calculate($fileID, $calculateID) 
    { 
     $file = phpFile::find($fileID); 

     $className = $file->namespace . $file->phpFile; 

     $calculator = new $className; //// <--- this thing will be autoloaded 

     return $calculator->calculate($calculateID); 
    } 

} 

我假設你的計算器都:

class basicCalcs { 

    public function calculate($calculateID) 
    { 
     return performCalculation($calculateID); /// something like this 
    } 

} 

和路由器是somethink像

Route::get('/calculate/{fileID}/{calculateID}', array('as'=>'calculate', 'uses'=>'[email protected]')); 
+0

**謝謝**。我看到你正在嘗試做,但find()方法在laravel 4的Filesystem類中不存在。我似乎也無法在php.net上發現它。我可以通過執行'$ className =「\\命名空間\\路徑\\ Inautoload_classmap來獲得我所需的內容。php「; $ instance = new $ className;' 這**有效**,但有沒有什麼辦法可以爲名稱空間設置別名? – user1521764

+1

對不起,關於該File ::,我將其更改爲phpFile更清晰,因爲它應該是你的phpFile模型,在那裏你存儲你的文件名。只要你的類出現在autoload_classmap.php文件中,你不需要命名空間,當然,除非你需要它們來組織你的代碼。 –

+0

如果你想使用'psr0','namespace'是必需的 –

1

Laravel4文件composer.json負責此,下面是一個例子

{ 
    "require": { 
     "laravel/framework": "4.0.*" 
    }, 
    "autoload": { 
     "classmap": [ 
      "app/commands", 
      "app/controllers", 
      "app/models", 
      "app/database/migrations", 
      "app/database/seeds", 
      "app/tests/TestCase.php" 
     ] 
    }, 
    "scripts": { 
     "post-update-cmd": "php artisan optimize" 
    }, 
    "config": { 
     "preferred-install": "dist" 
    }, 
    "minimum-stability": "dev" 
} 

通知的autoload部分,在那裏classmap用來告訴laravel4從哪些文件夾應該加載類和也哪個文件應該將其加載。例如,"app/controllers",將用於加載app/controllers文件夾中的所有類,"app/tests/TestCase.php"將使Laravel4自動加載文件夾中的類TestCase.php。因此,將您的庫文件夾添加到classmap部分。一旦你已經在autoload -> classmap部分添加您的文件夾路徑,那麼你必須運行

composer dumpautoload // or 
composer dump-autoload 
命令行

+0

謝謝;這讓我朝着正確的方向前進。我原來的問題已經更新,以反映我現在陷入困境的地方。 – user1521764