Miguel Ángel Blanco González

Soy

Sobre mi

Toda mi trayectoria tanto personal como profesional a estado ligada al mundo de la informática y los videojuegos, así creo que mediante el uso y creación de estas herramientas se puede alcanzar un desarrollo real en el mundo actual.

Desarrollador Laravel BackEnd & desarrollador de Unity/UnReal.

Desarrollador BackEnd, en busca de una oportunidad de trabajo donde poder poner el práctica todos los conocimientos aprendidos y adquiridos a lo largo de mi trayectoria académica.

  • F. Nacimiento: 8-1-1988
  • Titulación: Técnico Superior, ASIR
  • Email: infomiguelblangon@gmail.com
  • Sitio web: http://miguel.mikasuki.es/
  • P. Conducir: Si
  • Vehículo: Si
  • Ciudad: C. P. 18600 Motril, Granada
  • Movilidad geografica: Si

Actualmente mi dedicación se centra en la creación de un sistema web donde trato de plasmar todas mis habilidades, haciendo uso del Laravel(PHP), Livewire para la parte BackEnd, el uso de tecnologías asíncronas como Ajax y JQuery y el uso de MySQL.

Habilidades

Me considero autodidacta, ya que me gusta aprender continuamente sobre las nuevas tecnologías que se van desarrollando, haciendo de ellas una de mis pasiones y por ello me gustaría poder desarrollarlas en un entorno laboral.

Laravel 90%
MySQl 80%
Jquery 70%
JavaScript 80%
PHP 90%
HTML 80%
Unity 75%
Blender 40%
UnReal 50%
Sustance painter 25%
c# (Unity) 80%

Resumen

Siempre me ha despertado especial inquietud el mundo de la informática, por ello decidí cursar los estudios conducentes a la titulación de Técnico Superior, ya que gracias a ellos podrías recibir la formación y conocimientos que me llevasen a ser un buen profesional del sector, de este modo continué ampliando mis competencias especializándome en el mundo de los videojuegos, área que me apasiona.

Educación

Curso de desarrollo de videojuegos multiplataforma

2018 - 2019

Arcan Studios

Curso multidisciplinar. 530 horas presenciales y 300 en casa. Modulos: Modelado 3d. Animación 3d. Diseño de videojuegos. Dibujo y arte conceptual. Tratamiento de imágenes. Dibujo vectorial. Texturización. Motor de juego. Fundamentos de programación. Programación y scripting. Sonido Fx. Producción Musical. Gestión Empresarial. Proyectos. Integrados.

Administración de sistemas informáticos en red

2011 - 2014

I.E.S Fco. Javier de Burgos

Ciclo formativo de 2000 horas a desarrollar en 2 cursos. Adquiri los conocimientos necesarios para administrar y gestionar la red de cualquier PYME obteniendo además certificaciones Cisco.

Portfolio

Bajo los principales conocimientos que poseo he sido capaz de desarrollar un conjunto de diferentes aplicaciones que como resultado inmediato han generado un impacto positivo tanto en el medio como en el fin donde se destinaban, de este modo generar estos trabajos me han servido a nivel personal y profesional, ya que he podido aportar nuevos saberes dentro del sector.

  • Todo
  • Web
  • Juegos

Servicios

Dentro de esta área cuento con diferentes capacidades, que me hacen poder conseguir el desarrollo profesional, entre ellas cabe destacar los expuestos a continuación.

Desarrollo web

Creación, edicion y desarrollo web mediante Laravel,MYSQl,Jquery,Livewire.

Reparación y mantenimiento de Equipos informáticos.

Sustitución de componentes, instalación de S.O. Instalación de software empresarial.

Desarrollo de videojuegos en Unity

C#,Blender, sustance painter.

Soporte microinformático y redes.

Análisis y mantenimiento de equipos informáticos así como montaje de redes informáticas y su configuración.

Generación de informes a través de bases de datos

Conectarse con el servidor y generar la consulta para poder obtener el informe

Mantenimiento de servidores Windows Server

Conectarse con el servidor y ver el registro de errores para así poder realizar el correspondiente informe.

Documentacion

A través de la creación de esta web y de otros proyectos me han ido apareciendo una serie de incidencias, las cuales han sido resueltas de forma satisfactoria, gracias a los conocimientos que poseo y a una posterior investigación de la materia centrada en cada caso.

Comados utiles



                    -----------------------------------------------------
php artisan route:list      -> Rutas
-----------------------------------------------------
php artisan route:cache     ->Limpiar las rutas

php artisan cache:clear

php artisan confi:cache     -> configurar la rutas del cache

php artisan route:clear     -> Clear Route Cache

php artisan view:clear      ->  Clear Compiled Views Cache
------------------------------------------------------------- 
---------------Base de datos---------------------------
php artisan migrate  			-> Creacion de arquitectura db 
php artisan migrate:reset               -> Rollback total 
php artisan migrate:refresh --seed  	-> para que haga un refresh y tire las factorias 
--------------Modelo--------------------------------------------------
php artisan make:model Flight -mfsc	-> Generate a model and a migration, factory, seeder, and controller 


                

