J'ai une fonction virtuelle appelée handlePathChange() dans ma classe Controller.
Il vérifie l'URL actuelle et devrait distribuer la bonne vue pour cela.
Voici le code que j'ai jusqu'à présent:Comment indiquer au contrôleur quelle vue appeler?
void Controller::handlePathChange()
{
if (app->internalPathMatches(basePath))
{
string path = app->internalPathNextPart(basePath);
if (path.empty()) // If it's empty it is known that the index of the controller should show up
index();
// else if (path == ??) each controller has it's own routes
// call_some_unknown_function();
}
}
Comment puis-je généraliser cela?
Je pensais à deux options:
- Appel d'une fonction virtuelle pure appelée dispatch() qui correspondra le droit chemin à la fonction droite dans la classe dérivée. Cette solution viole DRY car vous écrivez le même code encore et encore.
- Créez une mappe de hachage de std :: function mais si une partie de l'URL est un paramètre, la vue ne sera pas trouvée. Donc, cette option n'est pas assez bonne.
Des idées?
Il y a un problème ici car C++ manque de réflexion. Je ne peux pas appeler index() hors de la chaîne "index". De plus, je ne peux pas avoir un conteneur hétérogène qui contient des objets de fonction qui n'ont pas la même longueur de paramètres? –
Ah, je vois. Vous ne savez pas comment gérer l'invocation dynamique autre que ce que vous proposez dans # 1 et # 2. Cependant, avec les paramètres, ne pourriez-vous pas supposer le même nombre de paramètres et juste fournir des valeurs par défaut? Par exemple, - analyser l'URL - identifier l'action prévue en tant que première/mi-partie de l'URL - attribuer des paramètres supplémentaires si elle est fournie - sinon, envoyer les valeurs par défaut pour les valeurs de paramètre? On dirait que l'utilisation de cette option pourrait fonctionner avec votre option # 2? –
J'ai commencé à l'écrire. A partir de maintenant j'utilise une table de hachage de paramètres (key: string, value: string), ce que je veux dire, c'est que s'ils ne correspondent pas à un contrôleur ou à une action, ils sont ajoutés aux paramètres. Maintenant, j'applique les valeurs par défaut. Comment implémenteriez-vous setView comme dans ASP.Net MVC? –