2016-07-28 29 views
1

我想實現一個幫助函數,它可以幫助我在MVC應用程序中添加'添加'路線(映射到控制器/操作)。實施幫手功能的有效方法?

我的index.php文件看起來像這樣。

// use block 
use App\Router; 
use App\Config; 
use App\Core\Database; 
use App\Bootstrap; 

// dependencies 
$router = new Router; 
$config = new Config; 
$database = new Database($config); 
$bootstrap = new Bootstrap($router, $database); 

// routes 
require '../App/Routes.php'; 


$bootstrap->router->dispatch($_SERVER['QUERY_STRING']); 

而我的'路線'文件有一條路線,我的路線是這樣的。

$bootstrap->router->add('/home', ['controller' => 'home', 'action' => 'index']); 

我更願意簡單地添加根放入我的文件是這樣的...

route('/home', ['controller' => 'home', 'action' => 'index']); 

所以我需要一個輔助函數

問題

感謝psr-4自動加載我知道如何在需要的時候插入類,但是this就平面舊功能而言不太清楚。我怎樣才能將我的幫助函數乾淨地添加到我的MVC框架中,而無需在任何地方添加require文件?

非常感謝您的時間和考慮!

回答

3

要在全局範圍內提供輔助函數,您必須在全局範圍內包含它們。一種方法是在您的應用程序入口點(通常爲index.php)中,您需要具有幫助程序功能的文件。

Laravel,例如,這是否和有各種各樣的幫手:https://laravel.com/docs/5.1/helpers

每當我寫我自己的框架,學習之用,我發現我喜歡有我的助手分爲功能區,使我傾向於做的是有幫手的文件夾,像/app/helpers,並在我的入口點使用一點這樣的代碼:

foreach (glob("./app/helpers/*.php") as $helper) { 
    require_once($helper); 
} 

注意,這污染了全局命名空間,所以要非常細心周到關於你的命名約定。

另一種方法是創建一個Helper類,並在其中有靜態可用的方法,因此您可以調用諸如Helper::route()之類的東西,並且它將函數保留在全局名稱空間之外。

+1

哦,男人,這是一個很好的答案,如此清晰和有幫助,它首先引發了這個問題,學會了一點拉拉維爾,很高興知道! –

+2

好的,簡短但翔實的答案! –

+0

如果這回答了您的問題,請將其標記爲已接受。 –

1

如此處所述Autoloader for functions,您有幾個選項,因爲沒有函數的自動加載器。

如果您使用作曲家來管理您的依賴關係,您可以將所有功能放在一個文件中,並將"files"指令添加到composer.json文件的"autoload"部分。這將導致作曲家在它生成的自動加載器中爲你做髒活。

除此之外,您可以將其中帶有函數的文件的require_once放入您的框架的index.php中,然後移開。

你甚至可以把你所有的功能,靜態方法合併成一個類,只需要使用來調用它們,然後當你使用它時,自動加載器會照顧你所有的東西,就像任何其他類一樣。

回顧一下,沒有自動裝載機,但有很多很好的,堅實的,乾淨的選項,使這項工作。