Como integrar ReCaptcha de Google con el Login de Fortify



                    Yo seguí esta guía (https://gabrielchavez.me/como-integrar-google-recaptcha-en-laravel-8/) 
para poner el ReCaptcha en mi web, pero llego un momento que me decía que agregase "g-recaptcha-response" en la validación. 
Pero claro estamos hablando de Fortify no de un custom validator echo por nosotros, ¿Dónde tiene esto su validador?.
Yo tengo la solución en Laravel 8 está en Vendor/laravel/fortify/src/Http/Requests/LoginRequest.php agregar la linea 
g-recaptcha-response y ya se valida el solito oye.

                

Customizar el login en fortify.



                    
1 cambiar el modelo (Agregando campos o modificándolos) 
2 cambiar las migraciones (Agregando campos o modificándolos)
3 cambiar el archivo blade (Agregando campos o modificándolos)
<----- Lo mas importante----------------------->
3.1 ir al archivo -> fortify.php; ruta-> /config
3.2 Editar el archivo y en la linea 45 o 46 editar 
3.3"username" => "email" -> por lo correspondiente en mi caso es ["username"=>"user_name"] es un sistema de clave y valor como los haching
hay que cambiar el valor de la funcion username() => return config('fortify.emai', 'user_name');  

                

Funciones variables



                    Funciones variables;
Puedes definir una serie de funciones e ir llamándolas mediante strings a fin de cuentas lo que diferencia un string de la llamada de una función es (), puedes llamar a las funciones con un string e ir guardando en una variable que te ayude a llamar a esa función. 
imaginemos que tenemos 3 funciones simples 
BuenasDias(){}
BuenasTardes (){}
BuenasNoches(){}

entonces se  declara una variable y se mete dentro el valor de los nombres de la función seguido de ()
detal modo que quedaría así
$horario="BuenasDias";
$horario();//y lo que haya dentro de esa función se ejecutaría por que se esta llamando como si lo pusieras de forma literal
se puede rizar mas el rizo, tu puedes usar un par de variables para partir el nombre en dos y almacenar los valores de los nombres, concatenarlos para que estos se puedan usar ojo si haces esto necesitas otra variable ya que echo te dara un error
$horario="Dias";
$nombreFuncion="Buenas".$horario;
$nombreFuncion();

                

Funciones propias de php



                    Tienes todas las funciones matemáticas y después tienes rand() que es para aleatorizar entre dos valores.
round() función para el redondeo, le puedes poner un numero y que este se redondee e incluso le puedes poner la precisión 
round(8.9756,2) // esto mostrara el numero y como hemos indicado el numero de decimales redondeara teniendo en cuenta estos
var_dump() para debugear las variables y saber lo que tienen dentro.
después tienes todas la variables con is_float, is_int, etc.. es para saber si es (is_) un tipo de dato concreto.
siguiente seria isset para saber si una variable existe y esta inicializada.
trim() para limpiar espacios para usar cadenas.
unset() para eliminar una variable
empty() comprobar si una variable esta vacía o es null o es falase comprueba el contenido 
strlen() cuenta los caracteres de un string de forma numérica 
strpos() busca un carácter en un string, requiere de dos parámetros el primero es la cadena y el segundo es la búsqueda devuelve la posición.
str_replace() para remplazar una cadena dentro de un string.
strtolower() convertir a minúscula
strupper() convertir a mayúscula


                

Arrays



                    [x]definición de arrays: $nombre_array=array("valores","valor2",valor3);
añadir elementos al array
$array[]="Cosas";
array_push($array,valor);
[x]Elminar elmentos de un array
array_pop($array); //con este método se elimina el ultimo índice del array,
para eliminar un elemento del array es tan simple como usar unset() y pasar el valor completo por ejemplo así unset($array[2]);
eso eliminaría ese elemento dentro del array
[x]Índice
array_rand() devuelve un índice aleatorio de dentro del array esto para un lista de música vendría genial.
array_reverse() invierte el orden del array ojo que inviertas el orden no significa que el array se quede permanentemente de esa forma, tienes que guardarlo para eso o hacer una variable nueva para que conserve la info 
array_search('valor',$array) devuelve el índice del valor a buscar.
count() para saber el numero de elementos dentro del array
sizeof() es como count.
[x] Ordenación
Ordenación con el método sort() se ordena el array alfabéticamente.  
asort() se ordena de forma alfabética inversa.
[x]Para crear una Matriz
se define un array
$array= array(
	"Nombre_Primer_array"=>array("valor","valor2","valor3");
	"Nombre_Segundo_array"=>array("valor","valor2","valor3");
);     
[x]Acceder a los elementos dentro del array de la siguiente manera
$array[0]["Nombre_Primer_array"][indice_elemento]
si esto lo metes en un foreach que es lo apropiado, te saltas el primer [0] porque para algo tienes el manejador interno del foreach y quedaría así 
$array["Nombre_Primer_array"][indice_elemento]

                

Sesiones



                    Es el periodo de tiempo en el cual el usuario esta navegando por varias paginas en el dominio sin necesidad de autenticarse cuando alterna entre una u otra
debe soportar varias cosas 
1 debe de ser invariable hasta que se cierre la sesión o el navegador con invariable quiere decir que no tienes que hacer que el usuario se autentique de nuevo, pero claro esto no es del todo asi, tu puedes programar que el usuario si esta inactivo durante un tiempo x se desloge destruyendo la sesión.
2 Debe ser capaz almacenar información de sesión útil datos básicamente.

Definición formal de sesión: Almacenar y persistir datos del usuario mientras que venga de un sitio web hasta que cierra sesiono o el navegador.
1 iniciar sesión con session_satart(); hay que iniciar sesión en cualquier fichero que se vaya a usar las sesiones.
   $_SESSION['variable de sesion']; se puede usar en cualquier parte de la web
2 para cerrar sesión hay que hacer un session_destroy();


                

Cookies



                    Es un fichero que se almacena en el ordenador del usuario que visita la web, con el fin de recordar datos o rastrear el comportamiento del mismo en la web.
Para crear una cookie.
setcookie("nombre",$valor_que_se_guarda,$caducidad,$ruta,$dominio);// el valor solo puede ser texto, las variables ruta y dominio no se suelen usar.
Para mostrar las cookies se usar $_COOKIE['nombre_cookie'];
Para eliminar una cookie se usa unset(nombre de la cookie) y hay que caducarla eso se hace de esta manera setcookie('nombre','',time()-100);
de esta manera le estamos indicando el nombre de la cookie, le decimos que esta vacía y la caducamos mediante la función time() que da la fecha actual menos 100 para que este fuera de tiempo


                

etiqueta php abreviada



                    si haces <?="algo"?> puedes imprimir ese algo ya sea texto o una variable es muy útil para cuando solo quieres mostrar un poco de texto en un archivo de php con formato formato.

                

If() para vistas



                     En pleno html se puede poner un if de la siguiente manera 
<?php if(): ?>
COSAS QUE VA HACER COMO MOSTRAR O LO QUE SEA QUE HAGA EL IF
<?php endif; ?>
pero como ya digo esto es solo para vistas

                

Búsquedas en String y comprobación de tipo



                    puedes usar la función preg_match("expresion_regular",$cadena) para que busque en la cadena de texto un patrón para hacer las validaciones
por ejemplo si pones "/[a-zA-Z ]+/" esto buscaría si tienes en la cadena caracteres desde la a la z tanto mayus como minúsculas e incluyen los espacios 
si pones "/[1-9]+/" buscaría si en la cadena tienes números ves por donde voy 

puedes usar la función filter_var($var,FILTER_VALIDATE_TIPO) //hay muchos tipos para ver si la variable que contiene es un tipo de dato u otro

                

Ficheros en php



                    //primero tenemos que abrir el archivo y después tendremos que cerrarlo entonces el procedimiento es el siguiente
1 abrimos con la función fopen("nombre_fichero","permisos"); //->permisos van desde lectura con el flag r hasta a+ que seria lectura y escritura
2 leemos el contenido del fichero si hace falta claro pero en este caso lo leemos para mostrarlo por pantalla eso lo hacemos con feof("nombre")
2.1 si el archivo es de mas de una linea usaremos un while para recorrerlo
entonces quedaría así
$archivo=fopen("nombre","a+");
while(!feof($archivo)){
	$contenido= fgets($archivo);
echo $contenido."<br/>;
} 
3//escribimos con fwrite();
fwrite($archivo,"cadena de texto a introducir");
4//cerramos el fichero con fclose
fclose($archivo);
6//Para copiar un fichero de un lugar a otro 
copy('nombre_fichero','ruta_nombre_fichero') or die("Mensaje si falla");
7//para renombrar un fichero
rename('nombre_fichero','nombre_nuevo_fichero');
8// Eliminar ficheros
unlink('nombre_fichero') or die('Mensaje de error');
9// Comprobar si existe un fichero
file_exists("nombre_fichero")
esto se mete en un if y comprueba si el fichero existe devolviendo true o false por lo que viene genial para saber si esta o no el fichero.


                

Manejo de directorios



                    1//Crear directorio
mkdir('nombre_carpeta',0777) or die("Mensaje de error");//0777-> son los permisos
//esto se puede meter en un if y comprobar si existe para que se cree o no, se comprueba con is_dir 
if(!is_dir('nombre_carpeta'))
{
	mkdir('nombre_carpeta',0777) or die("Mensaje de error");
}else{
	echo" Mensaje ";
}   
2//Borrar directorios rmdir('nombre_carpeta') or die("Mensaje por si falla") ;
3//mostrar los archivos dentro del directorio
puedes hacer opendir('nombre_del_directorio') para abrir el mismo directorio y un readdir() para leer el directorio que esta abierto esto se tiene
que hacer forzosamente en un while para mostrar todos los ficheros.
if($gestor=opendir('nombre_directorio')){
while(false !==($archivo=readdir($gestor)))
{
if($archivo!='.' && $archivo!='..'){// eso es por que el archivo muestra el contenido así que como los archivos están vacíos le pones esto y se salta 				    //los puntos
echo $archivo."<br/>";
}
}
} 


                

Subida de archivos al servidor



                    Para subir archivos al servidor se hace con un formulario pero este formulario es un poco especial pues tiene que tener unas 
características especiales
1 tienes que tener un tipo file en el formulario (si no pollas vas a subir)
2 en la etiqueta form tienes que ponerle el atributo enctype="multipart/form-data"
3 tienes que procesar el archivo file después en el action del formulario 
para ello usamos la variable global de php $_FILES['nombre_campo']
 //Es importante a la hora de tratar con archivos meter la variable super global de php $_FILES['nombre_campo'] y usar esa variable para trabajar con los archivos por que si no, esto no funciona bien ya que $_FILES['nombre_campo'] es una matriz lo mas practico es tratarla de esa forma encapsulándola dentro de otra variable y usar los campos que nos hagan falta.
 $archivo=$_FILES['nombre_campo'];
//usos interesante de las imágenes o como tratar las imágenes 
$nombre = $archivo['name'] //nos da el nombre del archivo
$tipo   = $archivo['type'] //nos da el tipo de archivo 
para los tipos de imagenes o de lo que sea se hace de la siguiente manera $tipo =="image/jpeg" ||$tipo =="image/jpg"||$tipo =="image/png"||$tipo =="image/gif" los vas metediendo en el if comprobando que el tipo de campo sea valido no puedes llegar y ponerlo directamente con jpg o jpeg 
INCISO DE IMAGENES 
[x]inciso 
existe la función para mover el archivo de temporales a la carpeta deseada move_uploaded_file($archivo,$destino); así de esta manera solo tenemos que moverlo de un sitio a otro y no nos hace falta crear ningún directorio ni nada 
ejemplo move_uploaded_file($archivo['tmp_name'],'imagenes/'.$nombre);//tmp_name hace referencia al nombre actual que tiene el fichero puesto que aun no ha sido movido de sitio, con la ruta tiene que ir el nombre de la imagen.

Usamos una variable gestor par abrir el directorio que nos interesa con la función opendir(./imagenes);
y lo metemos en un if para comprobar que se abre correctamente
$gestor = opendir(./imagenes);
if($gestor){//creamos la variable de imagenes para recorrer el directorio
	while(($imagen=readdir($gestor))!== false) //esto es muy interesante por que $imagen lee el directorio que hemos metido en gestor hasta que 							//sea falso o siempre que sea verdadero como quieras verlo
	{
		if($imagen!='.'&& $imagen!='..' )// eso es por que el directorio actual y la subida de directorio también los reconoce como elementos 						//del mismo entonces hay que filtrar
		{
			echo"<img scr='imagenes/$imagen' with=200px/>";// con esto mostramos las imágenes		
		}
	}
}


                

Vistas, estructuras de control y bucles



                    Otra característica de las vistas es que se puede usar los dos puntos al principio de una estructura ya sea un bucle o una estructura de control y su cierre en lugar de las llaves pero esto es solo para las vistas pues es una buena praxis
ejemplo
if($gestor): //creamos la variable de imágenes para recorrer el directorio
	while(($imagen=readdir($gestor))!== false): //esto es muy interesante por que $imagen lee el directorio que hemos metido en gestor hasta que 							//sea falso o siempre que sea verdadero como quieras verlo
	
		if($imagen!='.'&& $imagen!='..' ):// eso es por que el directorio actual y la subida de directorio también los reconoce como elementos 						//del mismo entonces hay que filtrar
		
			echo"<img scr='imagenes/$imagen' with=200px/>";// con esto mostramos las imagenes		
		endif;
	endwhile;
endif;

                

Botones submit



                    si hace varios botones submit y le pones un nombre a acada uno despues puedes recoger los datos y procesarlos de distintas maneras por ejemplo hacer una calculadora en php
tu puedes crear los botones submit como he señalado antes y hacer varios if para filtrando por nombre del submit para que los datos se procesen como tu quieres
$n1=$_POST['n1'];//Contamos con que esto es un trozo del ejercicio  
$n2=$_POST['n2'];// faltaría mucho por definir  pero es para que se vea que los names son mas importantes de lo que parece y que tener una buena 		//planificación sobre el código hace que las cosas sean mejores de lo que parece.
if( isset($_POST['restar'])){// isset es para saber si al variable ha sido declarada 
resultado= echo"El resultado es: $n1-$n2"
}
<input type="submit" value="restar" name="restar"/>
<input type="submit" value="multiplicar" name="multiplicar"/>


                

Documentación útil de Bases de datos



                    [x] describe <nombre_tabla> para saber de que tipo de dato son los campos de la tabla
[x] Puedes usar el comando ALTER TABLE nombre y el comando RENAME <nuevo nombre> para renombrar una tabla;
[x] Puedes usar el comando ALTER TABLE nombre y el comando CHANGE <nombre>  <nuevo nombre> <tipo dato(restriccion)>  para renombrar una columna de la tabla ;

Modificar los atributos de una tabla sin modificar el nombre de los campos de esta 
[x] ALTER TABLE nombre tabla MODIFY <nombre campo> NUEVOS VALORES;
[x] ALTER TABLE usuarios MODIFY apellidos char(40) not null;

Añadir nuevas columnas a la tabla 
[x] ALTER TABLE <nombre_tabla> ADD <nombre_campo> <restricciones>;
ejemplo ALTER TABLE usuarios ADD nivel_acceso int(10) null ;
Añadir restricciones constrains
[x] ALTER TABLE usuarios <NOMBRE_TABLA> ADD CONSTRAINT <NOMBRE_CAMPO> uq_email UNIQUE(email);
BORRAR una columna
[x] ALTER TABLE <nombre_tabla> DROP <nombre_campo>;

Una buena practica es al final poner el motor al que esta tabla pertenece CREATE TABLE <nombre_tabla>(<campos> <tipo_campo> <restricciones>)ENGINE=InnoDb;
Con esto conseguimos que se respete la integridad referencial
Tipos de actualizaciones para DELETE Y UPDATE
para estos tipos tienes 3 actualizaciones  SET NULL, CASCADE, DEFAULT, NOT ACTION,RESTRINGE 
básicamente es poner null, hacer una actualización a todos los campos implicados, poner el valor de inicialización del campo, no hacer ninguna acción, restringido que básicamente si el registro se esta usando no se puede tocar   
esto solo se usa en las llaves foráneas o foreigkeys


                

DML básico



                    DML =lenguaje de manipulación de datos es proporcionado por el gestor de base de datos
En este lenguaje los comentarios se hacen con # y lo tienes que poner al principio y al final #
el lenguaje registrado como INSERT INTO, VAULUES  y demás palabras reservadas van en mayúscula.
para insertar unos valores determinados en lugar de toda la tabla se hace de la siguiente manera 
INSERT INTO <nombre_tabla>(<nombre_campos>,<nombre_campos>,<nombre_campos>) VALUES(<valor_de_campos>,<valor_de_campos>,<valor_de_campos>);  
SELECT
Con el select puedes filtrar los registros de la tabla atendiendo a los campos de la misma de tal manera que 
SELECT email,nombre,apellidos FROM usuarios;
SELECT <campos>,<campos>,<campos> FROM usuarios; //sacara todos los registros de la tabla usuarios pero con las columnas seleccionadas.
//OPERADORES 
Puedes meter en una consulta una operación entre dos valores como si fuera un campo mas en la consulta  por ejemplo
SELECT email,(4+7) FROM usuarios;
aquí te mostraría el email de todos los usuarios y la operación para sacar campos calculados esta genial, además se puede poner un alias de la siguiente manera la palabra reservada AS  sirve para indicar que lo que viene a continuación es un alias para que no muestre la operación en la columna y muestre el nombre del alias
SELECT email, (7+7) AS 'Operacion' FROM usuarios;
Puedes hacer todas las operaciones disponibles básicas 
Puedes incluir una clausula order by al final de la consulta para que ordene según el campo que quieras.
SELECT id,email,(7+7) AS 'operacion' FROM usuarios ORDER BY id DESC; //si lo quieres descendente o ASC si lo quieres ascendente
Puedes usar campos calculados para calcular el resultado de la operación entre dos campos que tengamos y mostrarlo 
SELECT id,email,(id+id) AS 'operacion' FROM usuario ;
//Funciones matemáticas 
ABS es el valor absoluto de un numero 
SELECT ABS(-7) AS 'operacion' FROM usuarios;

REDONDEO se puede usar la funcion CEIL(8.35) para que redonde el numero al alza  
SELECT CEIL(8.35)  AS 'operacion' FROM usuarios;

REDONDEO se puede usar la funcion FLOOR(8.35) para que redonde el numero a la baja  
SELECT FLOOR(8.35)  AS 'operacion' FROM usuarios;

Sacar números aleatorios se puede hacer con RAND()
SELECT  RAND() AS 'operacion' FROM usuarios;
Acotación de decimales ROUND(7.91, 1) 
SELECT  ROUND(7.91, 1) AS 'operacion' FROM usuarios; //AQUI SOLO NOS sacaria un 1 decimal, si en lugar de uno le indicásemos 2 nos sacaría los dos decimales.

//Como sacar la raíz cuadrada de un numero SQRT(7.98) 
SELECT  SQRT(7.98) AS 'operacion' FROM usuarios;

//COMO truncar un numero eso se puede hacer con la función TRUNCATE(98.899,2) Y solo nos mostrara dos de los 3 decimales
SELECT  TRUNCATE(7.98,1) AS 'operacion' FROM usuarios; //aqui nos sacara solo 1 decimal de los 2 que tiene truncate no redondea solo elimina.
SELECT  TRUNCATE(7.98,0) AS 'operacion' FROM usuarios; // aquí solo nos sacara el numero entero


                

DML básico parte 2



                    //Funciones de cadena 
Mayúsculas usamos la función UPPER(<NOMBRE_CAMPO>)
SELECT UPPER(nombre) FROM usuarios;

Minúsculas usamos la función LOWER(<NOMBRE_CAMPO>)
SELECT LOWER(nombre) FROM usuarios;


Concatenar usamos la función CONCAT(campo1.' '.campo2) //Con esto concateno varios registros y pongo un espacio entre ellos
SELECT CONCAT(nombre.' '.apellidos) AS 'NombreYApellidos' FROM usuarios;
Se puede anidar una función dentro de otra para que se abra un nuevo mundo de posibilidades 
SELECT UPPER(CONCAT(nombre.' '.apellidos)) AS 'Conversion' FROM usuarios; //con esto lo que hago es que pongo en mayuscula los campos sacados de la bd y concatenados para que sean mas vistosos.

//Tenemos la función LENGTH(<CADENA>) que nos contara el numero de caracteres que tenemos.
SELECT LENGTH(CONCAT(nombre.' '.apellidos)) AS 'Conversion' FROM usuarios; 

//TRIM(<cadena>) la cual nos quita los espacios
SELECT TRIM(CONCAT('   '.nombre.' '.apellidos.'   ')) AS 'Conversion' FROM usuarios; //ESTA función nos quitaría los espacios tanto delante como detrás
 
//funciones con fechas
FECHA ACTUAL CURDATE()
SELECT email, fecha, CURDATE() FROM usuarios;
// días que que hay de diferencia entre fechas DATEDIFF(fecha1, fecha2)
SELECT email, DATEDIFF(fecha, CURDATE()) AS 'Fecha Actual' FROM usuarios;

//saber el nombre del día de una fecha determinada (sábado, domingo, lunes, etc..)
SELECT email, DAYNAME(CURDATE()) AS 'Fecha Actual' FROM usuarios;

//saber el dia de una fecha en concreto DAYOFMONTH(FECHA) igual que las demás en el SELECT como si fuera un campo mas.

//Tenemos el día dentro de la semana que seria DAYOFWEEK(fecha)
//tenemos el día dentro del año DAYOFYEAR(fecha)
//El mes MONTH(fecha) que imprime el mes 
//Para saber solo el año YEAR(fecha) 
y todas las funciones de tiempo y día que esas se pueden buscar 
Para la hora actual CURTIME()
para saber la fecha y la hora del servidor SYSDATE()
Cambiar el formato a una fecha concreta DATEFORMAT(fecha,'%d-%M-%Y') //los porcentajes son obligatorios los demás parámetros son como  quieres sacar la fecha

Se puede usar la función ISNULL para comprobar si alguno de los campos es nulo
SELECT email, ISNULL(apellidos) FROM usuarios;

También se puede usar la función STRCMP(<cadena>,<cadena2>) para comprobar si dos strings son iguales, devuelve 0 si son iguales y  1 si es diferente 
SELECT email, STRCMP('HOLA','HOLA') FROM usuarios;
 

Para saber la versión que estamos usando podemos usar VERSION()
SELECT VERSION() FROM usuarios;

Para saber el usuario que estamos usando es USER()
SELECT USER() FROM usuarios;

podemos usar la clausula DISTINCT USER()
para filtrar por usuarios diferentes y asi que no salga demasiado recargado
SELECT DISTINCT USER() FROM usuarios;


Para saber que base de datos estamos usando es tan fácil como
SELECT DISTINCT DATABASE() FROM usuarios;

enmascarar un valor null
SELECT IFNULL(apellidos, 'El campo esta vacio') FROM usuarios;
de esta manera si hay un registro nulo en lugar de nulo saldrá el mensaje.

OPERADORES DE COMPARACION clausula where
igual           =
distinto        !=
menor		<
mayor		>
menor o igual	<=
mayor o igual	>=
Entre 		between A and B
En 		in
Es nulo		is null
No nulo		is not null
como		like
no es como	not like
//Comodines
Cualquier cantidad de caracteres: %
Un carácter o varios desconocido: _



                

función de año



                    // un ejemplo útil es obtener el nombre y apellidos de todos los registros de 2010
SELECT nombre, apellidos FROM usuarios WHERE YEAR(fecha) = 2010; //usamos la función year para obtener solo el año.


                

Ejemplo con los comodines



                    mostrar el email que lleve una 'a'
SELECT email FROM usuarios WHERE apellidos LIKE '%a%'; //esto lo que hace es buscar un apellido que contenga la a  en cualquier parte de la cadena 
Se puede usar _ para indicar que hay uno o varios caracteres que no sabemos el numero de _ es lo que determina la longitud de búsqueda se usa igual que %

                

Clausula Limit



                    sirve para limitar la cantidad de registros y se usa de la siguiente manera
SELECT * FROM usuarios LIMIT 3; //en lugar 3 puedes poner la cantidad de registros que quieres que se muestren, si tienes 18 pero quieres que se vea uno pones 1, 

Rangos si quieres que LIMIT muestre un rango de valores se puede hacer de la siguiente manera
SELECT * FROM usuarios LIMIT 0,5; //aquí mostrara los 5 primeros registros
si quieres que te muestre de tal registro a tal registro solo tienes que indicarlo.

                

UPDATE



                    [x]sintaxis
UPDATE <nombre_tabla> SET <nombre_campo> = <nuevo_valor>,<nombre_campo1> = <nuevo_valor1> WHERE <condicion_actualizacion>;
Si no le pones un where actualizara todos los registros de la tabla pero eso ya lo sabia;

                

DELETE



                     [x]sintaxis
DELETE FROM <tabla> where <condicion> ;
DELETE FROM usuarios where email='admin@admin.com';//si no ponemos el where se va ha cepillar todos los registros

                

Agrupamiento



                    Puedes agrupar la información que tienes mediante la clausula GROUP BY para que solo salga un registro distinto a tendiendo al campo del agrupamiento
SELECT COUNT(titulo) AS 'Numero de entradas', categoria_id FROM entradas GROUP BY categoria_id;
//de esta manera le digo cuenta el numero de registros en la columna titulo que hay por cada categoria y muestramelos junto con el id de la categoria la que pertenecen.
+++++ Importante++++++
No es correcto usar WHERE cuando usamos un GROUP BY en su lugar tendremos que usar HAVING
Ejemplo 

SELEC COUNT(titulo) AS 'Numero de entradas', categoria_id FROM entradas GROUP BY categoria_id FROM entradas GROUP BY categoria_id HAVING COUNT(titulo)>=4;  

Cuenta el numero de registros de la columna titulo y agrúpalos a tendiendo a la categoría que pertenecen y me muestras los que tienen 4 o mas registros 


                

Funciones



                    AVG        Sacar la media;
COUNT      contar el numero de elementos
MAX	   valor máximo del grupo	
MIN	   valor mínimo del grupo	
SUM	   sumar el contenido del grupo

Como funciona
*	AVG(<nombre_columna>);
SELECT AVG(precio) AS 'Media productos' FROM fruta;
CON ESTO SACAMOS LA MEDIA DE LA COLUMNA 

*	MAX(<nombre_columna>)
SELECT MAX(precio) AS 'Mayor precio' FROM fruta;

*	MIN(<nombre_columna>)
SELECT MAX(precio) AS 'Menor precio' FROM fruta;


*	SUM(<nombre_columna>)
SELECT SUM(precio) AS 'suma precio' FROM fruta; //Esto nos suma todos los registros y nos devuelve un resultado


                

SUBCONSULTAS



                    Son una consulta dentro de otra o consultas anidadas ,primero se opera la consulta de dentro y después se ejecuta la consulta de fuera.
básicamente es una consulta sobre una id que se resuelve para obtener otra id y mostrar los datos seleccionado
Ejemplo:

vamos a mostrar todos los usuarios que tengan registros en la tabla entradas
SELEC * FROM usuarios WHERE id  IN (SELECT usuario_id from entradas); 
//ponemos la subconsulta dentro de los paréntesis , el operador IN es un operador de inclusión se traduce como "en"
// si en lugar de varios resultados devolviera uno solo tendríamos que usar el operador = para que devolviera solo un valor básicamente 
// IN  es lo mismo que = pero para varios resultados 

Ejemplo complejo
	Busca los usuarios que tengan alguna entrada que en su titulo hable de GTA

SELECT nombre, apellidos FROM usuarios WHERE id IN (SELECT usuario_id FROM entradas WHERE titulo LIKE "%GTA%");

Muestra el nombre y apellidos de los registros de la tabla usuarios cuyo id coincida con la llave foránea usuario_id en la tabla entradas cuyo campo titulo contenga la expresión "%GTA%"


Mostrar las categorías con 3 o mas registros en la tabla entradas
SELECT * FROM categorias WHERE id 
	IN(SELECT categoria_id FROM entradas GROUP BY categoria_id HAVING CONUT(categoria)>=3);


                

Multitabla.



                    Consultar varias tablas en una sola consulta.
Básicamente sirven para cambiar llaves foráneas por nombres. tu tienes una tabla con 3 llaves foráneas pues esta feo que en lugar de poner el nombre de los 3 campos ponga id pues con una consulta de estas cambias id por el nombre

Se puede poner un alias a las tablas cuando haces una consulta multitabla en el from de la misma 
ejemplo 
SELECT e.titulo,u.nombre,c.nombre
FROM entradas e,usuario u,categorias c;
//de esta manera nos saldrá un buen chorizo apañado porque no estamos filtrando 

SELECT e.titulo,u.nombre,c.nombre
FROM entradas e,usuario u,categorias c
WHERE e.usuario_id =u.id AND e.categoria_id = c.id; // esto es usar las relaciones entre tablas para que la informacion salga filtrada 
 
// también se puede usar los AS para que todo quede mucho mas claro
SELECT e.titulo,u.nombre AS 'Autor' ,c.nombre AS 'Categoria'
FROM entradas e,usuario u,categorias c
WHERE e.usuario_id =u.id AND e.categoria_id = c.id;
//De esta manera la consulta quedaría mucho mas limpia


                

Optimización Multitabla.



                    Las consultas multitabla son algo un poco pesado, no es que sea una mala practica pero pudiendo usar algo mas liviano pues mejor eso que no lo pesado 
para ello usaremos los joins 
el primer join que se vera son los innerjoin

INNER JOIN: Devuelve registros idénticos para dos campos, de esta manera podemos unir dos tablas.
Cogemos el ejemplo anterior 
sintaxsis de INNER JOIN <Nombre_tabla> ON <llave foranea> = <tabla_referente> 
 

SELECT e.titulo,u.nombre AS 'Autor' ,c.nombre AS 'Categoria'
FROM entradas e,usuario u,categorias c
WHERE e.usuario_id =u.id AND e.categoria_id = c.id;
 
y así quedaría con INNER JOIN

SELECT e.titulo,u.nombre AS 'Autor' ,c.nombre AS 'Categoria'
FROM entradas e,
INNER JOIN usuario u ON e.usuario_id = u.id 
INNER JOIN categorias c ON e.categoria_id = c.id;
//Como se puede apreciar no hay un where puesto que con los INNER JOIN te los evita ya que estas uniendo las tablas con resultados iguales a las claves

Left join
funciona de forma parecida a  inner join, pero la diferencia esta en que es menos estricto a la hora de mostrar registros, 
entonces si nosotros tenemos un par de tablas y usamos left join va ha mostrar todos los registros que haya a la izquierda y  pondra null o 0 en la parte de la derecha, esto que se esta diciendo es en la parte del ON <condicion_izquierda>= <condicion_derecha>


SELECT e.titulo,u.nombre AS 'Autor' 
FROM entradas e,
LEFT JOIN usuario u ON e.usuario_id = u.id; 
//Mostrara todos los registros relacionados entre las tablas con la peculiaridad de que en el lado izquierdo va a mostrar todo de todo.


//RIGTH JOIN  es igual que LEFT pero ahora no será estricto con el lado derecho en el ON de tal manera que sacara todos los registros de ese lado.


                

VISTAS BD



                    Una vista se puede definir como una consulta almacenada en la base de datos. Es una herramienta que se utiliza como los caches cuando sabe que ciertos datos se van ha usar mucho o consultar podemos almacenar una consulta en la bd para que sea mas rápida su ejecución, es similar a una tabla virtual, la peculiaridad es que trabaja sobre datos ya existentes en lugar de almacenar datos.

A efectos prácticos es una consulta que le creas un alias que es como indicarle al motor que esa consulta la trate de una forma especial.
CREATE VIEW entradas_con_nombre AS
SELECT e.titulo,u.nombre AS 'Autor' ,c.nombre AS 'Categoria'
FROM entradas e,
INNER JOIN usuario u ON e.usuario_id = u.id 
INNER JOIN categorias c ON e.categoria_id = c.id;

CREATE VIEW entradas_con_nombre AS
 Con esta instrucción creamos la vista pero ahora hay que consultarla eso se hace con un select normal y corriente.

Por lo que estoy aprendiendo esto se usa aparte de para no tener que hacer una consulta miles de veces, para que las consultas no lleguen a ser demasiado complejas y que de esta manera se reduce una barbaridad la complejidad.

Para consultar una vista es tan simple como hacer 
SELECT * FROM <nombre_vista> WHERE <restricciones>;

SELECT * FROM entradas_con_nombres WHERE Autor='Paco' ; //recordamos que Autor es un alias en el join, para que veas hasta que nivel de simplicidad puede aportar esto.

* Eliminar una vista 
DROP VIEW entradas_con_nombres;


                

Maquetación web conceptos básicos



                    [x]Conceptos básicos 
1 Crear la maquetación de un documento htm, una buena practica es separar el documento en tres o cuatro partes dependiendo de lo que te haga falta
1.1 las partes serán head,body, footer. estas partes se irán incluyendo con includes o requires a poder ser la version one de estos
1.2 es una buena practica poner el nav en el header ya que el body esta pensado para la información.
1.3 Marcar todo con ids es una buena practica por si después tienes que hacer algún retoque de estilos.
1.4 <aside></aside> Etiqueta HTML5 El elemento HTML <aside> representa una sección de una página que consiste en contenido que está indirectamente relacionado con el contenido principal del documento.
En este caso concreto usaremos esta etiqueta de html para meter el login pues esta indirectamente relacionado con el documento princial 
1.5 <article></article> es como un div pero aportan mas información al navegador, entonces cuando tratemos con contenido es mejor usar esta etiqueta que div. ya que es una buena practica usar esto que la otra etiqueta.
1.6 Recordar que solo se puede utilizar un <h1></h1> como titulo y que poner mas de un h1 por web es una mala practica.
1.7 una buena practica es usar la etiqueta seccion y dentro de ella usar la etiqueta container si usas boostrap si no pues dentro usar el contenedor que maneje el css.

[x]Formas de crear Reglas con css 
1 la Mejor practica es crear un fichero de css para incluirlo en el documento principal. Se incluye con la etiqueta link en el head.
2 crear una regla de css es tan simple como hacer <nombre_etiqueta> o <nombre_id> o <nombre_clase>{<Reglas>}
2.1 <nombre_etiqueta> = body{}// aquí definiríamos las reglas del body
2.1 <nombre_id>= #menu{}// definir reglas para un id
2.1 <nombre_clase> = .bloque{}     // definir reglas para una clase
2.2 las propiedades que meteremos dentro de las reglas se nombran de esta manera <propiedad>:<valor>;
2.3 para cargar una fuente externa tenemos que ponerlo al principio  se usa el @font-face{}
	2.3.1 usaremos la propiedad font-family:"nombre_custom";
	2.3.2 src:url(ruta) format('truetype'); //recordar que el formato mas usado de las fuentes es ttf
	2.3.3 font-weight: normal;
	2.3.4 font-style: normal;
2.4 podemos usar el * para afectar a todo el documento.
de esta manera *{} las reglas que creemos dentro afectaran a todos los elementos sin discriminación.
2.5 primero tendremos que resetear los márgenes y los paddings de todo el documento 
*{
margin: 0px; //reseteo de magin
padding: 0px;//reseteo de padding
font-family: sans-serif, Helvetica, Arial; //se define mas de una fuente por si la principal falla que vaya usando las demás 
text-decoration: none; //esto es para que no ponga el subrayado en los enlaces
} 
.celarfix{ //con esta clase de css hacemos que no haya elementos que no floten bien es una clase para limpiar el comportamiento de los elementos.
clear:both;
float:none;
}

podemos definir como afectar a los elementos anidados dentro de otros elementos de esta manera 
primero definimos un identificador #logo{}
y después si ese elemento tiene mas elementos dentro pues se definen reglas de esta manera 
#logo a{ //dentro del id logo tenemos una etiqueta a y definimos sus reglas
 font-family:"fajala",Helvetica;
 font-size:40px;
 letter-spacing:2px;//espaciado entre las letras
 color: #2979CD; //color de las letras
text-shadow: 0px 0px 0px black, 1px 1px 0px black, 2px 2px 0px black; //de esta manera defino la sombra que puede tener las letras y eso que es un enlace. es genial esto
transition: all 500ms;//transición para cuando se dispare algún evento 
} 
//como pensaras se puede definir el comportamiento cuando pasamos por encima el ratón, para ciertos elementos por ejemplo los a tiene la propiedad a:hover
#logo a:hover{ //Como has podido apreciar :hover es una propiedad de los enlaces, cuando pase el ratón por encima de la letras
cursor: pointer;
text-shadow: 0px 0px 0px black, -1px -1px 0px black, -2px -2px 0px black; // de esta manera invierto la sombra para que haga un efecto 
}


