2016-07-28 1 views
1

J'essaie d'implémenter une fonction d'aide qui m'aide à trier les routes (qui correspondent aux contrôleurs/actions) dans une application MVC.Des moyens efficaces pour implémenter des fonctions d'aide?

Mon fichier index.php ressemble à ceci.

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

Et mon fichier 'routes' contient un itinéraire, mes routes ressemblent à ceci.

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

Je préférerais simplement ajouter des racines dans mon dossier comme celui-ci ...

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

donc je dois faire une fonction d'assistance

question

Merci à psr-4 autoloading Je sais comment tirer dans les classes quand j'en ai besoin, cependant this est moins clair en ce qui concerne les anciennes fonctions. Comment puis-je ajouter proprement mes fonctions d'assistance dans mon Framework MVC sans ajouter de fichiers requis partout?

Merci beaucoup d'avance pour votre temps et considération!

Répondre

3

Pour que les fonctions d'assistance soient disponibles globalement, vous devez les inclure globalement. Une façon de le faire est dans votre point d'entrée de l'application (généralement index.php), vous avez besoin du fichier qui a vos fonctions d'aide.

Laravel, par exemple, fait cela, et dispose d'une grande variété d'aides: https://laravel.com/docs/5.1/helpers

Chaque fois que je l'ai écrit mon propre cadre à des fins d'apprentissage, je trouve que j'aimé avoir mes aides séparés dans des zones de fonctionnalité, de sorte ce que je tendais à faire est d'avoir un dossier pour les aides, quelque chose comme /app/helpers et utiliser un peu de code comme ceci dans mon point d'entrée:

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

Soyez conscient que ce pollue l'espace de noms global, alors soyez très prudent et réfléchi à propos de vos conventions de nommage. Une alternative est de créer une classe Helper et de disposer de méthodes statiques dans celles-ci afin que vous puissiez appeler des choses comme Helper::route() par exemple et qu'elle garde les fonctions hors de l'espace de noms global.

+1

Oh mec, c'est une si bonne réponse, si claire et si utile, c'était apprendre un peu de laravel qui a déclenché cette question en premier lieu, c'est bien de savoir! –

+2

Grande, courte mais informative réponse! –

+0

Si cela répond à votre question, veuillez la marquer comme acceptée. –

1

Comme couvert ici Autoloader for functions, vous avez quelques options, car il n'y a pas d'autochargeurs pour la fonction.

Si vous utilisez compositeur pour gérer vos dépendances, vous pouvez mettre toutes vos fonctions dans un seul fichier et ajouter une directive "files" à la section "autoload" de votre fichier composer.json. Cela entraînera le compositeur à faire le sale boulot pour vous dans son autoloader généré.

En plus de cela, vous pouvez simplement mettre le require_once pour le fichier avec vos fonctions dedans dans l'index.php pour votre cadre et c'est parti.

Vous pouvez même prendre toutes vos fonctions, les combiner dans une classe comme des méthodes statiques et les appeler simplement en utilisant , puis quand vous utilisez ceci, l'autochargeur s'occupera de tout pour vous comme avec n'importe quelle autre classe.

Pour récapituler, pas d'autochargeur, mais beaucoup d'options bonnes, solides et propres pour faire ce travail.