simple - routing php mvc
Mapeo de mĂșltiples rutas(controlador) usando un enrutador (4)
Como parte de la fase de arranque, dígales a sus controladores que se asignen a un enrutador:
// bootstrap
$router = new AltoRouter();
FooController::mapRoutes($router);
BarController::mapRoutes($router);
// etc.
Cada controlador puede producir la cantidad de rutas que necesite.
Estoy mirando la biblioteca del enrutador danny vankooten aquí . Esto se ve bien (aunque no estoy seguro de cómo manejará el proyecto de mediano a grande, por ejemplo, un sitio de comercio electrónico). Ahora, siguiendo el ejemplo, esto es mapeo
$router->map(''GET'',''/'', ''home.php'', ''home'');
$router->map(''GET'',''/home/'', ''home.php'', ''home-home'');
$router->map(''GET'',''/plans/'', ''plans.php'', ''plans'');
$router->map(''GET'',''/about/'', ''about.php'', ''about'');
$router->map(''GET'',''/contact/'', ''contact.php'', ''contact'');
$router->map(''GET'',''/tos/'', ''tos.html'', ''tos'');
Supongamos que tengo un escenario donde mi sitio web tiene 20-30 páginas estáticas o cerca de aproximadamente 50 controladores con 2-3 acciones / método cada uno.
¿Cómo los mapeo todos? Si utilizo el método anterior de mapeo, probablemente termine teniendo más de 100 líneas de mapeo y esto no se ve bien.
Creo que debería haber una forma o atajos / comodín como comprobar si hay una página o controlador disponible, luego cárguelo o bien arroje un 404.
¿Cómo mapeo todas las rutas de la manera correcta ?.
PD. Dar una recompensa de 50 a cualquiera que esté dispuesto a responder sobre cómo usar el enrutador arriba usando comodín para que coincida con el controlador / método.
en la biblioteca no hay ninguna función que haga algo como lo que quería, pero hay una forma alternativa de hacerlo, es almacenar esas páginas en la base de datos por lo que tendrá algo como esto a continuación
//your query
// "SELECT `method`, `route`, `page`, `name` FROM `static_pages`
$pages = (query); //your executed query
if(count($pages) > 0){
foreach($pages as $page){
$router->map($page[''method''],$page[''route''], $page[''target''], (($page[''name''] !== null || !empty($page[''name'']) ) ? $page[''name''] : null));
}
}
espero que esto ayude
Lo que puede hacer para aligerar su archivo de enrutador es mover la definición de ruta en un archivo YAML. Todavía tendrá muchas líneas en su YAML, pero será más legible.
En su archivo router.php
, use este código:
No olvides agregar el analizador Symfony YAML a tu composer.json
. composer.json
use Symfony/Component/Yaml/Yaml;
$yaml_file = ''routes.yaml'';
$routes = Yaml::parse(file_get_contents($yaml_file));
foreach ($routes as $route_name => $params) {
$router->map($params[0],$params[1], $params[2].''#''.$params[3], $route_name);
}
// match current request
$match = $router->match();
Su archivo routes.yaml
se verá así
index: ["GET", "/", "home_controller", "display_item"]
content: ["GET", "/content/[:parent]/?[:child]?", "content_controller", "display_item"]
article: ["GET", "/article/[:page]", "article_controller", "display_item"]
Otra cosa que puede hacer para obtener archivos más pequeños es separar la definición de su ruta en muchos archivos pequeños de YAML. Por ejemplo, uno para archivos estáticos, uno para el área de administración, uno para el frente ...
Para hacer algo como esto, debes cambiar el código del router.php
a algo como esto:
use Symfony/Component/Yaml/Yaml;
$yaml_files = [''front.yaml'', ''static.yaml'', ''admin.yaml''];
foreach ($yaml_files as $yaml_file) {
$routes = Yaml::parse(file_get_contents($yaml_file));
foreach ($routes as $route_name => $params) {
$router->map($params[0],$params[1], $params[2].''#''.$params[3], $route_name);
}
}
// match current request
$match = $router->match();
Danny Van Kooten también creó PHP-Router
que tiene un soporte integrado para archivos YAML. (Si miras el código fuente, verás que usa el analizador Symfony, por lo que ambos métodos son bastante similares)
Definición de ruta YAML
base_path: /blog
routes:
index: [/index, someClass.indexAction, GET]
contact: [/contact, someClass.contactAction, GET]
about: [/about, someClass.aboutAction, GET]
Router.php
require __DIR__.''/vendor/autoload.php'';
use PHPRouter/RouteCollection;
use PHPRouter/Config;
use PHPRouter/Router;
use PHPRouter/Route;
$config = Config::loadFromFile(__DIR__.''/router.yaml'');
$router = Router::parseConfig($config);
$router->matchCurrentRequest();
Si usa un enrutador precompilado como Silex , puede hacer algo como esto:
$app->get(''{route}'', function($route) {
$dir = "/path/to/my/static/files/";
$file = $dir . $route . ''.php'';
if (file_exists($file)) {
require $file;
} else {
require ''/path/to/custom/404.php'';
}
});
Tenga en cuenta que Silex y muchos enrutadores similares requieren rutas para ser por orden de preferencia. Cuando necesito usar un enrutador como este, lo pongo en la parte inferior para que no atrape nada accidentalmente.
Tenga en cuenta que, si desea construir algo así como esta costumbre, puede hacer esto, teniendo en cuenta que no sé cómo se ve su código actualmente o qué lógica necesita, sustituyendo su expresión regular (en el ejemplo de Silex, está entre llaves) y verificando $_SERVER[''REQUEST_URI'']
contra su expresión regular formulada.
Si se trata de una aplicación personalizada, es posible que en realidad no necesites sobreescribirla.
// routing class
foreach ($routes as $route) {
if ($route != self::DEFAULT_ROUTE) {
// do your normal routing logic
} else {
// check if file exists (as with code above), else send to error 404
}
}
Luego llama con algo como:
$router->map(''GET'',Router::DEFAULT_ROUTE, ''legacyRouter.php'', ''legacy'');