2016-07-28 91 views
1

Ich versuche, eine Hilfsfunktion zu implementieren, die mir hilft, Routen (die Controllern/Aktionen zugeordnet werden) in einer MVC-Anwendung hinzuzufügen.Effektive Möglichkeiten, Hilfsfunktionen zu implementieren?

Meine index.php-Datei sieht so aus.

// 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']); 

Und meine 'Routen' Datei hat eine Route drin, meine Routen sehen so aus.

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

ich lieber Wurzeln in meine Datei so fügen Sie einfach ...

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

Also brauche ich eine Hilfsfunktion machen

Frage

Dank psr-4 autoloading Ich weiß, wie man Klassen einleitet, wenn ich sie brauche, aber dies ist weniger klar, wenn es um alte Funktionen geht. Wie kann ich meine Hilfsfunktionen sauber in mein MVC Framework einfügen, ohne dass require-Dateien überall hinzugefügt werden müssen?

Vielen Dank im Voraus für Ihre Zeit und Rücksicht!

Antwort

3

Damit Hilfsfunktionen global zur Verfügung stehen, müssen Sie sie global einschließen. Eine Möglichkeit, dies zu tun, ist in Ihrer Anwendung Einstiegspunkt (in der Regel index.php), benötigen Sie die Datei, die Ihre Hilfsfunktionen hat.

Laravel zum Beispiel tut dies und hat eine Vielzahl von Helfern: https://laravel.com/docs/5.1/helpers

Immer, wenn ich zu Lernzwecken meine eigenen Rahmen schrieb, fand ich, dass ich mochte meine Helfer in Bereichen Funktionalität getrennt haben, so was neigte ich zu tun ist, um einen Ordner für die Helfer haben, so etwas wie /app/helpers und ein Stück Code wie dies in meinem Einstiegspunkt verwenden:

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

beachten Sie, dass dies den globalen Namespace verseucht, so sehr vorsichtig sein und nachdenklich über Ihre Namenskonventionen.

Eine Alternative ist, eine Helper Klasse zu erstellen und Methoden statisch in ihnen zu haben, so dass Sie Dinge wie Helper::route() zum Beispiel aufrufen können und es die Funktionen aus dem globalen Namespace heraushält.

+1

Oh man, das ist so eine gute Antwort, so klar und hilfreich, es war ein bisschen Laravel, die diese Frage in erster Linie ausgelöst hat, großartig zu wissen! –

+2

Großartige, kurze, aber informative Antwort! –

+0

Wenn dies Ihre Frage beantwortet hat, markieren Sie diese bitte als akzeptiert. –

1

Wie hier behandelt Autoloader for functions, haben Sie ein paar Möglichkeiten, da es keine Autoloader für die Funktion gibt.

Wenn Sie Komponisten verwenden, um Ihre Abhängigkeiten zu verwalten, können Sie alle Ihre Funktionen in einer Datei setzen und eine "files" Richtlinie zum "autoload" Abschnitt Ihrer composer.json Datei hinzufügen. Dies führt dazu, dass der Komponist die schmutzige Arbeit für Sie in seinem generierten Autoloader erledigt.

Ansonsten können Sie einfach die require_once für die Datei mit Ihren Funktionen darin in die index.php für Ihr Framework setzen und schon kann es losgehen.

Sie könnten sogar alle Ihre Funktionen übernehmen, kombinieren Sie sie zu einer Klasse als statische Methoden und rufen Sie sie einfach mit , dann wenn Sie dies verwenden, wird der Autoloader für alles wie für jede andere Klasse kümmern.

Zur Erinnerung, kein Autoloader, aber viele gute, solide, saubere Optionen für diese Arbeit.