Separemos la Lógica de la plantilla

Antes de continuar con el control técnico de este capítulo, dediquemos un poco de tiempo a discutir la organización del código y por qué podríamos querer separar nuestra lógica PHP de la vista o HTML.

Que aprenderemos

  • Code Organization
  • Logic Separation
  • require and include

Mover código

Mover código php a parte superior, como un primer paso podemos mover el código php y a la parte superior del archivo html así:

Código PHP
<?php
        
    $books = [
        [
            'name' => 'Do Androids Dream of Electric Sheep?',
            'author' => 'Philip K. Dick',
            'purchaseUrl' => 'http://example1.com',
            'publicationDate' => 1968,
        ],

        [
            'name' => 'Four Past Midnight',
            'author' => 'Stephen King',
            'purchaseUrl' => 'http://example2.com',
            'publicationDate' => 1990,
        ],

        [
            'name' => 'Project Hail Mary',
            'author' => 'Andy Weir',
            'purchaseUrl' => 'http://example3.com',
            'publicationDate' => 2021,
        ],

        [
            'name' => 'The Martian',
            'author' => 'Andy Weir',
            'purchaseUrl' => 'http://example4.com',
            'publicationDate' => 2011,
        ],
    ];

    // Mandar llamar la **built-in** function de PHP mejor! 
    $filteredBooks = array_filter($books, function ($book){
        return $book['author'] === 'Andy Weir';
    });    
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            display: grid;
            place-items: center;
            /* height: 100vh; */
            margin: 0;
            font-family: sans-serif;
        }
    </style>
</head>
<body>
    <h1>Libros Recomendados</h1>
    <ul>
        <?php foreach ($filteredBooks as $book) : ?>
            <li>
                <a href="<?= $book['purchaseUrl'] ?>">
                    <?= $book['name'] ?> (<?= $book['publicationDate']?>) - By <?= $book['author'] ?>
                </a>
            </li>
        <?php endforeach; ?>
    </ul>
</body>
</html> 

En index.view.php

Como un segundo paso podemos separar el código html en su propio archivo index.view.php y para llamarlo podemos usar required o include, nota como podemos eliminar ?> del archivo que contiene solo código php.

Código PHP
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            display: grid;
            place-items: center;
            /* height: 100vh; */
            margin: 0;
            font-family: sans-serif;
        }
    </style>
</head>
<body>
    <h1>Libros Recomendados</h1>
    <ul>
        <?php foreach ($filteredBooks as $book) : ?>
            <li>
                <a href="<?= $book['purchaseUrl'] ?>">
                    <?= $book['name'] ?> (<?= $book['publicationDate']?>) - By <?= $book['author'] ?>
                </a>
            </li>
        <?php endforeach; ?>
    </ul>
</body>
</html> 

En index.php

Código PHP
<?php
        
$books = [
    [
        'name' => 'Do Androids Dream of Electric Sheep?',
        'author' => 'Philip K. Dick',
        'purchaseUrl' => 'http://example1.com',
        'publicationDate' => 1968,
    ],

    [
        'name' => 'Four Past Midnight',
        'author' => 'Stephen King',
        'purchaseUrl' => 'http://example2.com',
        'publicationDate' => 1990,
    ],

    [
        'name' => 'Project Hail Mary',
        'author' => 'Andy Weir',
        'purchaseUrl' => 'http://example3.com',
        'publicationDate' => 2021,
    ],

    [
        'name' => 'The Martian',
        'author' => 'Andy Weir',
        'purchaseUrl' => 'http://example4.com',
        'publicationDate' => 2011,
    ],
];

// Mandar llamar la **built-in** function de PHP mejor! 
$filteredBooks = array_filter($books, function ($book){
    return $book['author'] === 'Andy Weir';
});    

require "index.view.php";

Listo!

Con esto efectivamente separamos la lógica de php con la vista que solo se dedica al render de la pagina que queremos que el usuario pueda ver! Nota: Como las variables como $filteredBooks pueden ser vista por el código en la vista!, esto es gracias al la instrucción de php require "index.view.php"; que usamos para mandar llamar nuestra vista.