Tutorial CMS - Creando la Base de Datos

Ahora que tenemos CakePHP instalado, configuremos la base de datos para nuestro CMS. Si aún no lo ha hecho, cree una base de datos vacía para usar en este tutorial, con un nombre de su elección, p. ej. cake_cms. Si está utilizando MySQL/MariaDB, puede ejecutar el siguiente SQL para crear las tablas necesarias:

USE cake_cms;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(191) NOT NULL,
    body TEXT,
    published BOOLEAN DEFAULT FALSE,
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (slug),
    FOREIGN KEY user_key (user_id) REFERENCES users(id)
) CHARSET=utf8mb4;

CREATE TABLE tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(191),
    created DATETIME,
    modified DATETIME,
    UNIQUE KEY (title)
) CHARSET=utf8mb4;

CREATE TABLE articles_tags (
    article_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (article_id, tag_id),
    FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
    FOREIGN KEY article_key(article_id) REFERENCES articles(id)
);

INSERT INTO users (email, password, created, modified)
VALUES
('[email protected]', 'secret', NOW(), NOW());

INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', 1, NOW(), NOW());

Si está utilizando PostgreSQL, conéctese a la base de datos cake_cms y ejecute el siguiente SQL en su lugar:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created TIMESTAMP,
    modified TIMESTAMP
);

CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(191) NOT NULL,
    body TEXT,
    published BOOLEAN DEFAULT FALSE,
    created TIMESTAMP,
    modified TIMESTAMP,
    UNIQUE (slug),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE tags (
    id SERIAL PRIMARY KEY,
    title VARCHAR(191),
    created TIMESTAMP,
    modified TIMESTAMP,
    UNIQUE (title)
);

CREATE TABLE articles_tags (
    article_id INT NOT NULL,
    tag_id INT NOT NULL,
    PRIMARY KEY (article_id, tag_id),
    FOREIGN KEY (tag_id) REFERENCES tags(id),
    FOREIGN KEY (article_id) REFERENCES articles(id)
);

INSERT INTO users (email, password, created, modified)
VALUES
('[email protected]', 'secret', NOW(), NOW());

INSERT INTO articles (user_id, title, slug, body, published, created, modified)
VALUES
(1, 'First Post', 'first-post', 'This is the first post.', TRUE, NOW(), NOW());

Es posible que haya notado que la tabla articles_tags utiliza una clave primaria compuesta. CakePHP admite claves primarias compuestas en casi todas partes, lo que le permite tener esquemas más simples que no requieren columnas id adicionales.

Los nombres de tabla y columna que usamos no fueron arbitrarios. Al usar las convenciones de nomenclatura de CakePHP, podemos aprovechar CakePHP más eficazmente y evitar la necesidad de configurar el framework. Si bien CakePHP es lo suficientemente flexible para adaptarse a casi cualquier esquema de base de datos, adherirse a las convenciones le ahorrará tiempo, ya que puede aprovechar los valores predeterminados basados en convenciones que ofrece CakePHP.

Configuración de la base de datos

A continuación, digamos a CakePHP dónde está nuestra base de datos y cómo conectarse a ella. Reemplace los valores en el arreglo Datasources.default en su archivo config/app.php con los que aplican a su configuración. Una arreglo de configuración completo de muestra podría tener el siguiente aspecto:

<?php
return [
    // Más configuración arriba.
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            // Replace Mysql with Postgres if you are using PostgreSQL
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => 'cakephp',
            'password' => 'AngelF00dC4k3~',
            'database' => 'cake_cms',
            // Comment out the line below if you are using PostgreSQL
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
        ],
    ],
    // Más configuración abajo.
];

Una vez que haya guardado su archivo config/app.php, debería ver que la sección “CakePHP is able to connect to the database” tiene un gorro de cocinero verde.

Nota

Si tiene config/app_local.php en la carpeta de su aplicación, este anula la configuración de app.php.

Creando nuestro primer modelo

Los modelos son el corazón de las aplicaciones CakePHP. Nos permiten leer y modificar nuestros datos. Nos permiten construir relaciones entre nuestros datos, validarlos y aplicar reglas de aplicación. Los modelos construyen las bases necesarias para construir nuestras acciones y plantillas del controlador.

Los modelos de CakePHP se componen de objetos Table y Entity. Los objetos Table brindan acceso a la colección de entidades almacenadas en una tabla específica. Se almacenan en src/Model/Table. El archivo que crearemos se guardará en src/Model/Table/ArticlesTable.php. El archivo completo debería verse así:

<?php
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;

use Cake\ORM\Table;

class ArticlesTable extends Table
{
    public function initialize(array $config): void
    {
        $this->addBehavior('Timestamp');
    }
}

Hemos agregado el comportamiento Timestamp Behavior que automáticamente llenará las columnas created y modified de nuestra tabla. Al nombrar nuestro objeto Table ArticlesTable, CakePHP puede usar convenciones de nomenclatura para saber que nuestro modelo usa la tabla articles` de la base de datos. CakePHP también usa convenciones para saber que la columna id es la clave primaria de nuestra tabla.

Nota

CakePHP creará dinámicamente un objeto modelo para usted si no puede encontrar un archivo correspondiente en src/Model/Table. Esto también significa que si accidentalmente asigna un nombre incorrecto a su archivo (es decir, articlestable.php o ArticleTable.php), CakePHP no reconocerá ninguna de sus configuraciones y utilizará el modelo generado en su lugar.

También crearemos una clase Entity para nuestros artículos. Las Entity representan un solo registro en la base de datos y proporcionan un comportamiento a nivel de fila para nuestros datos. Nuestra Entity se guardará en src/Model/Entity/Article.php. El archivo completo debería verse así:

<?php
// src/Model/Entity/Article.php
namespace App\Model\Entity;

use Cake\ORM\Entity;

class Article extends Entity
{
    protected $_accessible = [
        '*' => true,
        'id' => false,
        'slug' => false,
    ];
}

Nuestra entidad es bastante delgada en este momento, y solo hemos configurado la propiedad _accessible que controla cómo las propiedades pueden ser modificadas por entities-mass-assignment.

No podemos hacer mucho con nuestros modelos en este momento, así que a continuación crearemos nuestro primer Controller y Template para permitirnos interactuar con nuestro modelo.