diff --git a/starting-manual.html b/starting-manual.html index 28c8ea8..68a63c2 100644 --- a/starting-manual.html +++ b/starting-manual.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Duckbrain - Manual de inicio @@ -219,57 +219,57 @@ $(function() { $('.note').before("

Note

")

Table of Contents

-
-

1. Introducción

+
+

1. Introducción

Duckbrain es un conjunto de librerías creadas especialmente pensando en hacer algo simple, que cualquiera pueda deshacer y rearmar fácilmente. Gracias a esa versatilidad, puedes usarlo cualquier proyecto, peo por ello debes tener en cuenta que mientras más grande sea el proyecto, mayor será el nivel de ingeniería que se requerirá de tu parte para acondicionar esta herramienta a los requerimientos. @@ -284,8 +284,8 @@ Ducho eso, vamos a comenzar…

-
-

1.1. Estructura de archivos de Duckbrain

+
+

1.1. Estructura de archivos de Duckbrain

Al entrar a la carpeta de Duckbrain encontraras esta estructura de archivos (ignoramos el readme.org porque no es necesario). @@ -318,8 +318,8 @@ Primero veamos las carpetas y luego los archivos:

-
-

1.1.1. Carpeta src

+
+

1.1.1. Carpeta src

En esta carpeta se encuentra todo el código PHP. @@ -331,8 +331,8 @@ Como todo en Duckbrain, esta ruta

-
-

1.1.2. Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers

+
+

1.1.2. Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers

Si sabes de estructuras de diseño, el nombre de estas carpetas ya te debe quedar claro qué va en cada una de ellas, puesto que en el nombre de la carpeta dice lo que va a ir dentro. @@ -343,7 +343,7 @@ Si no sabes que es un Model, un Middleware, Controller, etc. entonces requieres

-Al igual que con la carpeta src, todo lo puedes cambiar y colocar otra estructura de carpetas y las únicas que requerirían algún tipo de edición de archivos serían las carpetas Views y Router que se editarían en el archivo src/Libs/View.php y el archivo index.php respectivamente. Las demás carpetas las puedes borrar cuando quieras y usar otra estructura, pero por lo pronto no lo hagas al menos hasta que hayas pasado la sección 3 que es cuando ya habrías leído y, con algo de suerte y pericia, asimilado los conocimientos necesarios para hacer lo que te de la gana con este ser de librería al punto de que ya le podrás colocar las tuyas propias, le borrarás alguna de las que viene por defecto porque no la necesites o incluso crees una versión extendida de las que viene por defecto para poder añadirle alguna mejora que necesites. +Al igual que con la carpeta src, todo lo puedes cambiar y colocar otra estructura de carpetas y las únicas que requerirían algún tipo de edición de archivos serían las carpetas Views y Router que se editarían en el archivo src/Libs/View.php y el archivo index.php respectivamente. Las demás carpetas las puedes borrar cuando quieras y usar otra estructura, pero por lo pronto no lo hagas al menos hasta que hayas pasado la sección 3 que es cuando ya habrías leído y, con algo de suerte y pericia, asimilado los conocimientos necesarios para hacer lo que te de la gana con este ser de librería al punto de que ya le podrás colocar las tuyas propias, le borrarás alguna de las que viene por defecto porque no la necesites o incluso crees una versión extendida de las que viene por defecto para poder añadirle alguna mejora que necesites.

@@ -356,8 +356,8 @@ Para el resto de mortales y gente con menos arrogancia, pueden seguir un ratito

-
-

1.1.3. Los archivos en la raíz

+
+

1.1.3. Los archivos en la raíz

El .htaccess es un archivo que te será útil si usas apache o algún otro servidor web que use estos archivos y lo que lleva es una configuración especial para que funcionen las rutas virtuales, o sea, para que podamos crear una ruta tipo mitsitio.com/mi-ruta-virtual/ y podamos decir que allí muestre un mensaje de Hola mundo, a pesar de que la carpeta mi-ruta-virtual no exista, ni haya dentro ningún archivo index que tenga el texto Hola mundo. Si esta aún no lo entendiste, no exasperes que ya lo vas a entender en un momento y ahí podrás volver a repasar esta parte. @@ -368,8 +368,8 @@ En caso de que uses nginx, debes configurar el webserver con la regla equivalent

-
location / {
-    try_files $uri $uri/ ./index.php$args;
+
location / {
+    try_files $uri $uri/ ./index.php$args;
 }
 
@@ -384,8 +384,8 @@ El archivo config.php, como su nombre indica, es el archivo para co
-
-

1.1.4. Los archivos en la carpeta Libs

+
+

1.1.4. Los archivos en la carpeta Libs

Son básicamente librerías, cada una tiene como nombre lo que hace, no tiene mucho misterio y al igual que antes con las carpetas, si sabes algo de diseño, con leer el nombre de las mismas te debería bastar para saber lo que hacen. Si no lo entiendes, sigue leyendo el manual que hablaremos de casi todas poco a poco. @@ -394,8 +394,8 @@ Son básicamente librerías, cada una tiene como nombre lo que hace, no tiene mu

-
-

1.2. Comprendiendo el arranque del sistema

+
+

1.2. Comprendiendo el arranque del sistema

Como la intención de este manual es que comprendas Duckbrain y no solo seas un robot que copia y pega de la documentación, vamos a calentar comprendiendo el código que lo arranca. @@ -410,7 +410,7 @@ Supongamos que entramos en la ruta /hola (o sea, misitio.com/

-Primero intenta comprobar si el fichero "hola" existe en la ruta a la que se desea acceder, si no es el caso prueba si existe una carpeta "hola" y si tampoco sucede eso, reenvía todo a index.php y le pide que él se encargue de ahí en adelante. Si llega hasta la tercera opción decimos que es una ruta virtual (lo que mencionamos en Los archivos en la raiz), porque devolveremos algo desde el PHP simulando un archivo o una carpeta, a pesar de que esa ruta realmente no existe ni como fichero ni como carpeta. +Primero intenta comprobar si el fichero "hola" existe en la ruta a la que se desea acceder, si no es el caso prueba si existe una carpeta "hola" y si tampoco sucede eso, reenvía todo a index.php y le pide que él se encargue de ahí en adelante. Si llega hasta la tercera opción decimos que es una ruta virtual (lo que mencionamos en Los archivos en la raiz), porque devolveremos algo desde el PHP simulando un archivo o una carpeta, a pesar de que esa ruta realmente no existe ni como fichero ni como carpeta.

@@ -418,7 +418,7 @@ Ahora veamos que hace index.php, en la primera línea nos dice esto

-
require_once('config.php');
+
require_once('config.php');
 
@@ -427,8 +427,8 @@ Aquí carga el archivo config.php, o sea, carga la configuración.

-
define('ROOT_DIR', __DIR__);
-define('ROOT_CORE', ROOT_DIR.'/src');
+
define('ROOT_DIR', __DIR__);
+define('ROOT_CORE', ROOT_DIR.'/src');
 
@@ -437,14 +437,14 @@ Se está definiendo una constante ROOT_DIR que contiene como valor

-
spl_autoload_register(function ($className) {
-    $fp = str_replace('\\','/',$className);
-    $name = basename($fp);
-    $dir  = dirname($fp);
-    $file = ROOT_CORE.'/'.$dir.'/'.$name.'.php';
-    if (file_exists($file)) {
-        require_once $file;
-        return;
+
spl_autoload_register(function ($className) {
+    $fp = str_replace('\\','/',$className);
+    $name = basename($fp);
+    $dir  = dirname($fp);
+    $file = ROOT_CORE.'/'.$dir.'/'.$name.'.php';
+    if (file_exists($file)) {
+        require_once $file;
+        return;
     }
 });
 
@@ -463,13 +463,13 @@ Si aún no lo entendiste, no pierdas tiempo releyendo el párrafo anterior, en s

-
$routers = glob(ROOT_CORE.'/Routers/*.php');
+
$routers = glob(ROOT_CORE.'/Routers/*.php');
 
-foreach($routers as $file){
-    require_once($file);
+foreach($routers as $file){
+    require_once($file);
 }
 
-\Libs\Router::apply();
+\Libs\Router::apply();
 
@@ -487,8 +487,8 @@ Nótese que lo que ha hecho el autoloader es convertir los backslashes o barras
-
-

1.3. Extra: Namespaces

+
+

1.3. Extra: Namespaces

Si eres nuevo en esto puede que no sepas lo que es un namespace, pero si también te dio curiosidad el que la una clase tenga \ (backslash) en su nombre, entonces tienes futuro en este campo y como no quiero que te vayas de este manual, voy a explicarte rápidamente de donde viene ese backslash. @@ -499,7 +499,7 @@ Si abres el archivo src/Libs/Router.php verás que en su primera l

-
namespace Libs;
+
namespace Libs;
 
@@ -518,16 +518,16 @@ Puede que ahora mismo no notes la utilidad de esto, pero es algo muy útil realm
-
-

2. Primeros pasos

+
+

2. Primeros pasos

Antes de ponernos a programar vamos a asegurarnos de estar en la misma pagina preparando nuestro entorno de trabajo y haciendo el usual Hola mundo.

-
-

2.1. Usando un Webserver para el desarrollo

+
+

2.1. Usando un Webserver para el desarrollo

Desde luego esta la carpeta con Duckbrain supongo que ya la tienes con un webserver nginx o apache en localhost. Si no es el caso, al menos deberás instalarte PHP primero y una ves instalado, abres una terminal en la carpeta donde tienes Duckbrain y ejecutas: @@ -552,8 +552,8 @@ He conocido gente que usa directamente un hosting y edita los archivos allí. Es

-
-

2.2. Hola mundo

+
+

2.2. Hola mundo

Agarren su teclado y su editor de código que vamos a comenzar a hacer la magia. Como es usual, el primer paso para hacer nuetra aplicación, será imprimir un hello world. @@ -564,12 +564,12 @@ Para ello vamos a la carpeta src/Routers y crearemos un archivo con

-
<?php
-use Libs\Request;
-use Libs\Router;
+
<?php
+use Libs\Request;
+use Libs\Router;
 
-Router::get('/', function(Request $requets) {
-    echo "Hola mundo";
+Router::get('/', function(Request $requets) {
+    echo "Hola mundo";
 });
 
@@ -580,16 +580,16 @@ Ahora, siguiendo con el código, abrimos la URL donde estamos corriendo el sitio

-
-

2.2.1. Explicación del código del hola mundo

+
+

2.2.1. Explicación del código del hola mundo

Si entendiste el código con solo leerlo, perfecto, pero si no lo hiciste, vamos a explicarlo. Primero vamos a explicar esta parte:

-
Router::get('/', function(Request $requets) {
-    echo "Hola mundo";
+
Router::get('/', function(Request $requets) {
+    echo "Hola mundo";
 });
 
@@ -611,7 +611,7 @@ Lo que estámos haciendo aquí, es llamar al método get de la clas

-Al igual que en Extra: Namespaces la explicación de las primeras 2 líneas de este código, realmente no es algo de Duckbrain, sino del lenguaje mismo, pero de todos modos lo explicaré. +Al igual que en Extra: Namespaces la explicación de las primeras 2 líneas de este código, realmente no es algo de Duckbrain, sino del lenguaje mismo, pero de todos modos lo explicaré.

@@ -619,9 +619,9 @@ Primero que nada, si no quisieramos o no tuviéramos la posibilidad de usar

-
<?php
-Libs\Router::get('/', function(Libs\Request $requets) {
-    echo "Hola mundo";
+
<?php
+Libs\Router::get('/', function(Libs\Request $requets) {
+    echo "Hola mundo";
 });
 
@@ -635,7 +635,7 @@ Si un namespace es como dar un apellido, use es como d

-
use Libs\Router as Rutercito;
+
use Libs\Router as Rutercito;
 
@@ -651,16 +651,16 @@ Prueba ponerle apodos ambas clases y usar sus distintos nombres en el código. E
-
-

3. Mi primera aplicación

+
+

3. Mi primera aplicación

Ya hicimos un hola mundo, ahora vamos a hacer algo completo de verdad. Una buena práctica a la hora de crear proyectos es comenzar a definir lo que vamos a hacer, por lo tanto:

-
-

3.1. Definición del proyecto

+
+

3.1. Definición del proyecto

Vamos a hacer un sistema que nos permita compartir textos de manera secreta. Una persona cualquiera podrá entrar a nuestra web, escribir un texto o nota secreta y se le entregará un enlace con el que puede compartir esa nota secreta. @@ -680,8 +680,8 @@ El nombre de la aplicación será Ignota. No soy bueno con los nombres y

-
-

3.2. Base de datos

+
+

3.2. Base de datos

Este sistema no es algo complicado en lo que al diseño de la base de datos se refiere, por lo que sólo vendría a tener una tabla: @@ -704,11 +704,11 @@ El código para crear las tablas en SQLite sería este:

-
CREATE TABLE notes (
-    id INTEGER PRIMARY KEY,
+
CREATE TABLE notes (
+    id INTEGER PRIMARY KEY,
     content TEXT,
-    expire_at INTEGER,
-    max_views INTEGER
+    expire_at INTEGER,
+    max_views INTEGER
 );
 
@@ -718,11 +718,11 @@ El código para crear las tablas en SQLite sería este:

-
CREATE TABLE notes (
-    id BIGINT PRIMARY KEY AUTO_INCREMENT,
+
CREATE TABLE notes (
+    id BIGINT PRIMARY KEY AUTO_INCREMENT,
     content TEXT,
-    expire_at INT default null,
-    max_views INT default 0
+    expire_at INT default null,
+    max_views INT default 0
 );
 
@@ -732,25 +732,25 @@ Voy a obviar la parte de cómo crear las bases de datos ya que ambas cosas se pu

-
-

3.2.1. Configuración de Duckbrain para la base de datos

+
+

3.2.1. Configuración de Duckbrain para la base de datos

Desde luego, Duckbrain va necesitar tener la información de la base de datos, por lo que abriremos el archivo y veremos algo como esto:

-
<?php
-define('DB_TYPE', 'mysql');
-define('DB_HOST', 'localhost');
-define('DB_NAME', '');
-define('DB_USER', '');
-define('DB_PASS', '');
+
<?php
+define('DB_TYPE', 'mysql');
+define('DB_HOST', 'localhost');
+define('DB_NAME', '');
+define('DB_USER', '');
+define('DB_PASS', '');
 
-//define('SITE_URL', '');
+//define('SITE_URL', '');
 
-define('ROOT_DIR', __DIR__);
-?>
+define('ROOT_DIR', __DIR__);
+?>
 
@@ -763,17 +763,17 @@ El código terminaría así:

-
<?php
-define('DB_TYPE', 'sqlite');
-define('DB_HOST', 'localhost');
-define('DB_NAME', 'mi-bd.sqlite');
-define('DB_USER', '');
-define('DB_PASS', '');
+
<?php
+define('DB_TYPE', 'sqlite');
+define('DB_HOST', 'localhost');
+define('DB_NAME', 'mi-bd.sqlite');
+define('DB_USER', '');
+define('DB_PASS', '');
 
-define('SITE_URL', 'http://localhost/');
+define('SITE_URL', 'http://localhost/');
 
-define('ROOT_DIR', __DIR__);
-?>
+define('ROOT_DIR', __DIR__);
+?>
 
@@ -784,8 +784,8 @@ Como nuestra base de dato es solo un archivo sqlite, no requerimos de DB_H
-
-

3.3. Modelos

+
+

3.3. Modelos

Debo hacer incapié en que nada está escrito en piedra y podemos hacer las cosas de muchas manera con Duckbrain, pero en este caso, siguiendo la estructura MVC, vamos a crear modelos, vistas y controladores. @@ -796,15 +796,15 @@ Comenzando con los modelos, que en realidad para este proyecto sería en singula

-
<?php
-namespace Models;
+
<?php
+namespace Models;
 
-use Libs\Model;
+use Libs\Model;
 
-class Note extends Model {
-    public string $content;
-    public ?int   $expire_at;
-    public int    $max_views = 0;
+class Note extends Model {
+    public string $content;
+    public ?int   $expire_at;
+    public int    $max_views = 0;
 }
 
@@ -822,27 +822,27 @@ Nada de lo mencionado en el anterior párrafo lo necesitaremos, pero de todos mo

-
<?php
-namespace Models;
+
<?php
+namespace Models;
 
-use Libs\Model;
+use Libs\Model;
 
-class Note extends Model {
-    public string    $content;
-    public ?int      $expire_at;
-    public int       $max_views = 0;
-    public string    $tmp_cache;
-    private string   $password;
-    protected string $salt;
+class Note extends Model {
+    public string    $content;
+    public ?int      $expire_at;
+    public int       $max_views = 0;
+    public string    $tmp_cache;
+    private string   $password;
+    protected string $salt;
 
-    // Cambiamos el nombre de la tabla a la que se relacionará nuestro modelo.
-    static protected string $table = 'se_llama_como_YO_quiero_AAAhh';
+    // Cambiamos el nombre de la tabla a la que se relacionará nuestro modelo.
+    static protected string $table = 'se_llama_como_YO_quiero_AAAhh';
 
-    // Forzamos a que se guarden las propiedades salt y password a pesar de que no son públicas.
-    static protected array $forceSave = ['password', 'salt'];
+    // Forzamos a que se guarden las propiedades salt y password a pesar de que no son públicas.
+    static protected array $forceSave = ['password', 'salt'];
 
-    // Frozamos a no guuardar la propiedad pública tmp_cache
-    static protected array $ignoreSave = ['tmp_cache'];
+    // Frozamos a no guuardar la propiedad pública tmp_cache
+    static protected array $ignoreSave = ['tmp_cache'];
 }
 
@@ -853,8 +853,8 @@ Nada de lo mencionado en el anterior párrafo lo necesitaremos, pero de todos mo
-
-

3.4. Creando vistas

+
+

3.4. Creando vistas

En este caso solo necesitaremos una sola vista, por ello no crearemos archivos aparte para el código CSS, sino que irá todo en un solo archivo. @@ -865,13 +865,13 @@ Vamos a crear un archivo llamado CreateNote.php en src/Views/

-
<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="UTF-8"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Ignota - Notas encriptadas punto a punto</title>
-    <style>
+
<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Ignota - Notas encriptadas punto a punto</title>
+    <style>
      form {
        display: grid;
        place-content: center;
@@ -906,22 +906,22 @@ Vamos a crear un archivo llamado CreateNote.php en src/Views/
        font-weight: bold;
        display: ;
      }
-    </style>
-  </head>
-  <body>
-    <form method="POST">
-      <textarea name="note" placeholder="Escribe tu texto a encriptar"></textarea>
-      <fieldset class="config">
-        <legend>Configuración de expiración</legend>
-        <label for="max_views">Visualizaciones máximas (0 = infinitas):</label>
-        <input name="max_views" type="int" value="0">
-        <label for="expiration">Tiempo de expiración (en minutos):</label>
-        <input name="expiration" type="int" value="15">
-      </fieldset>
-      <button type="submit">Guardar</button>
-    </form>
-  </body>
-</html>
+    </style>
+  </head>
+  <body>
+    <form method="POST">
+      <textarea name="note" placeholder="Escribe tu texto a encriptar"></textarea>
+      <fieldset class="config">
+        <legend>Configuración de expiración</legend>
+        <label for="max_views">Visualizaciones máximas (0 = infinitas):</label>
+        <input name="max_views" type="int" value="0">
+        <label for="expiration">Tiempo de expiración (en minutos):</label>
+        <input name="expiration" type="int" value="15">
+      </fieldset>
+      <button type="submit">Guardar</button>
+    </form>
+  </body>
+</html>
 
@@ -931,8 +931,8 @@ No creo que sea necesario que expliquemos un código html, si no lo entiendes, n
-
-

3.5. Mostrando el formulario

+
+

3.5. Mostrando el formulario

Ahora no vamos a hacer un archivos completos, los haremos a pedacitos de código a medida que avancemos. @@ -943,16 +943,16 @@ Comenzando con el controlador, vamos a crear un archivo llamado NoteContro

-
<?php
-namespace Controllers;
+
<?php
+namespace Controllers;
 
-use Libs\Request;
-use Libs\View;
+use Libs\Request;
+use Libs\View;
 
-class NoteController {
-    public static function home(Request $request): void
+class NoteController {
+    public static function home(Request $request): void
     {
-        View::render('CreateNote');
+        View::render('CreateNote');
     }
 }
 
@@ -979,10 +979,10 @@ Aquí me doy el lujo de hacer otro paréntesis para hablar del tipo callab

-
<?php
-use Libs\Router;
+
<?php
+use Libs\Router;
 
-Router::get('/', 'Controllers\NoteController::home');
+Router::get('/', 'Controllers\NoteController::home');
 
@@ -991,11 +991,11 @@ O de esta otra manera:

-
<?php
-use Controllers\NoteController;
-use Libs\Router;
+
<?php
+use Controllers\NoteController;
+use Libs\Router;
 
-Router::get('/', [NoteController::class, 'home']);
+Router::get('/', [NoteController::class, 'home']);
 
@@ -1004,8 +1004,8 @@ Ambas funcionarán y al entrar en http://localhost ya

-
-

3.5.1. Extra: Explicación del tipo callable

+
+

3.5.1. Extra: Explicación del tipo callable

Enlos anteriores 2 bloques de código lo que hemos visto han sido 2 maneras de escribir un callable: @@ -1016,13 +1016,13 @@ En el primer código he escrito el nombre completo hasta la función en un strin

-
<?php
-use Controllers\NoteController;
-use Libs\Request;
-use Libs\Router;
+
<?php
+use Controllers\NoteController;
+use Libs\Request;
+use Libs\Router;
 
-Router::get('/', function(){});
-[NoteController::class, 'home'](new Request);
+Router::get('/', function(){});
+[NoteController::class, 'home'](new Request);
 
@@ -1031,12 +1031,12 @@ O también:

-
<?php
-use Libs\Request;
-use Libs\Router;
+
<?php
+use Libs\Request;
+use Libs\Router;
 
-Router::get('/', function(){});
-'Controllers\NoteController::home'(new Request);
+Router::get('/', function(){});
+'Controllers\NoteController::home'(new Request);
 
@@ -1047,34 +1047,34 @@ Sé que esto es algo raro y que realmente tiene que ver con el conocimiendo de P
-
-

3.6. Creando la nota encriptada

+
+

3.6. Creando la nota encriptada

Ahora que ya tenemos el formulario, ya solo nos queda encriptar y guardar nuestra nota. Para ello comenzaremos agregando la siguiente función a nuestro modelo:

-
public function encrypt(): string
+
public function encrypt(): string
 {
-    // Generamos una llave aleatoria de entre 12 a 32 caracteres
-    $secretKey = substr(
-        str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
+    // Generamos una llave aleatoria de entre 12 a 32 caracteres
+    $secretKey = substr(
+        str_shuffle('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
         0,
         mt_rand(16, 32)
     );
 
-    // Encriptamos la nota en AES256 usando la llave antes generada
-    $this->content = openssl_encrypt(
-        $this->content,
-        'AES-256-CBC',
-        $secretKey,
-        OPENSSL_RAW_DATA,
-        substr($secretKey, 0, 16)
+    // Encriptamos la nota en AES256 usando la llave antes generada
+    $this->content = openssl_encrypt(
+        $this->content,
+        'AES-256-CBC',
+        $secretKey,
+        OPENSSL_RAW_DATA,
+        substr($secretKey, 0, 16)
     );
 
-    // Devolvemos la llave
-    return $secretKey;
+    // Devolvemos la llave
+    return $secretKey;
 }
 
@@ -1088,20 +1088,20 @@ Ahora vamos a hacer un controlador que recibirá el formulario, encriptará la n

-
public static function create(Request $request): void
+
public static function create(Request $request): void
 {
-    // Creamos una instancia de Note y le pasamos los datos del formulario
-    $note            = new Note;
-    $note->content   = $request->post->note;
-    $note->max_views = $request->post->max_views;
-    $note->expire_at = strtotime("+{$request->post->expiration} minutes");
+    // Creamos una instancia de Note y le pasamos los datos del formulario
+    $note            = new Note;
+    $note->content   = $request->post->note;
+    $note->max_views = $request->post->max_views;
+    $note->expire_at = strtotime("+{$request->post->expiration} minutes");
 
-    // Encriptamos los datos y luego los guardamos
-    $secretKey = $note->encrypt();
-    $note->save();
+    // Encriptamos los datos y luego los guardamos
+    $secretKey = $note->encrypt();
+    $note->save();
 
-    // Redirigimos a la url final donde se verá la nota
-    Router::redirect("/{$note->id}/{$secretKey}");
+    // Redirigimos a la url final donde se verá la nota
+    Router::redirect("/{$note->id}/{$secretKey}");
 }
 
@@ -1111,8 +1111,8 @@ Desde luego, también tenemos que añadir los uses de Libs\Router y

-
use Libs\Router;
-use Models\Note;
+
use Libs\Router;
+use Models\Note;
 
@@ -1125,7 +1125,7 @@ Para finalizar vamos configurar la ruta. Así que editamos el archivo note

-
Router::post('/', [NoteController::class, 'create']);
+
Router::post('/', [NoteController::class, 'create']);
 
@@ -1139,57 +1139,57 @@ Ahora ya podemos comenzar a crear nuestras notas, auque aún no las podremos ver
-
-

3.7. Recta final: Desencriptando y mostrando las notas

+
+

3.7. Recta final: Desencriptando y mostrando las notas

Vamos directo al grano, editaremos el modelo (src/Models/Note.php) y le añadiremos esta otra función para desencriptar:

-
public function decrypt(string $secretKey) : void
+
public function decrypt(string $secretKey) : void
 {
-    // Verificamos si la nota ha expirado
-    if ($this->expire_at < time()) {
-        $this->content = 'La nota se ha destruido por expiración.';
-        $this->delete();
-        return;
+    // Verificamos si la nota ha expirado
+    if ($this->expire_at < time()) {
+        $this->content = 'La nota se ha destruido por expiración.';
+        $this->delete();
+        return;
     }
 
-    // Intentamos desencriptar.
-    $content = openssl_decrypt(
-        $this->content,
-        'AES-256-CBC',
-        $secretKey,
-        OPENSSL_RAW_DATA,
-        substr($secretKey, 0, 16)
+    // Intentamos desencriptar.
+    $content = openssl_decrypt(
+        $this->content,
+        'AES-256-CBC',
+        $secretKey,
+        OPENSSL_RAW_DATA,
+        substr($secretKey, 0, 16)
     );
 
-    // Verificamos si desencriptó correctamente
-    if (is_string($content)) {
+    // Verificamos si desencriptó correctamente
+    if (is_string($content)) {
 
-        // Verificamos si está configurado para infinitas vistas.
-        if ($this->max_views == 0) {
-            $this->content = $content;
-            return;
+        // Verificamos si está configurado para infinitas vistas.
+        if ($this->max_views == 0) {
+            $this->content = $content;
+            return;
         }
 
-        // Reducimos el contador de vistas
-        $this->max_views = $this->max_views - 1;
-        $this->save();
+        // Reducimos el contador de vistas
+        $this->max_views = $this->max_views - 1;
+        $this->save();
 
-        // Verificamos si el contador de vistas ha llegado a 0.
-        if ($this->max_views <= 0) {
-            $this->content = 'La nota se ha destruido según su límite de vistas.';
-            $this->delete();
-            return;
+        // Verificamos si el contador de vistas ha llegado a 0.
+        if ($this->max_views <= 0) {
+            $this->content = 'La nota se ha destruido según su límite de vistas.';
+            $this->delete();
+            return;
         }
 
-        // Si no ha expirado, solo devolvemos el contenido
-        $this->content = $content;
-    } else {
-        // Si no se pudo desencriptar colocamos un error
-        $this->content = 'Llave incorrecta.';
+        // Si no ha expirado, solo devolvemos el contenido
+        $this->content = $content;
+    } else {
+        // Si no se pudo desencriptar colocamos un error
+        $this->content = 'Llave incorrecta.';
     }
 
 }
@@ -1201,29 +1201,29 @@ Ahora en el NoteController añadiremos esta otra función:
 

-
public static function show(Request $request): void
+
public static function show(Request $request): void
 {
-    // Verificamos si el ID es un número
-    if (!is_numeric($request->params->id)) {
-        Router::defaultNotFound();
-        return;
+    // Verificamos si el ID es un número
+    if (!is_numeric($request->params->id)) {
+        Router::defaultNotFound();
+        return;
     }
 
-    // Obtenemos la nota de la base de datos
-    $note = Note::getById($request->params->id);
+    // Obtenemos la nota de la base de datos
+    $note = Note::getById($request->params->id);
 
-    // Verificamos si la nota existe
-    if (is_null($note))  {
-        Router::defaultNotFound();
-        return;
+    // Verificamos si la nota existe
+    if (is_null($note))  {
+        Router::defaultNotFound();
+        return;
     }
 
-    // Desencriptamos la nota
-    $note->decrypt($request->params->key);
+    // Desencriptamos la nota
+    $note->decrypt($request->params->key);
 
-    // Imprimimos en formato de texto plano el resultado del desencriptado
-    $view = new View;
-    $view->text($note->content);
+    // Imprimimos en formato de texto plano el resultado del desencriptado
+    $view = new View;
+    $view->text($note->content);
 }
 
@@ -1245,7 +1245,7 @@ Ahora la cerecita del paste: Vamos a configurar el router, así que editamos nue

-
Router::get('/{id}/{key}', [NoteController::class, 'show']);
+
Router::get('/{id}/{key}', [NoteController::class, 'show']);
 
@@ -1279,15 +1279,15 @@ Crea una aplicación de gestión tareas (un TODO list), en donde puedas agregar
-
-

3.8. Repositorio

+
+

3.8. Repositorio

Por si alguien se perdió o sencillamente quiere ver código, he subido la aplicación ignota en este repositorio:

-[URL faltante] +https://gitlab.com/kj2me/Ignota

@@ -1297,8 +1297,8 @@ Te animo a hacerle un fork, mejorarlo y enviármelo. Los forks que me parezcan i

-
-

4. Contacto

+
+

4. Contacto

Como siempre, pueden contactarme mediante el correo webmaster@outcontol.net @@ -1316,7 +1316,7 @@ No es una comunidad de programación solamente, pero ahora mismo no existe una d

Author: KJ

-

Created: 2024-05-14 mar 02:58

+

Created: 2024-05-31 vie 16:24

Validate