body{
	background:url(<ruta>) #F4F4F4; //Le pongo una imagen de fondo y si falla la imagen que use el patrón.
}

                

Cifrar en la bd



                    password_hash($password,PASSWORD_BCRYPT,['cost'=>4] ); 
//variable pass sin cifrar, el tipo de cifrado, la ultima es el numero de pasadas que el algoritmo hara para cifrar la info

Función para comprobar si la contraseña es correcta o no 
password_verify($pass_sin_cifrar,$pass_cifrada); //devuelve true o false 

                

Objetos



                    cada archivo php que contenga una clase, se tiene que llamar como la clase. por que si no la autocarga de clases no va a funcionar.

//Como ya sabemos sobre objetos lo voy a resumir un poco 
//propiedades 
	<modificador de acceso> $nombre_variable; //public, proteccted, private;
//metodos 
igual que las funciones normales de php pero con el modificador de acceso delante
private function nombre(){return $this->prodiedad; }
__construct(){}// este es el constructor, no tiene mucho mas que decir la verdad.

Tipado, se puede obligar a las funciones o métodos a recibir  un tipo de dato concreto por parámetro esto se hace indicando la clase 
 public function(Coche $miCoche){} //lo que hay delante de la variable de $miCoche es la clase de este, si no se le pasa ese objeto se enfada y no funciona. Las clases se escriben con la primera letra en Mayúscula  

