Como construir un proyecto php profesional
25 octubre, 2024
- Como construir un proyecto php profesional
- 1 etapa. Producto Mínimo Producto Viable.
- 2 etapa: proyecto con carpetas bien estructuradas, Model View Crontroller, .htaccess, autoload e index.php
- 3 etapa: integrando composer.
- 4 Etapa: ORM, Blade, migraciones, laravel
Introducción
Explicaremos el proceso de creación de una web en php de cero a experto.
Lo primero es tener ya la base de datos construida, en nuestro caso utilizaremos sqlite3.
Nuestro entorno
1.Descarga php desde aquí: https://windows.php.net/download/

Ponlo en la carpeta c:\php y crea la variable de entorno:

Copia y pega el archivo “php.ini-production” y renómbralo a php.ini

Ábrelo y descomenta la línea donde sale la extensión sqlite3 para poder utilizarla:


Abre un terminal y escribe “php –versión” para ver que funciona bien:

Sqlite viewer , para manejar las bases de datos sqlite:

Y FTP sync para cuando tengamos que utilizar el servidor en nuestro hosting:

1. Ponte en contacto con el rapiñador para obtener el archivo ftp-sync.json que tendrás que poner en la carpeta web/.vscode para que se sincronicen los datos con el servidor.
2. Si al guardar no se actualiza pincha en Crtl+Shift+p y escribe en la paleta de comandos Ftp-sync: upload file
Donde quieras crea una carpeta para tu proyecto footballdata y abrela con vscode:
Crea un nuevo archivo llamado “index.php” y dentro escribe:
<?php
print «Hola desde php»;
Corriendo el servidor
Sitúate en el directorio raíz dentro del proyecto y escribe en la terminal o cmd:
php -S localhost:80

Ahora ve al navegador y escribe localhost:

Apagando el servidor
Presiona Control+c dentro del terminal o cmd:

1 etapa. Producto Mínimo Producto Viable
Creamos el producto mínimo viable, se vería así:


En el document-start.php tendrá todos los requires y los cdn de boostrap:
https://github.com/Murciadevs/footballdata/blob/main/web-v1/document-start.php

En el document-end, el enlace a nuestro main.js y el js de boostrap:
https://github.com/Murciadevs/footballdata/blob/main/web-v1/document-end.php

En el archivo: jugadores.php, estará la vista, la base de datos y la paginación:
https://github.com/Murciadevs/footballdata/blob/main/web-v1/jugadores.php

Si te dá este error:

Es que no has creado en archivo php.ini o no has descomenta la línea “extensión=sqlite3”

Cierra el servidor y enciendelo otra vez con “php -S localhost:80”
2 etapa: proyecto con carpetas bien estructuradas, Model View Crontroller, .htaccess, autoload e index.php
2.1 Creamos la estructura de carpetas

