Symfony 2.1, el libro oficial

2.2. Agregando una página show al blog

La página list del blog se ha rediseñado para que el código esté mejor organizado y sea reutilizable. Para probar que esto es así, añade una página show al blog, que muestre una entrada individual del blog identificada por un parámetro de consulta id.

Para empezar, crea una nueva función en el archivo model.php que recupere un resultado individual del blog basándose en un identificador dado:

// model.php
function get_post_by_id($id)
{
    $link = open_database_connection();

    $id = mysql_real_escape_string($id);
    $query = 'SELECT date, title, body FROM post WHERE id = '.$id;
    $result = mysql_query($query);
    $row = mysql_fetch_assoc($result);

    close_database_connection($link);

    return $row;
}

A continuación, crea un nuevo archivo llamado show.php, que será el controlador para esta nueva página:

<?php
require_once 'model.php';

$post = get_post_by_id($_GET['id']);

require 'templates/show.php';

Por último, crea el nuevo archivo de plantilla (templates/show.php) para mostrar una entrada individual del blog:

<?php $title = $post['title'] ?>

<?php ob_start() ?>
    <h1><?php echo $post['title'] ?></h1>

    <div class="date"><?php echo $post['date'] ?></div>
    <div class="body">
        <?php echo $post['body'] ?>
        </div>
<?php $content = ob_get_clean() ?>

<?php include 'base.php' ?>

Como has visto, es muy fácil crear la segunda página sin duplicar código. Sin embargo, esta nueva página introduce algunos problemas adicionales que una plataforma web puede resolver por ti. Por ejemplo, si el usuario proporciona un valor ilegal para el parámetro id o un valor vacío, la consulta hará que la página se bloquee. En este caso, sería mejor que la aplicación generara una página de error de tipo 404 (algo que no es fácil con el código actual de la aplicación). Peor aún, si no te acuerdas de limpiar con la función mysql_real_escape_string() el parámetro id que te pasa el usuario, tu base de datos sería vulnerable a los ataques de tipo inyección SQL.

Otro problema importante es que cada archivo de tipo controlador debe incluir el archivo model.php. ¿Qué pasaría si cada archivo de controlador de repente tuviera que incluir un archivo adicional o realizar alguna tarea global (por ejemplo, reforzar la seguridad)?

Tal como está ahora, el código tendría que incluir a mano todos los archivos de los controladores. Si olvidas incluir algo en un solo archivo, esperamos que no sea alguno relacionado con la seguridad.