//Una cosa interesante es como llamar a una función desde una clase hija a una clase padre
pues con la palabra reservada parent::<nombre_funcion>();
en este caso lo que renta es llamar al constructor del padre para que se inicialicen las variables parent::__construct();
por que si no estas no se inicializan y entonces perdemos potencia

//diferencia entre variables staticas y normales, la diferencia fundamental es que una variable no guarda valores entre instancias mientras que las de tipo static si guardan valores. al llenar la variable static esta mantiene su valor 
// cunado uses un método estático y llames a una propriedad statica en lugar de this-> usa self:: es la variante para referirse a una variable de tipo static.
//para acceder a una propiedad o metodo de tipo static se usa los dos puntos <nombre_de_clase>::<nombre_metodo>
para una variable statica hay que ponerle $ <nombre_de_clase>::$<nombre_variable>

Las constantes se definen con la palabra reservada const <nombre> y una vez se le asigna un valor este no puede ser cambiado
se usa la palabra reservada self:: para referirse a ella en lugar de $this


                

Clases abstractas



                    Las clases abstractas son clases especiales que se usan para herencia, son clases bases que contienen métodos, también pueden contener propiedades y tal
pero si no vas ha instanciar la clase no te sirve de nada que tenga propiedades, entonces lo suyo es definir la clase con métodos.
diferencia entre métodos normales y abstractos los abastos no se definen, no tienen un cuerpo solo el nombre.

