Si estáis acostumbrados a Laravel, pero estáis probando hostings gratuitos para alojar vuestras webs de prueba, quizás, y sólo quizás, si Laravel recién instalado de Composer ocupa unos 70Mb, y el Hosting gratuito te da justamente 100Mb, a pocos archivos multimedia que tengas, pues no te va a caber. AlwaysData ofrece, por ejemplo, 100Mb, y 00Webhost, de Hostinger, 300Mb.
Hay otra forma de iniciar proyectos en PHP de forma muy ligera, por ejemplo con menos de 5Mb, y sin renunciar a muchas de las ventajas que ofrece Laravel, como por ejemplo, cambiando de Framework.
Wolff es uno de esos frameworks, Slim es otro...
Pero si realmente quieres algo más básico aún, que sea rudimentario, pero no mucho, sencillo, aunque refactorizable, probablemente lo mejor sea empezar instalando un enrutador como Phroute y un motor de plantillas como Twig.
Como este artículo es sobre Twig, dejaremos Phroute para el siguiente artículo.
En realidad es que no me gusta el motor de plantillas de Wolff, porque el motor de plantillas de Laravel, Blade, tiene una característica muy útil, que Twig tampoco tiene por defecto, por lo que hay que instalar una librería extra.
composer require twig/twig
composer require filhocodes/twig-stack-extension
require './vendor/autoload.php';
use Twig\Loader\FilesystemLoader;
use Twig\Environment;
function get_view($template_path, $array_data){
try {
$loader = new FilesystemLoader('./templates');
$twig = new Environment($loader, [
#'cache' => './templates/cache',
'cache' => false,
'debug' => true,
]);
Return $twig->render($template_path, $array_data);
} catch (Exception $e) {
die ('ERROR: ' . $e->getMessage().'<br/>');
}
}
$view = get_view('01_Pages/landing.html', [
'autor'=>"Gordan N. Cajic"
,'titulo'=>"Muestrario"
,'descripcion'=>"No hay descripción por ahora."
]);
return $view;
use FilhoCodes\TwigStackExtension\TwigStackExtension;
$twig->addExtension(new TwigStackExtension());
composer require twig/markdown-extra
composer require twig/extra-bundle
composer require league/commonmark
$twig->addRuntimeLoader(new class implements RuntimeLoaderInterface {
public function load($class) {
if (MarkdownRuntime::class === $class) {
return new MarkdownRuntime(new DefaultMarkdown());
}
}
});
$twig->addExtension(new MarkdownExtension());
composer require phroute/phroute
/*------------------------------------------------------------------------------
Función para tener un ENRUTADOR de Peticiones y Respuestas HTTP:
------------------------------------------------------------------------------*/
function get_router(){
try {
$router = new RouteCollector();
Return $router;
} catch (Exception $e) {
die ('ERROR: ' . $e->getMessage());
}
}
Es decir, si usamos el servicio de Hosting de AlwaysData, nos registramos y accedemos a espacio gratis, tendremos un dominio que sea nuestro nombre de usuario + .alwaysdata.net, como por ejemplo https://ingordan.alwaysdata.net
Al escribir esa dirección en la barra de direcciones, el Hosting irá en busca del archivo index.php y el enrutador de Phroute leerá esa dirección para decidir qué hacer, como si fuese una pregunta.
/*------------------------------------------------------------------------------
Función para obtener una Respuesta a una Petición HTTP:
------------------------------------------------------------------------------*/
function get_response($router){
# 1) La dirección que se ha escrito en la barra de direcciones del navegador:
$php_self = $_SERVER['PHP_SELF'];
# 2) ¿HTTP o HTTPS?
$method = $_SERVER['REQUEST_METHOD'];
# 3) La parte de la direción que no es la raíz del dominio:
$request_uri = $_SERVER['REQUEST_URI'];
$proyect_root = str_replace("index.php", "", $php_self);
$where_am_i = str_replace($proyect_root, "/", $request_uri);
$dispatcher = new Dispatcher($router->getData());
try {
$response = $dispatcher->dispatch($method, parse_url($where_am_i, PHP_URL_PATH));
Return $response;
} catch (Exception $e) {
$response = $dispatcher->dispatch($method, parse_url('/404', PHP_URL_PATH));
Return $response;
}
}
$router = get_router();
$response = get_response($router);
print $response;
Esto lo que hace es imprimir en pantalla HTML que tengamos preparado para ello.
Aunque nada de esto funcionará si no se crea un archivo .htaccess con estas líneas de código:
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
# Redirect to front controller
RewriteEngine On
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
ErrorDocument 404 /404
<section class="row justify-content-center" x-data="{ names: ['Strenght', 'Perception', 'Endurance', 'Charisma', 'Intelligence', 'Agility' , 'Luck'] }">
<template x-for="(name, index) in names" :key="index">
<div class="py-3 col-6 col-sm-4 col-md-3 col-lg-2 col-xl-1" x-data="{ n: 0, min:0, max: 10 }">
<label :for="name" x-text="name"></label>
<div class="input-group input-group-vertical">
<button class="btn btn-outline-primary input-group-text" x-on:click="n++;if(n > max){n = max;}"><i class="bi bi-plus"></i></button>
<input x-bind:id="name" x-bind:name="name" type="number" :value="n" class="form-control text-end" x-bind:min="min" x-bind:max="max" x-bind:aria-label="name">
<button class="btn btn-outline-danger input-group-text" x-on:click="n--;if(n < min){n = min;}"><i class="bi bi-dash"></i></button>
</div>
</div>
</template>
</section>