2.2 Creamos el .htacess
Todas las webs modernas redireccionan las urls o llamadas al servidor a un único archivo, llamado index.php, de esta forma podemos crear un sistema de llamadas a las vistas y bases de datos mas controlada, tenemos que decirle a nuestro servidor que todas las llamadas las mande al index.php y para eso es el archivo .htaccess, este archivo configura el servidor automáticamente.
Como trabajamos en un servidor sin apache tendremos que utilizar un script que redireccione todas las llamadas al index.php, a partir de ahora cuando arranquemos nuestro servidor escribiremos:
php -S localhost:80 router-htaccess.php
<?php
//https://stackoverflow.com/questions/27381520/php-built-in-server-and-htaccess-mod-rewrites
//php -S localhost:80 router-htaccess.php
chdir(__DIR__);
$filePath = realpath(ltrim($_SERVER["REQUEST_URI"], '/'));
if ($filePath && is_dir($filePath)){
// attempt to find an index file
foreach (['index.php', 'index.html'] as $indexFile){
if ($filePath = realpath($filePath . DIRECTORY_SEPARATOR . $indexFile)){
break;
}
}
}
if ($filePath && is_file($filePath)) {
// 1. check that file is not outside of this directory for security
// 2. check for circular reference to router.php
// 3. don't serve dotfiles
if (strpos($filePath, __DIR__ . DIRECTORY_SEPARATOR) === 0 &&
$filePath != __DIR__ . DIRECTORY_SEPARATOR . 'router.php' &&
substr(basename($filePath), 0, 1) != '.'
) {
if (strtolower(substr($filePath, -4)) == '.php') {
// php file; serve through interpreter
include $filePath;
} else {
// asset file; serve from filesystem
return false;
}
} else {
// disallowed file
header("HTTP/1.1 404 Not Found");
echo "404 Not Found";
}
} else {
// rewrite to our index file
include __DIR__ . DIRECTORY_SEPARATOR . 'index.php';
}
<?php
//https://stackoverflow.com/questions/27381520/php-built-in-server-and-htaccess-mod-rewrites
//php -S localhost:80 router-htaccess.php
chdir(__DIR__);
$filePath = realpath(ltrim($_SERVER[«REQUEST_URI»], ‘/’));
if ($filePath && is_dir($filePath)){
// attempt to find an index file
foreach ([‘index.php’, ‘index.html’] as $indexFile){
if ($filePath = realpath($filePath . DIRECTORY_SEPARATOR . $indexFile)){
break;
}
}
}
if ($filePath && is_file($filePath)) {
// 1. check that file is not outside of this directory for security
// 2. check for circular reference to router.php
// 3. don’t serve dotfiles
if (strpos($filePath, __DIR__ . DIRECTORY_SEPARATOR) === 0 &&
$filePath != __DIR__ . DIRECTORY_SEPARATOR . ‘router.php’ &&
substr(basename($filePath), 0, 1) != ‘.’
) {
if (strtolower(substr($filePath, -4)) == ‘.php’) {
// php file; serve through interpreter
include $filePath;
} else {
// asset file; serve from filesystem
return false;
}
} else {
// disallowed file
header(«HTTP/1.1 404 Not Found»);
echo «404 Not Found»;
}
} else {
// rewrite to our index file
include __DIR__ . DIRECTORY_SEPARATOR . ‘index.php’;
}
Otra opción es trabajar con XAMPP, que tiene un servidor apache, en este caso nuestro archivo .htaccess tendrá esta pinta:
Archivo .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
En el servidor, cuando lo subamos tendremos que utilizar este:
Archivo :htaccess:
https://github.com/Murciadevs/footballdata/blob/main/web-v2/.htaccess
RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
2.2 creamos el autoload.php donde requerimos todos los archivos
Archivo autoload.php
https://github.com/Murciadevs/footballdata/blob/main/web-v2/autoload.php
<?php
require_once(__DIR__ .»/app/Libraries/SQLiteCient.php»);
require_once(__DIR__ .»/app/Repositories/JugadoresRepository.php»);
require_once(__DIR__ .»/app/Repositories/ClubesRepository.php»);
require_once(__DIR__ .»/app/Repositories/CompeticionesRepository.php»);
require_once(__DIR__ .»/app/Repositories/JuegosRepository.php»);
require_once(__DIR__ .»/app/utils/utils.php»);
require_once(__DIR__ .»/app/config/config.php»);
require_once(__DIR__ .»/app/views/pagination.php»);
2.4. creamos el index.php donde requerimos el autoload y enrutamos las peticiones a las vistas
Archivo index.php
https://github.com/Murciadevs/footballdata/blob/main/web-v2/index.php
<?php
//Arrnca el servidor con «php -S localhost:80 router-htaccess.php»
ini_set(‘display_errors’, ‘1’);
error_reporting(E_ALL);
session_start();
include_once(__DIR__ . «/autoload.php»);
$request_uri = $_SERVER[‘REQUEST_URI’];
$pagina_hasta_el_punto=strrpos($request_uri,».»);
$pagina=substr($request_uri,0,$pagina_hasta_el_punto);
if ($pagina==»» || $pagina==»/index») {
require_once(__DIR__ .»/app/views/index.php»);
}elseif ($pagina==»/jugadores») {
require_once(__DIR__ .»/app/views/jugadores.php»);
}elseif ($pagina==»/clubes») {
require_once(__DIR__ .»/app/views/clubes.php»);
}elseif ($pagina==»/competiciones») {
require_once(__DIR__ .»/app/views/competiciones.php»);
}elseif ($pagina==»/juegos») {
require_once(__DIR__ .»/app/views/juegos.php»);
}elseif ($pagina==»/cruzadas») {
require_once(__DIR__ .»/app/views/cruzadas.php»);
}elseif ($pagina==»/esquema») {
require_once(__DIR__ .»/app/views/esquema.php»);
}else{
echo «\nMethod not allowed»;
exit;
}
2.5 El modelo
Lo primero es crear la clase que nos va a permitir conectarnos a la base de datos:
Archivo app\Libraries\SQLiteClient.php
https://github.com/Murciadevs/footballdata/blob/main/web-v2/app/Libraries/SQLiteCient.php
<?php
class SQLiteClient {
public $sqlite;
public $result;
function __construct(){
try {
// Conectar a la base de datos SQLite3
$this->sqlite = new SQLite3(«football-data.sqlite»);
} catch (Exception $e) {
// En caso de error, mostrar el mensaje
echo «Error al conectar a la base de datos: » . $e->getMessage();
}
}
public function query($sql){
$this->result = $this->sqlite->query($sql);
if (!$this->result) {
echo «<p>Error al ejecutar la consulta</p>»;
$this->result=NULL;
}
return $this->result;
}
public function getTables(){
$tables=array();
$resultado = $this->sqlite->query(«SHOW TABLES»);
while ($linea = $resultado->fetchArray(SQLITE3_ASSOC)) {
$tables[]= $linea[0];
}
return $tables;
}
public function checkExitsToursTable($table_to_found){
$tables=$this->getTables();
foreach($tables as $posicion=>$table){
if ($table==$table_to_found || $table== strtoupper($table_to_found)){
return true;
}
}
return false;
}
function close(){
if ($this->sqlite) {
$this->sqlite->close();
}
}
function dropDatabase(){
$tables=$this->getTables();
foreach($tables as $posicion=>$table){
$this->sqlite->exec(«DROP TABLE «.$table);
}
if (file_exists(DB_PATH)){
unlink(DB_PATH);
}
}
}
Ahora viene la clase que va a tener el objeto SQLiteClient y que contendrá todas las operaciones a la base de datos Create Read Update Delete, la llamamos JugadoresRepository y está la ubicación :
Archivo app\Repositories\JugadoresRepository.php
https://github.com/Murciadevs/footballdata/blob/main/web-v2/app/Repositories/JugadoresRepository.php
<?php
class JugadoresRepository{
private $sqliteCient;
public function __construct(){
$this->sqliteCient = new SQLiteClient();
}
public function __destruct(){
if ($this->sqliteCient) {
$this->sqliteCient->close();
}
}
public function get_count_jugadores( $where_name=»»,$where_value=»»){
$rowCount=0;
try {
if(empty( $where_name)){
$result = $this->sqliteCient->query(«SELECT count(*) FROM players;»);
}else{
$result = $this->sqliteCient->query(«SELECT count(*) FROM players WHERE {$where_name} LIKE ‘%{$where_value}%’;»);
}
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$rowCount = $row[‘count(*)’];
}
$result->finalize();
} catch (Exception $e) {
// En caso de error, mostrar el mensaje
echo «Error al conectar a la base de datos: » . $e->getMessage();
}
return $rowCount;
}
public function get_jugadores($init=0, $where_name=»»,$where_value=»», $order=»player_id»){
$jugadores=[];
try {
// Consultar los datos de la tabla
if(empty( $where_name)){
$result = $this->sqliteCient->query(«SELECT * FROM players ORDER BY {$order} LIMIT {$init}, 10;»);
}else{
$result = $this->sqliteCient->query(«SELECT * FROM players WHERE {$where_name} LIKE ‘%{$where_value}%’ ORDER BY {$order} LIMIT {$init}, 10;»);
}
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$jugadores[] = $row;
}
$result->finalize();
} catch (Exception $e) {
echo «Error al conectar a la base de datos: » . $e->getMessage();
}
return $jugadores;
}
}
2.6 Vista
Archivo app\Repository\JugadoresRepository.php
https://github.com/Murciadevs/footballdata/blob/main/web-v2/app/views/jugadores.php
<?php include_once(__DIR__ . «/document-start.php»);
$jugadoresRepository = new JugadoresRepository();
$total_registers=0;
$jugadores=[];
// Si se ha recibido algo del formaulario de confirguración
if(isset($_POST[‘submit’])){
$page=0;
if (isset($_POST[‘page’])) {
$page = $_POST[‘page’];
}
$jugadores=$jugadoresRepository->get_jugadores($page*10, $_POST[‘where_name’],$_POST[‘where_value’]);
$total_registers= $jugadoresRepository->get_count_jugadores( $_POST[‘where_name’],$_POST[‘where_value’]);
}else{
//Si no se ha recibido nada del formulariod e configuración pero se ha recibido al por la URL
if(isset($_GET[‘where_name’])){
if (isset($_GET[‘order_by’])) {
$jugadores=$jugadoresRepository->get_jugadores($_GET[‘page’]*10, $_GET[‘where_name’],$_GET[‘where_value’], $_GET[‘order_by’]);
$total_registers= $jugadoresRepository->get_count_jugadores( $_GET[‘where_name’],$_GET[‘where_value’], $_GET[‘order_by’]);
} else {
$jugadores=$jugadoresRepository->get_jugadores($_GET[‘page’]*10, $_GET[‘where_name’],$_GET[‘where_value’]);
$total_registers= $jugadoresRepository->get_count_jugadores($_GET[‘where_name’],$_GET[‘where_value’]);
}
}else{
$jugadores=$jugadoresRepository->get_jugadores();
$total_registers= $jugadoresRepository->get_count_jugadores();
}
}
?>
<!——————————————–>
<!———-Formaulario de configuración——>
<!———————————————>
<form method=post action=’jugadores.php’ >
<!–Parte de li utilizando bootstrap–>
<div class=»dropdown d-flex»>
<a class=»btn btn-primary dropdown-toggle» href=»#» role=»button» id=»dropdownMenuLink» data-bs-toggle=»dropdown» aria-expanded=»false»>
Search in
</a>
<ul id=»list» class=»dropdown-menu» aria-labelledby=»dropdownMenuLink»>
<li class=»dropdown-item»>nombre_completo</li>
<li class=»dropdown-item»>ultima_temporada</li>
<li class=»dropdown-item»>pais_de_nacimiento</li>
<li class=»dropdown-item»>ciudad_de_nacimiento</li>
<li class=»dropdown-item»>pais_de_ciudadania</li>
<li class=»dropdown-item»>fecha_de_nacimiento</li>
<li class=»dropdown-item»>sub_posicón</li>
<li class=»dropdown-item»>posición</li>
<li class=»dropdown-item»>pie</li>
<li class=»dropdown-item»>altura_en_centimetros</li>
<li class=»dropdown-item»>fecha_de_vencimiento_del_contrato</li>
<li class=»dropdown-item»>nombre_del_agente</li>
<li class=»dropdown-item»>nombre_del_club_actual</li>
<li class=»dropdown-item»>valor_de_mercado_en_euros</li>
<li class=»dropdown-item»>valor_de_mercado_más_alto_en_euros</li>
</ul>
<input type=’text’ class=’form-control’ id=»where_name» name=’where_name’ placeholder=’texto to search’ value=»nombre_completo» readonly>
</div>
<input type=’text’ class=’form-control ‘ name=’where_value’ id=’where_value’ size=80 title=’Se necesita un nombre’ placeholder=’Escribe el texto del campo de búsqeda’ required >
<input type=’submit’ name=»submit» id=»submit» value=’Buscar’ class=’btn btn-outline-danger mi_boton’ ></input>
</form>
<!——————————————–>
<!—-Fin deFormaulario de configuración——>
<!———————————————>
<hr>
<!–*****************************
– paginación
******************************–>
<?php
$where_name=»»;
$where_value=»»;
if(isset($_GET[‘page’])){
$page = $_GET[‘page’];
}else{
$page = 0;
}
//Si se ha enviado una petición por el formulario
if(isset($_POST[‘submit’])){
$where_name= $_POST[‘where_name’];
$where_value= $_POST[‘where_value’];
}else{
//Si se ha pasado por la URL
if(isset($_GET[‘where_name’])){
$where_name= $_GET[‘where_name’];
$where_value= $_GET[‘where_value’];
}
}
if(isset($_GET[‘order_by’])){
$order_by= $_GET[‘order_by’];
}else{
$order_by= ‘player_id’;
}
pagination($page, $total_registers/10, $where_name, $where_value, $order_by);
echo $page*10 . » de » . $total_registers;
if (count($jugadores)==0) {
die(«, no hay jugadores»);
}
?>
<table class=’table’>
<thead>
<tr>
<th scope=»col»>player_id</th>
<th scope=»col»>Url Image</th>
<th scope=»col»>Url player</th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=nombre»;?>>nombre</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=apellido»;?>>apellido</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=nombre_completo»;?>>nombre_completo</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=ultima_temporada»;?>>ultima_temporada</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=actual_club_id»;?>>actual_club_id</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=codigo_player»;?>>codigo_player</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=pais_de_nacimiento»;?>>pais_de_nacimiento</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=ciudad_de_nacimiento»;?>>ciudad_de_nacimiento</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=pais_de_ciudadania»;?>>pais_de_ciudadania</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=fecha_de_nacimiento»;?>>fecha_de_nacimiento</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=sub_posicón»;?>>sub_posicón</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=posición»;?>>posición</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=pie»;?>>pie</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=altura_en_centimetros»;?>>altura_en_centimetros</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=fecha_de_vencimiento_del_contrato»;?>>fecha_de_vencimiento_del_contrato</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=nombre_del_agente»;?>>nombre_del_agente</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=id_de_competición_nacional_del_club_actual»;?>>id_de_competición_nacional_del_club_actual</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=nombre_del_club_actual»;?>>nombre_del_club_actual</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=valor_de_mercado_en_euros»;?>>valor_de_mercado_en_euros</a></th>
<th scope=»col»><a href=<?php echo «jugadores.php?page={$page}&where_name={$where_name}&where_value={$where_value}&order_by=valor_de_mercado_más_alto_en_euros»;?>>valor_de_mercado_más_alto_en_euros</a></th>
</tr>
</thead>
<!–*****************************
-Fin paginación
******************************–>
<?php
echo «<tbody>»;
foreach ($jugadores as $posicion=>$jugador){
echo «<tr>»;
echo «<td>{$jugador[‘player_id’]}</td>»;
echo «<td><img src='{$jugador[‘url_imagen’]}’></td>»;
echo «<td><a href='{$jugador[‘url_player’]}’ target=’_blanck’>https//www…<a></td>»;
echo «<td>{$jugador[‘nombre’]}</td>»;
echo «<td>{$jugador[‘apellido’]}</td>»;
echo «<td>{$jugador[‘nombre_completo’]}</td>»;
echo «<td>{$jugador[‘ultima_temporada’]}</td>»;
echo «<td>{$jugador[‘actual_club_id’]}</td>»;
echo «<td>{$jugador[‘codigo_player’]}</td>»;
echo «<td>{$jugador[‘pais_de_nacimiento’]}</td>»;
echo «<td>{$jugador[‘ciudad_de_nacimiento’]}</td>»;
echo «<td>{$jugador[‘pais_de_ciudadania’]}</td>»;
echo «<td>{$jugador[‘fecha_de_nacimiento’]}</td>»;
echo «<td>{$jugador[‘sub_posicion’]}</td>»;
echo «<td>{$jugador[‘posicion’]}</td>»;
echo «<td>{$jugador[‘pie’]}</td>»;
echo «<td>{$jugador[‘altura_en_centimetros’]}</td>»;
echo «<td>{$jugador[‘fecha_de_vencimiento_del_contrato’]}</td>»;
echo «<td>{$jugador[‘nombre_del_agente’]}</td>»;
echo «<td>{$jugador[‘id_de_competición_nacional_del_club_actual’]}</td>»;
echo «<td>{$jugador[‘nombre_del_club_actual’]}</td>»;
echo «<td>{$jugador[‘valor_de_mercado_en_euros’]}</td>»;
echo «<td>{$jugador[‘valor_de_mercado_más_alto_en_euros’]}</td>»;
echo «</tr>»;
}
echo «</tbody>»;
echo «</table>»;
include_once(«document-end.php»);
2.7 Controlador
Para terminar de rematar nuestra aplicación web en el index.php en lugar de cargar la vista directamentamete y que esta llame al repositorio vamos a crear una clase llamada BaseController que contedrá un objeto de la clase Vista y el objeto repositrio correspondiente , crearemos la clase de jugadoresController que heredará de BaseController
3 etapa: integrando composer. Creando la carpeta pública para mejorar la seguridad
3.1. Entendiendo composer autoload
Dentro del composer.json tenemos la propiedad «autoload» en ella se especifican las clases («con el atributo «psr-4» le decimos la carpeta donde están nuestras clases) y los archivos que se van a indexar (con el atributo «files»).
Creamos un archivo llamado «composer.json» y dentro le decimos a composer auto-lea nuestra carpeta app que es donde tenemos las clases de los Repositorios, Base de datos, Controladores, etc
{
«name»: «murciadevs/footballdata»,
«description»: «Footballdata»,
«type»: «project»,
«license»: «proprietary»,
«autoload»: {
«files»:[
],
«psr-4»: {
«App\\»: «app/»
}
}
}
Ahora escribimos «composer validate» para validar el composer.json
PS C:\xampp\htdocs\example> composer validate
Al escribir ahora «composer dump-autoload -o» composer creará la carpeta «vendor» llena de archivos, a nostros nos interesan 3.
PS C:\xampp\htdocs\example> composer dump-autoload -o
En el archivo vendor/composer/autoload_files.php composer está leyendo nuestro autoload:
3.2 Modificando el autoload de nuestro index.php
Ahora hacemos referencia a vendor/autoload.php en nuestro index.php
3.3 Poniendo namespaces
A partir de la versión 5.3 PHP nos obliga a trabajar con namespaces, por convención la primera letra empieza en mayúscula, donde los vayamos a usar ponemos «use nombre_de_namespace»
SQLitecient.php
namespace App\Libraries;
use SQLite3;
use Exception;
……
Escribimos «composer validate» y composer dump-autoload -o para refrescar el autoloading de Composer