Para definir una clase abstracta se usa la palabra reservada abstract, para definir un método abstracto lo mismo se le pone abstract delante del nombre y el modificador de acceso.

entonces una vez que creas la clase abstracta solo te sirve para que la clase de la que extiende cree forzosamente esos métodos si no los crea da un fallo.
para heredar una clase se usa la palabra extends. La ventaja de las clases abstractas es que heredan directamente hacia la clase hija por lo que no hay que llamar a nada es en plan redefinir el método abstracto y tienes la libertad de usar los métodos existentes en la clase padre desde la clase hija con total libertad . 

¿Qué es una interfaz y como funcionan ?
Básicamente es una clase que contiene funciones que obligatoriamente tiene que estar en la clase donde el interfaz se implemente.
se usa la palabra reservada inteface <nombre_clase>{definicion de metodos}, ojo las interfaces solo definen la firma de los metodos no los métodos enteros 
para implementar una clase abstracta en otra clase usamos la palabra reservada implements seguido del nombre_de_clase.
una vez implementada la clase hay que redefinir los métodos de la clase implementada 


                

Traits y sobrecarga



                    [x]Trait es una clase que nos permite definir una serie de métodos para compartir entre diferentes clases que no tienen nada que ver unas con otras pero comparten alguna propiedad en común, entonces si comparte por ejemplo nombre tu puedes crear un trait con un get y set nombre, usar la palabra reservada use <nombre_trait>;


                

Método destructor



                    es un metodo especial como el constructor, solo que cuando la clase ha terminado de hacer sus cosas pues se destruye automáticamente, conviene definir esta clase para optimizacion aunque este vacia y no haga nada, se define de esta manera 
public function __destruct(){}


                

Método mágico __call();



                    este método te permite hacer acciones cuando se invocan métodos que no existen, entonces te puedes evitar los gets 
si no defines los gets y defines esta función y usas brujería de nivel medio como son las funciones de cadenas, puedes quitar la parte del get y obtener el nombre de la variable e incluso usarla, esto es alta brujería no es para novatos si no para gente com un demonio contratado como minimo.

//voy a copiar la forma de llamar a los gets sin definirlos
public function __call($name,$arguments)
{
 //usamos una variable local
$prefix_metodo = substr($name,0,3);//obtiene la 3 primeras letras

//hago un if para buscar que sea get
if($prefix_metodo=='get')
{
$nombre_metodo=substr(strtolower($name),3);//primero le dice que ponga toda la cadena a minuscula y después corta desde la posición 3 hasta el final.
//entonces el rollo es llamarlo con un return de esta manera 
if(!isset($this->$nombre_metodo)){return "No existe el metodo a invocar";}	
return $this->$nombre_metodo; //al llamarlo de esta manera, que es una mezcla entre una variable de clase y una normal si te imprime el valor de la 					//variable de clase pero es por la forma en la que haces la llamada. Entonces claro te sirve para todas las var.
	
}else{return "No existe el método a invocar";}


}



                

Errores



                    try{
 throw new Exception('Errores logica'); //mediante throw new Exception(); lanzamos la excepción, así que habrá que lanzarla cuando la condición de comprobación falle. esto es para meterlo en el if
}cath(Exception $e )
{
//aquí le ponemos directamente que muestre un mensaje de error o cualquier otra cosa.
echo "Ha habido un error: ".$e->getMessage();// con este método mostramos un mensaje de error
}


                

AutoCarga de clases



                    Es bastante fácil, creas una función la cual contiene un require_one '<ruta_de_clases>'.$class.'php';
la variable class es un parámetro de la función
la función completa seria así

function autoCargar_clases($class)
{
require_one '<ruta_de_clases>'.$class.'php';// esta funcion se crea en un fichero aparte del index y desde el index se llama
}
 //Ahora se le pasa la firma de la función a la función que realmente hace la magia.
spl_autoload_register('autoCargar_clases');

                

saber si una clase o método existe



                    saber si una clase existe
Usamos la funcion class_exists('nombre_clase');
si queremos  no muestre warnings le ponemos una arroba delante @class_exists('nombre_clase');
Esta función devuelve true o false;

	Como saber si un método existe 
get_class_methods($nombre_de_la_variable);//Con este método generamos un array con el nombre de los métodos que la clase tiene. Podemos usar array_search() para buscar dentro de un array un string y como los métodos se han generado como un string, pues tenemos un método de búsqueda.  

                

MVC



                    Modelo = Se encarga de la gestión con la base de datos, por ejemplo si definimos una tabla los campos de esta tienen que estar en el modelo forzosamente
Vista = Se encarga de mostrar los datos ya procesados 
Controlador = Es el intermediario entre la vista y el modelo, es el encargado de llamar a las funciones pertinentes para el procesamiento de los datos
Controlador frontal es un fichero que se encarga de cargar un fichero o una acción en función de lo que la web necesite, es el único fichero que se encarga de cargar absolutamente todo.
Por lo que he estado viendo al separar en 3 apartados, la lógica(Modelo), las vistas y el controlador, para poder hacer algo decente es el controlador al que tenemos que redirigir, y este dependiendo de los parámetros que nos lleguen pues hará una cosa u otra, esto en framework como laravel o synfoni que tienen un sistema de rutas no es necesario pues el sistema de rutas si hace una diferenciación entre las distintas partes pues la ruta si redirecciona bien, aunque a fin de cuentas es lo mismo, solo que dependiendo si es una ruta u otra ira a un apartado u otro.
[x]Tipos de Modelos
Entidad= Es un modelo que se basa en uno o varios registros de la base de datos básicamente es un modelo de filas de la bd informacion en bruto
Consulta= Es un modelo que se basa en tener metodos para trabajar con consultas metodos para trabajar con las consultas.


                

Las secciones y redirección de rutas



                    [x]Las secciones de blade pueden heredar esto quiere decir que si tu defines seccion y le metes código si en otro lado le metes mas código, no respetara el código antiguo y machacara, para evitar que machaque debes usar la directiva reservada @parent() y así te heredara el código antiguo

[x]puedes construir una url de dos formas la primera si es una acción del controlador con la palabra reservada action('nombreControlador@accion')
y una segunda opción con el helper rute('nameRuta',[parametrosOpcionales=>valoresOpcionales])

Se puede utilizar el metodo redirect()->rute('<ruta_alias>');			
dentro de una función en el controlador para redireccionar también se puede usar con actions pero se hace de forma diferente
redirect()->action('<accion_del_controlador>');

También se puede usar la redirección normal y corriente indicándole una ruta redirect('<ruta>');

                

Middleware o filtros Laravel



                    Middleware o filtros
Nos permite hacer cierta lógica antes de mostrar cierta pagina, básicamente nos permite comprobar que cosa antes de que ese tío acceda a esa parte del sitio web
Para crear un middleware es tan sencillo como: 
	php artisan make:middleware <NombreCamelCase> 
El middle no es mas que una clase con una funcion handle($request, Closure $next){}
vale primero hacemos la condición necesaria para hacer el filtro recordar que el paramento $request es lo que nosotros le vamos a pasar para que haga comprobaciones.
una vez que hemos hecho esta parte del middleware que seria la parte logia hay que darlo de alta en el archivo kernel, en este archivo hay una sección dedicada a los middleware que son bastantes solo tendremos que darle un nombre e indicar la ruta como se muestra a continuación.
Ejemplo
'<nombre>'=><ruta>, //en la ruta hay que indicar que es una clase con el ::class,


                

Grupo de rutas Laravel



                    Cuando tienes muchos prefijos para un controlador esto es a nivel de rutas ayuda a no tener definidas 20 rutas casi iguales, es como un resource solo que en el resource ya viene prestablecido.   
Route::grupo(['prefix'=>'nombre']],function(){
//después de prefix va un nombre ese nombre se refiere a la url entoces cunado escribas ese nombre y pongas la barra / e indiques el prefijo index, o //cualquier otro metodo, redireccionara donde se le indique en la funcion, ejemplo
// url:localhost/frutas/index
//básicamente es para agrupar por acciones y no tenerlo todo en plan código espagueti por un lado y por otro.
Route::get('index','controlador@accion');
});


                

Contacto

Direccion:

Mateo Aleman, C. P. 18600 Motril, Granada

Número de contacto:

Cargando
El mensaje no se a enviado
Mensaje Enviado correctamente !