<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
		<id>http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jnoguera</id>
		<title>wikiserver - Contribucions de l’usuari [ca]</title>
		<link rel="self" type="application/atom+xml" href="http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jnoguera"/>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php/Especial:Contribucions/Jnoguera"/>
		<updated>2026-05-09T16:18:50Z</updated>
		<subtitle>Contribucions de l’usuari</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=A1-_Acc%C3%A9s_a_BD_amb_PHP_(10h)&amp;diff=16010</id>
		<title>A1- Accés a BD amb PHP (10h)</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=A1-_Acc%C3%A9s_a_BD_amb_PHP_(10h)&amp;diff=16010"/>
				<updated>2021-11-15T17:08:25Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PDO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connexió a BD amb PHP=&lt;br /&gt;
La base de dades a utilitzar serà '''mysql''' que haureu d'instal·la en el servidor Web. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per connectar-nos a BD podem utilitzar tres maneres:&lt;br /&gt;
*mysqli procedural&lt;br /&gt;
*mysqli object-oriented&lt;br /&gt;
*PDO (PHP Data Objects)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mysqli Procedural ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*Establir la connexió*/&lt;br /&gt;
$servername = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$username = &amp;quot;username&amp;quot;;&lt;br /&gt;
$password = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Create connection&lt;br /&gt;
$conn = mysqli_connect($servername, $username, $password);&lt;br /&gt;
&lt;br /&gt;
// Check connection&lt;br /&gt;
if (!$conn) {&lt;br /&gt;
    die(&amp;quot;Connection failed: &amp;quot; . mysqli_connect_error());&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;Connected successfully&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Tancar la connexió*/&lt;br /&gt;
mysqli_close($conn);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mysqli object-oriented ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*Establir la connexió*/&lt;br /&gt;
$servername = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$username = &amp;quot;username&amp;quot;;&lt;br /&gt;
$password = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Create connection&lt;br /&gt;
$conn = new mysqli($servername, $username, $password);&lt;br /&gt;
&lt;br /&gt;
// Check connection&lt;br /&gt;
if ($conn-&amp;gt;connect_error) {&lt;br /&gt;
    die(&amp;quot;Connection failed: &amp;quot; . $conn-&amp;gt;connect_error);&lt;br /&gt;
} &lt;br /&gt;
echo &amp;quot;Connected successfully&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/*Tancar la connexió*/&lt;br /&gt;
$conn-&amp;gt;close();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PDO ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*Establir la connexió*/&lt;br /&gt;
$servername = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
$username = &amp;quot;username&amp;quot;;&lt;br /&gt;
$password = &amp;quot;password&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
    //$conn = new PDO(&amp;quot;mysql:host=$servername&amp;quot;, $username, $password);  //Se conecta sin tener base de datos&lt;br /&gt;
    $conn = new PDO(&amp;quot;mysql:host=$servername;dbname=myDB&amp;quot;, $username, $password);&lt;br /&gt;
    // set the PDO error mode to exception&lt;br /&gt;
    $conn-&amp;gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);&lt;br /&gt;
    echo &amp;quot;Connected successfully&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
catch(PDOException $e)&lt;br /&gt;
    {&lt;br /&gt;
    echo &amp;quot;Connection failed: &amp;quot; . $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Tancar la connexió*/&lt;br /&gt;
$conn = null;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
info-&amp;gt;&lt;br /&gt;
PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION&lt;br /&gt;
https://www.quora.com/What-is-SetAttribute-PDO-ATTR_ERRMODE-PDO-ERRMODE_EXCEPTION-in-PHP&lt;br /&gt;
&lt;br /&gt;
==Haig d'utilitzar MySQLi o PDO ?==&lt;br /&gt;
&lt;br /&gt;
Tant MySQLi i PDO tenen els seus avantatges :&lt;br /&gt;
&lt;br /&gt;
'''PDO''' treballarà en [https://cursos.mejorcodigo.net/article/pdo-vs-mysqli-cuales-son-las-diferencias-37 12 sistemes de bases de dades ] diferents , però '''MySQLi''' només funciona amb bases de dades MySQL . var_dump( PDO::getAvailableDrivers() );&lt;br /&gt;
&lt;br /&gt;
Per tant, si preveus que es possible que canviarà el sistema de base de dades del teu projecte utilitza PDO. Només hauràs de canviar els paràmetres de connexió i algunes consultes. Amb '''MySQLi''', hauràs de tornar a escriure tot el codi - consultes incloses.&lt;br /&gt;
&lt;br /&gt;
Tots dos són orientat a objectes, però '''MySQLi''' també ofereix una API procedimental.&lt;br /&gt;
&lt;br /&gt;
Tots dos recolzen Sentències preparades. Sentències preparades (Prepared Sentences) protegeixen d'injecció SQL , i són molt importants per a la seguretat de les aplicacions web.&lt;br /&gt;
&lt;br /&gt;
== Creació d'una Base de Dades ==&lt;br /&gt;
Veurem les tres maneres que hi ha de creació d'una base de dades:&lt;br /&gt;
&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
// Create database&lt;br /&gt;
$sql = &amp;quot;CREATE DATABASE myDB&amp;quot;;&lt;br /&gt;
if ($conn-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;Database created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error creating database: &amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
// Create database&lt;br /&gt;
$sql = &amp;quot;CREATE DATABASE myDB&amp;quot;;&lt;br /&gt;
if (mysqli_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;Database created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error creating database: &amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
$sql = &amp;quot;CREATE DATABASE myDBPDO&amp;quot;;&lt;br /&gt;
    // use exec() because no results are returned&lt;br /&gt;
    $conn-&amp;gt;exec($sql);&lt;br /&gt;
    echo &amp;quot;Database created successfully&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Creació d'una Taula ==&lt;br /&gt;
La Taula següent es crearà utilitzant els tres metodes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
// sql to create table&lt;br /&gt;
$sql = &amp;quot;CREATE TABLE MyGuests (&lt;br /&gt;
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, &lt;br /&gt;
firstname VARCHAR(30) NOT NULL,&lt;br /&gt;
lastname VARCHAR(30) NOT NULL,&lt;br /&gt;
email VARCHAR(50),&lt;br /&gt;
reg_date TIMESTAMP&lt;br /&gt;
)&amp;quot;;&lt;br /&gt;
$conn = new mysqli($servername, $username, $password, $dbname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
if ($conn-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;Table MyGuests created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error creating table: &amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
if (mysqli_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;Table MyGuests created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error creating table: &amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
    // use exec() because no results are returned&lt;br /&gt;
    $conn-&amp;gt;exec($sql);&lt;br /&gt;
    echo &amp;quot;Table MyGuests created successfully&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un registre a una taula ==&lt;br /&gt;
S'afegirà un registre a una taula ja creada utilitzant els tres mètodes d'accès a BD:&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
$sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('John', 'Doe', 'john@example.com')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if ($conn-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;New record created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error: &amp;quot; . $sql . &amp;quot;&amp;lt;br&amp;gt;&amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
$sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('John', 'Doe', 'john@example.com')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (mysqli_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;New record created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error: &amp;quot; . $sql . &amp;quot;&amp;lt;br&amp;gt;&amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
 $sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
    VALUES ('John', 'Doe', 'john@example.com')&amp;quot;;&lt;br /&gt;
    // use exec() because no results are returned&lt;br /&gt;
    $conn-&amp;gt;exec($sql);&lt;br /&gt;
    echo &amp;quot;New record created successfully&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Afegir multiples registres a una taula ==&lt;br /&gt;
S'afegiran molts registres a una taula ja creada utilitzant els tres mètodes d'accès a BD:&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('John', 'Doe', 'john@example.com');&amp;quot;;&lt;br /&gt;
$sql .= &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('Mary', 'Moe', 'mary@example.com');&amp;quot;;&lt;br /&gt;
$sql .= &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('Julie', 'Dooley', 'julie@example.com')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if ($conn-&amp;gt;multi_query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;New records created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error: &amp;quot; . $sql . &amp;quot;&amp;lt;br&amp;gt;&amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
$sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('John', 'Doe', 'john@example.com');&amp;quot;;&lt;br /&gt;
$sql .= &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('Mary', 'Moe', 'mary@example.com');&amp;quot;;&lt;br /&gt;
$sql .= &amp;quot;INSERT INTO MyGuests (firstname, lastname, email)&lt;br /&gt;
VALUES ('Julie', 'Dooley', 'julie@example.com')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (mysqli_multi_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;New records created successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error: &amp;quot; . $sql . &amp;quot;&amp;lt;br&amp;gt;&amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
// begin the transaction&lt;br /&gt;
    $conn-&amp;gt;beginTransaction();&lt;br /&gt;
    // our SQL statememtns&lt;br /&gt;
    $conn-&amp;gt;exec(&amp;quot;INSERT INTO MyGuests (firstname, lastname, email) &lt;br /&gt;
    VALUES ('John', 'Doe', 'john@example.com')&amp;quot;);&lt;br /&gt;
    $conn-&amp;gt;exec(&amp;quot;INSERT INTO MyGuests (firstname, lastname, email) &lt;br /&gt;
    VALUES ('Mary', 'Moe', 'mary@example.com')&amp;quot;);&lt;br /&gt;
    $conn-&amp;gt;exec(&amp;quot;INSERT INTO MyGuests (firstname, lastname, email) &lt;br /&gt;
    VALUES ('Julie', 'Dooley', 'julie@example.com')&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // commit the transaction&lt;br /&gt;
    $conn-&amp;gt;commit();&lt;br /&gt;
    echo &amp;quot;New records created successfully&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prepared Sentences ==&lt;br /&gt;
Una declaració preparada és una funció que s'utilitza per executar les mateixes (o similars) sentències SQL amb alta eficiència.&lt;br /&gt;
&lt;br /&gt;
#'''Prepare''' : Es crea una plantilla SQL i s'envia a la base de dades. Alguns valors es deixen sense especificar, anomenat paràmetres (amb l'etiqueta &amp;quot;?&amp;quot;) . Exemple : '''INSERT INTO MyGuests VALUES ( ?, ?,? )'''&lt;br /&gt;
#La base de dades '''analitza, compila i optimitza''' les consultes SQL Preparades i emmagatzema el resultat sense executar-ho.&lt;br /&gt;
#'''Executar ''': En un moment posterior, l'aplicació afegeix els paràmetres que falten, i la base de dades executa la instrucció . L'aplicació pot executar la instrucció tantes vegades com es vulgui amb diferents valors.&lt;br /&gt;
&lt;br /&gt;
Les declaracions preparades tenen dos avantatges principals :&lt;br /&gt;
&lt;br /&gt;
#Les declaracions preparades redueixen el temps d'anàlisi per què la preparació de la consulta es realitza només una vegada (encara que la sentència s'executa diverses vegades )&lt;br /&gt;
#Minimitzen l'ample de banda al servidor al enviar només els paràmetres cada vegada, i no tota la consulta.&lt;br /&gt;
#Les declaracions preparades són molt útils contra els atacs d'injeccions SQL, ja que els valors dels paràmetres , que es transmeten posteriorment utilitzant un protocol diferent, no tenen per què ser escapats correctament. &lt;br /&gt;
&lt;br /&gt;
A continuació mostro un exemple amb cada mètode:&lt;br /&gt;
=== Mysqli Object Oriented i Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
// prepare and bind&lt;br /&gt;
$stmt = $conn-&amp;gt;prepare(&amp;quot;INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)&amp;quot;);&lt;br /&gt;
$stmt-&amp;gt;bind_param(&amp;quot;sss&amp;quot;, $firstname, $lastname, $email);&lt;br /&gt;
&lt;br /&gt;
// set parameters and execute&lt;br /&gt;
$firstname = &amp;quot;John&amp;quot;;&lt;br /&gt;
$lastname = &amp;quot;Doe&amp;quot;;&lt;br /&gt;
$email = &amp;quot;john@example.com&amp;quot;;&lt;br /&gt;
$stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$firstname = &amp;quot;Mary&amp;quot;;&lt;br /&gt;
$lastname = &amp;quot;Moe&amp;quot;;&lt;br /&gt;
$email = &amp;quot;mary@example.com&amp;quot;;&lt;br /&gt;
$stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
$firstname = &amp;quot;Julie&amp;quot;;&lt;br /&gt;
$lastname = &amp;quot;Dooley&amp;quot;;&lt;br /&gt;
$email = &amp;quot;julie@example.com&amp;quot;;&lt;br /&gt;
$stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;New records created successfully&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$stmt-&amp;gt;close();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En el SQL, inserim un signe d'interrogació ( '''?''' ) On volem substituir en un enter, cadena, valor doble o blob.&lt;br /&gt;
&lt;br /&gt;
A continuació, fer un cop d'ull a la funció '''bind_param ()''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$stmt- &amp;gt;bind_param ( &amp;quot;sss&amp;quot; , $cognom , $cognom , $email ) ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta funció enllaça les paràmetres a la instrucció SQL i li diu a la base de dades  quins són els paràmetres. L'argument '''sss''' diu els tipus de dades de cada paràmetre. El caràcter '''s'''  diu que el paràmetre és una cadena.&lt;br /&gt;
&lt;br /&gt;
Els tipus de dades poden ser de quatre tipus:&lt;br /&gt;
&lt;br /&gt;
#i - nombre enter&lt;br /&gt;
#d - doble&lt;br /&gt;
#s - cadena&lt;br /&gt;
#b - BLOB&lt;br /&gt;
&lt;br /&gt;
En dir-li a mysql quin tipus de dades que poden esperar, minimitzem el risc d'injeccions SQL.&lt;br /&gt;
&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
// prepare sql and bind parameters&lt;br /&gt;
    $stmt = $conn-&amp;gt;prepare(&amp;quot;INSERT INTO MyGuests (firstname, lastname, email) &lt;br /&gt;
    VALUES (:firstname, :lastname, :email)&amp;quot;);&lt;br /&gt;
    $stmt-&amp;gt;bindParam(':firstname', $firstname);&lt;br /&gt;
    $stmt-&amp;gt;bindParam(':lastname', $lastname);&lt;br /&gt;
    $stmt-&amp;gt;bindParam(':email', $email);&lt;br /&gt;
&lt;br /&gt;
    // insert a row&lt;br /&gt;
    $firstname = &amp;quot;John&amp;quot;;&lt;br /&gt;
    $lastname = &amp;quot;Doe&amp;quot;;&lt;br /&gt;
    $email = &amp;quot;john@example.com&amp;quot;;&lt;br /&gt;
    $stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
    // insert another row&lt;br /&gt;
    $firstname = &amp;quot;Mary&amp;quot;;&lt;br /&gt;
    $lastname = &amp;quot;Moe&amp;quot;;&lt;br /&gt;
    $email = &amp;quot;mary@example.com&amp;quot;;&lt;br /&gt;
    $stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
    // insert another row&lt;br /&gt;
    $firstname = &amp;quot;Julie&amp;quot;;&lt;br /&gt;
    $lastname = &amp;quot;Dooley&amp;quot;;&lt;br /&gt;
    $email = &amp;quot;julie@example.com&amp;quot;;&lt;br /&gt;
    $stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;New records created successfully&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seleccionar dades ==&lt;br /&gt;
A continuació mostro un exemple amb cada mètode:&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;SELECT id, firstname, lastname FROM MyGuests&amp;quot;;&lt;br /&gt;
$result = $conn-&amp;gt;query($sql);&lt;br /&gt;
&lt;br /&gt;
if ($result-&amp;gt;num_rows &amp;gt; 0) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;ID&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
    // output data of each row&lt;br /&gt;
    while($row = $result-&amp;gt;fetch_assoc()) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;.$row[&amp;quot;id&amp;quot;].&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;.$row[&amp;quot;firstname&amp;quot;].&amp;quot; &amp;quot;.$row[&amp;quot;lastname&amp;quot;].&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;0 results&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
$sql = &amp;quot;SELECT id, firstname, lastname FROM MyGuests&amp;quot;;&lt;br /&gt;
$result = mysqli_query($conn, $sql);&lt;br /&gt;
&lt;br /&gt;
if (mysqli_num_rows($result) &amp;gt; 0) {&lt;br /&gt;
    // output data of each row&lt;br /&gt;
    while($row = mysqli_fetch_assoc($result)) {&lt;br /&gt;
        echo &amp;quot;id: &amp;quot; . $row[&amp;quot;id&amp;quot;]. &amp;quot; - Name: &amp;quot; . $row[&amp;quot;firstname&amp;quot;]. &amp;quot; &amp;quot; . $row[&amp;quot;lastname&amp;quot;]. &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;0 results&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($conn-&amp;gt;query('SELECT * FROM table') as $row) {&lt;br /&gt;
    echo $row['field1'].' '.$row['field2']; //etc...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El mètode &amp;lt;code&amp;gt;query()&amp;lt;/code&amp;gt;  retorna un objecte &amp;lt;code&amp;gt;PDOStatement&amp;lt;/code&amp;gt;. Podries recórrer les dades de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$stmt = $conn-&amp;gt;query('SELECT * FROM table');&lt;br /&gt;
&lt;br /&gt;
while($row = $stmt-&amp;gt;fetch(PDO::FETCH_ASSOC)) {&lt;br /&gt;
    echo $row['field1'].' '.$row['field2']; //etc...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$stmt = $conn-&amp;gt;query('SELECT * FROM table');&lt;br /&gt;
$results = $stmt-&amp;gt;fetchAll(PDO::FETCH_ASSOC);&lt;br /&gt;
//use $results&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si queremos hacer una consulta consulta a un id&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$stmt = $conn-&amp;gt;query('SELECT * FROM table where id=2');&lt;br /&gt;
$results = $stmt-&amp;gt;fetch(PDO::FETCH_ASSOC);&lt;br /&gt;
//use $results&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esborrar registres ==&lt;br /&gt;
A continuació mostro un exemple amb cada mètode:&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
// sql to delete a record&lt;br /&gt;
$sql = &amp;quot;DELETE FROM MyGuests WHERE id=3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if ($conn-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;Record deleted successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error deleting record: &amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// sql to delete a record&lt;br /&gt;
$sql = &amp;quot;DELETE FROM MyGuests WHERE id=3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (mysqli_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;Record deleted successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error deleting record: &amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
 // sql to delete a record&lt;br /&gt;
    $sql = &amp;quot;DELETE FROM MyGuests WHERE id=3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // use exec() because no results are returned&lt;br /&gt;
    $conn-&amp;gt;exec($sql);&lt;br /&gt;
    echo &amp;quot;Record deleted successfully&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Actualitzar Dades ==&lt;br /&gt;
A continuació mostro un exemple amb cada mètode:&lt;br /&gt;
=== Mysqli Object Oriented ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
 $sql = &amp;quot;UPDATE MyGuests SET lastname='Doe' WHERE id=2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if ($conn-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
    echo &amp;quot;Record updated successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error updating record: &amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Mysql Procedural ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;UPDATE MyGuests SET lastname='Doe' WHERE id=2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (mysqli_query($conn, $sql)) {&lt;br /&gt;
    echo &amp;quot;Record updated successfully&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;Error updating record: &amp;quot; . mysqli_error($conn);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== PDO ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Es supossa que existeix una connexió */&lt;br /&gt;
&lt;br /&gt;
    $sql = &amp;quot;UPDATE MyGuests SET lastname='Doe' WHERE id=2&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    // Prepare statement&lt;br /&gt;
    $stmt = $conn-&amp;gt;prepare($sql);&lt;br /&gt;
&lt;br /&gt;
    // execute the query&lt;br /&gt;
    $stmt-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
    // echo a message to say the UPDATE succeeded&lt;br /&gt;
    echo $stmt-&amp;gt;rowCount() . &amp;quot; records UPDATED successfully&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//también puede ser esta otra forma&lt;br /&gt;
// $sql = &amp;quot;UPDATE myguests SET lastname='Doe' WHERE id=2&amp;quot;;&lt;br /&gt;
// $conn-&amp;gt;exec($sql);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===  EJEMPLOS Conexiones a BD amb MYSQLI ===&lt;br /&gt;
&lt;br /&gt;
Connexió de PHP amb el MySQL&lt;br /&gt;
L'estructura per accedir a una base de dades és molt semblant al protocol per accedir a&lt;br /&gt;
un fitxer:&lt;br /&gt;
* Obrir la base de dades.&lt;br /&gt;
* Trametre la comanda SQL a la base de dades.&lt;br /&gt;
* Retornar el resultat de la consulta.&lt;br /&gt;
*  Tancar la connexió de la base de dades.&lt;br /&gt;
Presentarem ara algunes de les seqüències utilitzades per atacar una base de dades MySQL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FUNCIONS BÀSIQUES'''&lt;br /&gt;
&lt;br /&gt;
'''mysqli_connect ( $host, $usuari, $contrasenya,$baseDeDades)'''&lt;br /&gt;
Fa una connexió amb el servidor del MySQL.&lt;br /&gt;
Per exemple :&lt;br /&gt;
 $conn = mysqli_connect(&amp;quot;localhost&amp;quot;, &amp;quot;jnoguera&amp;quot;,&amp;quot;jnoguera&amp;quot;,&amp;quot;BD_prueba&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_query ($conn,$sql)'''&lt;br /&gt;
Envia una sentència SQL a la base de dades.&lt;br /&gt;
Per exemple:&lt;br /&gt;
 $sql1 = &amp;quot;select * from usuaris&amp;quot;;&lt;br /&gt;
 $resul = mysqli_query($conn,$sql1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_close ($conn)'''&lt;br /&gt;
Tanca la connexió amb el servidor de BD.&lt;br /&gt;
Per exemple :&lt;br /&gt;
 mysqli_close($conn);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funcions relacionades amb les consultes'''&lt;br /&gt;
&lt;br /&gt;
'''mysqli_fecth_row ( $resul)'''&lt;br /&gt;
S'accedeix a la següent fila activa del resultat de la seqüència SQL generada. Retorna un&lt;br /&gt;
array numèric i mou l’apuntador de dades cap endavant.&lt;br /&gt;
Per exemple :&lt;br /&gt;
 $resul = mysqli_query($conn,$sql1);&lt;br /&gt;
 $arr_resul = mysqli_fetch_row($resul);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_fetch_assoc ($resul)'''&lt;br /&gt;
Com l’anterior però amb un array associatiu&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_fetch_array ($ resul, $tipus)'''&lt;br /&gt;
Retorna el resultat de la consulta realitzada dins un array associatiu, numèric o ambdós&lt;br /&gt;
a l’hora. En $tipus es poden definir tres constants: MYSQL_ASSOC, MYSQL_NUM,&lt;br /&gt;
MYSQL_BOTH (predeterminat).&lt;br /&gt;
Per exemple:&lt;br /&gt;
 $resul = mysqli_query($conn,$sql1);&lt;br /&gt;
 $arr_resul = mysqli_fetch_array($resul);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_num_rows ($resul)'''&lt;br /&gt;
Retorna la quantitat de files o seqüències que ha retornat la consulta SQL.&lt;br /&gt;
Per exemple:&lt;br /&gt;
 $resul = mysqli_query($conn,$sql1);&lt;br /&gt;
 echo mysqli_num_rows ($resul);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_field_count ($resul)'''&lt;br /&gt;
Informa de la quantitat de camps que s'han retornat en el resultat d'una consulta&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ALTRES FUNCIONS ÚTILS'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_affected_rows ($conex)'''&lt;br /&gt;
Retorna la quantitat de registres afectats per l'última sentència SQL d'actualització o&lt;br /&gt;
eliminació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_error ($conex)'''&lt;br /&gt;
Retorna un missatge de text amb l'error produït a l’anterior operació MySql.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_connect_errno( )'''&lt;br /&gt;
Retorna l'últim codi d'error de la última crida a mysqli_connect().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_connect_error()'''&lt;br /&gt;
Retorna l'últim missatge d'error de la última crida a mysqli_connect().&lt;br /&gt;
&lt;br /&gt;
Normalment es fa un codi semblant a:&lt;br /&gt;
 if (mysqli_connect_errno()) {&lt;br /&gt;
  printf(&amp;quot;La connexió ha fallat: %s\n&amp;quot;, mysqli_connect_error());&lt;br /&gt;
  exit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''mysqli_free_result ($resul)'''&lt;br /&gt;
Allibera l'espai on ha emmagatzemat el resutat de la sentència SQL. És convenient&lt;br /&gt;
utilitzar-la quan ja no necessitem els resultats.&lt;br /&gt;
&lt;br /&gt;
EXEMPLE &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
 &amp;lt;head&amp;gt;&lt;br /&gt;
 &amp;lt;title&amp;gt; &amp;lt;?php echo utf8_decode(&amp;quot;EJEMPLO&amp;quot;); ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
 &amp;lt;/head&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
 $conn = mysqli_connect(&amp;quot;localhost&amp;quot;, USUARI, PASS,&amp;quot;basedatos&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 /* Establim la comanda SQL que volem executar */&lt;br /&gt;
 $sql1 = &amp;quot;select * from usuaris&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 /* A $resul ens guardem el resultat de la consulta */&lt;br /&gt;
 if (!$resul = mysqli_query($conn, $sql1)) {&lt;br /&gt;
   echo &amp;quot;No s'ha pogut realitzar la consulta&amp;quot;;&lt;br /&gt;
   echo mysqli_error($conn);&lt;br /&gt;
   exit;&lt;br /&gt;
 }&lt;br /&gt;
 /* Recorrem l'array de resultat per mostrar valors en pantalla. */&lt;br /&gt;
 echo &amp;quot;&amp;lt;h3&amp;gt;&amp;quot;;&lt;br /&gt;
 while ($arr_resul = mysqli_fetch_row($resul)) {&lt;br /&gt;
   foreach ($arr_resul as $valor) {&lt;br /&gt;
     echo $valor . &amp;quot; &amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
 echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;&amp;lt;/h3&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 /* Alliberem l'espai de memòria ocupat pel resultat de la consulta */&lt;br /&gt;
mysqli_free_result($resul);&lt;br /&gt;
&lt;br /&gt;
 /* Tanquem connexió amb el servidor de BD*/&lt;br /&gt;
mysqli_close($conn);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''GESTION INSITUTO'''&lt;br /&gt;
&lt;br /&gt;
Se trata de hacer la gestión de un instituto por tanto, en nuestra base de datos tendremos una tabla en la cual almacenaremos usuario, password, role (introduciremos un usuario de cada). Deberemos poner un formulario de acceso en función del usuario accederá a su página de sesión, deberá mostrar un mensaje  si es alumno, profesor o directora.&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓ'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_gestion_instituto]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici Login ===&lt;br /&gt;
Crea una pàgina on hi hagi 3 opcions:&lt;br /&gt;
*Registrar usuari&lt;br /&gt;
*Esborrar usuari &lt;br /&gt;
*Login d'usuari&lt;br /&gt;
A la pàgina de login d'usuari accedirà a una intranet on pot veure el seu nom i un enllaç per sortir de sessió. &lt;br /&gt;
Totes les dades d'usuari s'emmagatzemen a base de dades.&lt;br /&gt;
&lt;br /&gt;
=== Fer un CRUD ===&lt;br /&gt;
Tenemos una base de datos llamada 'crud' que contiene Nombre, email y datos, se desea crear una web que muestre los datos de esa tabla, los edite, elimine y cree.&lt;br /&gt;
'''solució'''&lt;br /&gt;
::[[sol_crud]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Login ===&lt;br /&gt;
Crea un formulari HTML com el del [[https://proxy proxy]] del institut que utilitzi el mètode GET i un altre que utilitzi el mètode POST. Imprimeix per pantalla el nom d'usuari i la contrasenya codificada en MD5 i en SHA1.&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/97719/encriptar-contrase%c3%b1a-o-datos-md5-sha1&lt;br /&gt;
&lt;br /&gt;
::[[css_login]]&lt;br /&gt;
solució:&lt;br /&gt;
&lt;br /&gt;
::[[sol_login_php]]&lt;br /&gt;
&lt;br /&gt;
=Exercici de Rols =&lt;br /&gt;
Utilitzant com a a base la solució de l'exercici anterior volem crear una aplicació on hi hagi dos ROL, l'usuari Administrador que podrà crear usuaris i esborrar-los i l'usuari Normal que només podrà accedir a la Intranet.&lt;br /&gt;
L'usuari Administrador podrà Crear i Eliminar usuaris una vegada hagi entrat a la Intranet.&lt;br /&gt;
&lt;br /&gt;
=Exercici Carret de compra =&lt;br /&gt;
Es vol que a la intranet de l'exercici anterior afegir la funcionalitat de carret de compra. &lt;br /&gt;
*L'administració pot afegir i treure productes.&lt;br /&gt;
*L'usuari logat pot anar seleccionat productes al carret i, quan l'usuari vulgui, fer la compra de tot el carret.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SINGLETON=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Connection&lt;br /&gt;
{&lt;br /&gt;
    // Contenedor Instancia de la clase&lt;br /&gt;
    private static $instance = NULL;&lt;br /&gt;
    private $con = NULL;&lt;br /&gt;
    // Constructor privado, previene la creación de objetos vía new&lt;br /&gt;
    private function __construct() {&lt;br /&gt;
        $this-&amp;gt;con = mysqli_connect(&amp;quot;localhost&amp;quot;, &amp;quot;jnoguera&amp;quot;,&amp;quot;jnoguera&amp;quot;,&amp;quot;jnoguera_prueba&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Clone no permitido&lt;br /&gt;
    private function __clone() { }&lt;br /&gt;
&lt;br /&gt;
    // Método singleton &lt;br /&gt;
    public static function getInstance()&lt;br /&gt;
    {&lt;br /&gt;
        if (is_null(self::$instance)) {&lt;br /&gt;
            self::$instance = new Connection();&lt;br /&gt;
           &lt;br /&gt;
        }&lt;br /&gt;
      &lt;br /&gt;
        return self::$instance;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    public function insertar($firstname, $lastname, $email, $fecha){&lt;br /&gt;
        $sql = &amp;quot;INSERT INTO MyGuests (firstname, lastname, email, reg_date ) VALUES ('$firstname', '$lastname', '$email','$fecha')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if ($this-&amp;gt;con-&amp;gt;query($sql) === TRUE) {&lt;br /&gt;
                echo &amp;quot;New record created successfully&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                echo &amp;quot;Error: &amp;quot; . $sql . &amp;quot;&amp;lt;br&amp;gt;&amp;quot; . $conn-&amp;gt;error;&lt;br /&gt;
            }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$con= Connection::getInstance();   &lt;br /&gt;
print_r($con);&lt;br /&gt;
//$con-&amp;gt;insertar('julio','noguera','nuevo@mail.com','2019-11-07 18:55:32');&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$con1= Connection::getInstance();  //es la misma instancia&lt;br /&gt;
print_r($con1);&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$con2 = new Connection();&lt;br /&gt;
print_r($con2-&amp;gt;getInstance());  //No crea la instancia&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://blog.michelletorres.mx/patron-singleton-en-php/&lt;br /&gt;
https://evilnapsis.com/2019/03/07/patron-singleton-en-php-caso-practico/&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_Llenguatge_PHP&amp;diff=15990</id>
		<title>NF1 - Llenguatge PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_Llenguatge_PHP&amp;diff=15990"/>
				<updated>2021-11-09T08:51:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Exercici Moodle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducció llenguatges de programació del costat Servidor =&lt;br /&gt;
&lt;br /&gt;
Existeix una multitud de llenguatges concebuts o no per a Internet. Cadascun d'ells explota més a fons certes característiques que ho fan més o menys útils per desenvolupar diferents aplicacions.&lt;br /&gt;
Un '''llenguatge del costat del servidor''' és aquell que '''s'executa en el servidor web, just abans que s'enviï la pàgina''' a través d'Internet al client. Les pàgines que s'executen en el servidor poden realitzar accessos a bases de dades, connexions en xarxa, i altres tasques per crear la pàgina final que veurà el client.&lt;br /&gt;
D'altra banda, els '''llenguatges de costat client''' (entre els quals no només es troba l'HTML sinó també el Java i el Javascript els quals són simplement inclosos en el codi HTML) són aquells que '''poden ser directament executats pel navegador i no necessiten un pretractament'''.&lt;br /&gt;
[[Fitxer:serverside.jpg|center]]&lt;br /&gt;
Els llenguatges de costat servidor més àmpliament utilitzats per al desenvolupament de pàgines dinàmiques són l'ASP, JSP, PERL i PHP.&lt;br /&gt;
== ASP.NET ==&lt;br /&gt;
Llenguatge comercialitzat per Microsoft, i usat per programadors per desenvolupar entre altres funcions, llocs web. ASP.NET és el successor de la tecnologia ASP, va ser llançada al mercat mitjançant una estratègia de mercat denominada .NET.&lt;br /&gt;
Es desenvolupat per resoldre les limitants que brindava el teu antecessor ASP. Per al desenvolupament d'ASP.NET es pot utilitzar C#, VB.NET o J#. Els arxius compten amb l'extensió (aspx). Per al seu funcionament de les pàgines es necessita tenir instal·lat IIS amb el Framework .Net. Microsft Windows 2003 inclou aquest framework, solament es necessitarà instal·lar-ho en versions anteriors.&lt;br /&gt;
El llenguatge ASP consisteix en una sèrie de classes .NET utilitzades per crear aplicacions Web, tant del costat client (Web Form) com del costat servidor (Web Service). La integració de nadiva .NET Framework amb el sistema operatiu Windows Server 2003 fa que la seva execució sigui més estable i ràpida que altres llenguatges de programació.&lt;br /&gt;
&lt;br /&gt;
'''Avantatges:'''&lt;br /&gt;
*Completament orientat a objectes.&lt;br /&gt;
*Controls d'usuari i personalitzats.&lt;br /&gt;
*Divisió entre la capa d'aplicació o disseny i el codi.&lt;br /&gt;
*Facilita el manteniment de grans aplicacions.&lt;br /&gt;
*Increment de velocitat de resposta del servidor.&lt;br /&gt;
*Major velocitat.&lt;br /&gt;
*Major seguretat.&lt;br /&gt;
&lt;br /&gt;
'''Desavantatges: '''&lt;br /&gt;
*Major consum de recursos.&lt;br /&gt;
*Tecnologia propietària.&lt;br /&gt;
*Hostalatge de llocs web costosos.&lt;br /&gt;
&lt;br /&gt;
== JSP: Java Server Pages ==&lt;br /&gt;
És un llenguatge per a la creació de llocs web dinàmics, acrònim de Java Server Pages. Està orientat a desenvolupar pàgines web en Java. JSP és un llenguatge multiplataforma.&lt;br /&gt;
JSP va ser desenvolupat per Sun Microsystems. Comparteix avantatges similars a les d'ASP.NET, desenvolupat per a la creació d'aplicacions web potents. Posseeix un motor de pàgines basat en els servlets de Java. Per al seu funcionament es necessita tenir instal·lat un servidor Tomcat.&lt;br /&gt;
&lt;br /&gt;
'''Característiques'''&lt;br /&gt;
*Codi separat de la lògica del programa.&lt;br /&gt;
*Les pàgines són compilades en la primera petició.&lt;br /&gt;
*Permet separar la part dinàmica de l'estàtica a les pàgines web.&lt;br /&gt;
*Els arxius es troben amb l'extensió (jsp).&lt;br /&gt;
*El codi JSP pot ser incrustat en codi HTML.&lt;br /&gt;
&lt;br /&gt;
'''Avantatges:'''&lt;br /&gt;
*Execució ràpida del servlets.&lt;br /&gt;
*Crear pàgines del costat del servidor.&lt;br /&gt;
*Multiplataforma.&lt;br /&gt;
*Codi ben estructurat.&lt;br /&gt;
*Integritat amb els mòduls de Java.&lt;br /&gt;
*La part dinàmica està escrita en Java.&lt;br /&gt;
== PERL (Practical Extraction and Report Language) ==&lt;br /&gt;
És un llenguatge de programació desenvolupat per Larry Wall (lwall at netlabs.com) inspirat en altres eines d'UNIX com són: sigueu, grep, awk, c-shell, per a l'administració de tasques pròpies de sistemes UNIX. No estableix cap filosofia de programació concreta. No es pot dir que sigui orientat a objectes, modular o estructurat encara que suporta directament tots aquests paradigmes; el seu punt fort són les labors de processament de textos i arxius. Llenguatge de programació basat en scripts portable a gairebé qualsevol plataforma. És molt utilitzat per escriure CGIs. Un dels seus elements més potents són les expressions regulars, que a partir de la seva versió en Perl han estat adoptades per altres llenguatges i plataformes com .NET o Javascript.&lt;br /&gt;
&lt;br /&gt;
'''Avantatges'''&lt;br /&gt;
*Es poden ajuntar diversos programes d'una forma senzilla per aconseguir una meta determinada. Els usuaris de Windows agrairan aquesta propietat ja que normalment emmalalteixen d'un bon llenguatge tipus “script”.&lt;br /&gt;
*És relativament ràpid per a un llenguatge tipus “script”.&lt;br /&gt;
*Està disponible en múltiples plataformes i sistemes operatius (UNIX, Linux i Windows). Un programa que s'escrigui tenint en compte la compatibilitat pot ser escrit en una plataforma i executat en una altra.&lt;br /&gt;
*Hi ha una col·lecció enorme de mòduls que poden ser incorporats a qualsevol “script” de Perl. Estan disponibles en el CPAN (“Comprehensive Perl Arxivi Network”). En particular existeix una extensió per a càlcul numèric denominada PDL.&lt;br /&gt;
*Perl és gratuït. Molt més que això, és “Programari Lliure”. Això vol dir que el codi font està disponible perquè qualsevol el pugui veure o modificar, i el que és més important, sempre ho estarà. Encara que mai pretenguis canviar el codi, és important disposar de la possibilitat de fer-ho, ja que sempre es podrà contractar a una tercera persona perquè ho modifiqui en el cas que hi hagi un error, i hauria de ser possible solucionar-ho.&lt;br /&gt;
*Li atorga al programador molta llibertat perquè faci el programa com vulgui. Tal com diu l'eslògan de Perl “Hi ha més d'una forma de fer-ho”&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
PHP és l'acrònim de Hipertext Preprocesor. És un llenguatge de programació del costat del servidor gratuït i independent de plataforma, ràpid, amb una gran llibreria de funcions i molta documentació. Va ser creat originalment en 1994 per Rasmus Lerdorf, però com PHP està desenvolupat en política de codi obert, al llarg de la seva història ha tingut moltes contribucions d'altres desenvolupadors.&lt;br /&gt;
El client solament rep una pàgina amb el codi HTML resultant de l'execució de la PHP. Com la pàgina resultant conté únicament codi HTML, és compatible amb tots els navegadors.&lt;br /&gt;
&lt;br /&gt;
https://luisjordan.net/node-js/node-js-vs-php-comparaciones-cms-beneficios-y-tiempos-de-respuesta/&lt;br /&gt;
&lt;br /&gt;
'''Avantatges'''&lt;br /&gt;
*Molt fàcil d'aprendre.&lt;br /&gt;
*Es caracteritza per ser un llenguatge molt ràpid.&lt;br /&gt;
*Suporta en certa mesura l'orientació a objecte. Classes i herència.&lt;br /&gt;
*És un llenguatge multiplataforma: Linux, Windows, entre uns altres.&lt;br /&gt;
*Capacitat de connexió amb la majoria dels manejadores de base de dades: MysSQL, PostgreSQL, Oracle, MS SQL Server, entre unes altres.&lt;br /&gt;
*Capacitat d'expandir el seu potencial utilitzant mòduls.&lt;br /&gt;
*Posseeix documentació a la seva pàgina oficial la qual inclou descripció i exemples de cadascuna de les seves funcions.&lt;br /&gt;
*És lliure, per la qual cosa es presenta com una alternativa de fàcil accés per a tots.&lt;br /&gt;
*Inclou gran quantitat de funcions.&lt;br /&gt;
*No requereix definició de tipus de variables ni maneig detallat del baix nivell.&lt;br /&gt;
&lt;br /&gt;
= Preparació de l'entorn =&lt;br /&gt;
== Instal·lació de servidors d'aplicacions Web ==&lt;br /&gt;
Internet s’ha convertit en la principal eina d’intercanvi d’informació a la societat actual. La connexió dels ordinadors a les xarxes locals i aquestes xarxes a d’altres de grans dimensions ha possibilitat la comunicació global d’informació entre els ordinadors arreu del món. Per poder oferir serveis web, els servidors han de tenir instal·lats una sèrie de serveis. El servidor web permet l’enviament de continguts a altres ordinadors a través de la xarxa. Els preprocessadors d’hipertext (com PHP) permeten crear continguts web de forma dinàmica. Els servidors de bases de dades permeten emmagatzemar informació de forma estructurada que es pot fer servir per generar contingut web. Aquests serveis han de ser instal·lats i configurats correctament abans de començar a crear el contingut web dinàmic del nostre web.&lt;br /&gt;
&lt;br /&gt;
Un '''servidor web''' és una peça de programari que respon a les peticions dels navegadors i lliura la pàgina per al navegador a través d’Internet. Quan es crida a una pàgina web per l’adreça –l’URL (uniform resource locator), per exemple, www.infomerce.es/index.html-, la comunicació entre el navegador i el servidor és possible gràcies a tres protocols:&lt;br /&gt;
* TCP(Transmission Control Protocol, protocol de control de transmissió): és el responsable de fer que el missatge arribi a la destinació sense errors.&lt;br /&gt;
* IP(Internet Protocol): és el responsable de fer que el missatge trobi el camí fins al servidor.&lt;br /&gt;
* HTTP(Hypertext Transfer Protocol, protocol de transferència d’hipertext): és el protocol que ha indicat l’usuari a l’hora de demanar el recurs al servidor. La primera part d’un recurs URL correspon al protocol que utilitzaran client i servidor per intercanviar dades.&lt;br /&gt;
== HTTP: comunicació entre servidor i client ==&lt;br /&gt;
Un cop establerta la connexió entra en joc el protocol HTTP: el navegador envia una petició al servidor en què sol·licita el recurs index.html. El servidor processa aquesta petició i retorna la pàgina sol·licitada al navegador, que interpreta les etiquetes HTML i la presenta a l’usuari.&lt;br /&gt;
[[Fitxer:peticiohttp.jpg|center]]&lt;br /&gt;
La informació que el client envia al servidor en la petició és la següent:&lt;br /&gt;
* El mètode HTTP: l’acció que s’ha de fer.&lt;br /&gt;
* El recurs a què s’ha d’accedir (una part de l’URL).&lt;br /&gt;
* La informació que l’usuari envia al servidor.&lt;br /&gt;
La informació que el servidor envia en la resposta té dues parts ben diferenciades: &lt;br /&gt;
* La capçalera: conté el codi que indica si la petició s’ha complert. També conté el tipus de contingut que enviarà al client.&lt;br /&gt;
* El contingut: (text, codi HTML, imatges, etc.) del recurs demanat.&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Preparació M.V. amb Ubuntu i PHP ===&lt;br /&gt;
Es tracta d'importar una M.V. amb Ubuntu Server. Aquesta màquina virtual la utilitzarem al llarg del curs per desenvolupar programes amb el llenguatge PHP. LA M.V. ha de tenir les següents característiques:&lt;br /&gt;
*512 MB de Ram&lt;br /&gt;
*Targeta mode Pont (Has de reinicialitzar la @MAC i esborrar el fitxer: /etc/udev/rules.d/70-persistent-net.rules)&lt;br /&gt;
*Configura la @IP. &lt;br /&gt;
Instal·la el següent programari:&lt;br /&gt;
*openssh-server (per permetre comunicacions remotes)&lt;br /&gt;
*Servidor Web apache2&lt;br /&gt;
*Servidor PHP&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Primer projecte amb NetBeans ===&lt;br /&gt;
Crea un projecte PHP amb NetBeans. Fes que automàticament guardi tots els fitxers a la màquina virtual creada al apartat anterior. Crea una pàgina d'exemple i comprova que funciona.&lt;br /&gt;
La pàgina d'exemple pot ser la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
     	&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;&lt;br /&gt;
          &amp;lt;?php&lt;br /&gt;
            echo &amp;quot;Primera Pàgina amb PHP&amp;quot;; &lt;br /&gt;
          ?&amp;gt;&lt;br /&gt;
        &amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= El Llenguatge PHP =&lt;br /&gt;
== Introducció ==&lt;br /&gt;
'''PHP''' és un llenguatge de programació obert que s’integra directament en pàgines HTML. El seu ús ha esdevingut gairebé imprescindible en les pàgines que han d’utilitzar bases de dades o formularis.&lt;br /&gt;
Rasmus Lerdorf és el creador del llenguatge PHP. El 1995 presenta la primera edició d’aquest llenguatge amb el nom de Personal Home Page tools amb llicència pública GNU. Per crear el PHP, Rasmus utilitza el codi de programació C.&lt;br /&gt;
&lt;br /&gt;
El '''codi PHP''' que escriviu, '''l’haureu d’incrustar dins de codi HTML''', concretament dins les etiquetes \&amp;lt;body\&amp;gt; del document. Mitjançant unes marques l’HTML no interpretarà el codi PHP, el qual, i mitjançant les mateixes marques, s’executarà en el servidor.&lt;br /&gt;
&lt;br /&gt;
El codi PHP s’executa en un servidor i mostra el resultat en un client. Visualitzareu els resultats amb un navegador web.&lt;br /&gt;
&lt;br /&gt;
Quan arrenca el PHP es fa la lectura del fitxer '''php.ini'''. Aquest fitxer conté la configuració del PHP i es crea durant la instal·lació del PHP. És possible que necessiteu fer canvis en el fitxer de configuració, preneu la precaució de fer-ne una còpia de seguretat abans de fer aquestes modificacions.&lt;br /&gt;
Una inspecció visual del fitxer php.ini us servirà per comprendre’n el funcionament. Depenent del valor de les variables que conté aquest fitxer, el comportament del PHP variarà en la vostra màquina. Podeu comprovar que cada variable que forma part del fitxer està àmpliament comentada, amb comentaris que es marquen amb un punt i coma.&lt;br /&gt;
&lt;br /&gt;
== Mostrar Errors ==&lt;br /&gt;
Per mostrar els errors que fem al escriure programes en php s'ha d'especificar als fitxers que els vols veure per pantalla amb les següents sentències:&lt;br /&gt;
&lt;br /&gt;
http://www.anerbarrena.com/mostrar-errores-php-608/&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* * ******************Errores******************* */&lt;br /&gt;
ini_set('display_errors', true);&lt;br /&gt;
error_reporting(E_ALL);&lt;br /&gt;
/* * ********************Usuarios****************** */&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxi ==&lt;br /&gt;
=== Generalitats ===&lt;br /&gt;
La sintaxi d'un llenguatge de programació es defineix com el conjunt de regles que han de seguir-se en escriure el codi font dels programes per considerar-se com a correctes per a aquest llenguatge de programació.&lt;br /&gt;
Les normes bàsiques que defineixen la sintaxi de PHP són les següents:&lt;br /&gt;
*Si voleu que s’interpreti el vostre codi és imprescindible que encabiu el codi escrit en PHP entre dos delimitadors. Aquestes marques són &amp;lt;?php , que la fareu servir per indicar l’inici de codi en llenguatge PHP, i ?&amp;gt; , que utilitzareu per marcar el final del vostre codi PHP.&lt;br /&gt;
*Indicareu el final d’una instrucció amb punt i coma. Cada vegada que es detecti un punt i coma s’interpretarà el codi inserit fins a aquell punt.&lt;br /&gt;
*Els comentaris en PHP els podreu incloure mitjançant:&lt;br /&gt;
** Dues barres (//) o un coixinet (#) si voleu comentar una línia&lt;br /&gt;
** Una barra i un asterisc (/*) per indicar l’inici de comentari, i un asterisc i una barra per indicar el final de comentari si voleu comentar més d’una línia(/*).&lt;br /&gt;
*No es defineix el tipus de les variables: PHP és un llenguatge de programació que no obliga a declarar prèviament el nom de les variables que s’utilitzaran ni el seu tipus (és diu que és un llenguatge sense tipus o no tipat). Ara bé, tot i que existeixen els tipus de dades en PHP aquests no es comproven.&lt;br /&gt;
*No es distingeixen les majúscules i minúscules.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo &amp;quot;Aquí teniu una instrucció.&amp;quot;;&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;i aquí una altra instrucció.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Si voleu comentar una línia ho podeu fer d’aquesta manera...&lt;br /&gt;
#...o bé d’aquesta altra.&lt;br /&gt;
/* Però si necessiteu comentar&lt;br /&gt;
més línies aquesta és la millor&lt;br /&gt;
manera de fer − ho! */&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Variables ===&lt;br /&gt;
Per representar una variable '''caldrà escriure el símbol del dòlar seguit pel nom que vulgueu posar'''. En el moment de donar nom a una variable heu de tenir en compte que es diferencien majúscules i minúscules i que haurà de començar amb una lletra o caràcter de subratllat.&lt;br /&gt;
En PHP, a diferència de molts altres llenguatges, no cal declarar una variable abans d’utilitzar-la. El símbol del dòlar és el que marca que es tracta d’una variable.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$Nom='whovian';&lt;br /&gt;
$Familia='Informàtica';&lt;br /&gt;
$Cicle=&amp;quot;CFGS Desenvolupament d'aplicacions Web&amp;quot;;&lt;br /&gt;
$Modul = &amp;quot;DAW en entorn servidor&amp;quot;;&lt;br /&gt;
$Durada= 165;&lt;br /&gt;
echo &amp;quot;Hola $nom!&amp;lt;br&amp;gt;&lt;br /&gt;
Benvingut als estudis d’$Familia!!!&amp;lt;br&amp;gt;&lt;br /&gt;
Cicle: $Cicle&amp;lt;br&amp;gt;&lt;br /&gt;
Mòdul: $Modul&amp;lt;br&amp;gt;&lt;br /&gt;
Durada: $Durada hores&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com podeu veure, les variables poden adquirir qualsevol dels tipus suportats, i la variable $Durada emmagatzema l’enter 180, mentre que la resta de variables emmagatzemaran cadenes.&lt;br /&gt;
Les variables s’assignen per valor per defecte, però '''si voleu assignar un valor per referència''' ho haureu d’indicar fent servir el símbol''' &amp;amp; '''tot just davant de la variable&lt;br /&gt;
=== Àmbit de les variables ===&lt;br /&gt;
&lt;br /&gt;
Les variables tenen una vida determinada depenent d’on les declareu i com ho feu. És molt important conèixer l’àmbit de les variables per controlar els vostres codis. No comprendre aquesta part pot provocar fallades inesperades en les vostres creacions.&lt;br /&gt;
L’àmbit d’una variable és el context en què és definida.&lt;br /&gt;
&lt;br /&gt;
En l’exemple següent es mostra com es pot declarar una variable nombroses vegades en àmbits diferents:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$nom=’Nyoman’;&lt;br /&gt;
echo ’De moment $nom val ’.$nom.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
function canvi()&lt;br /&gt;
{&lt;br /&gt;
	$nom=’Ketut’;&lt;br /&gt;
	echo ’Però ara $nom val ’.$nom.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
canvi();&lt;br /&gt;
echo ’I de nou $nom torna a tenir el valor de ’.$nom.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operadors ===&lt;br /&gt;
Permetran fer accions dins el codi. Podreu canviar i assignar valors, canviar l’adreça del codi, condicionar l’execució de blocs de codi i, en&lt;br /&gt;
definitiva, dotar de la complexitat necessària els vostres programes per aconseguir un objectiu.&lt;br /&gt;
Els operadors es poden agrupar en tres blocs segons el nombre de valors sobre els quals s’actua.&lt;br /&gt;
* L’operador '''unari''' opera sobre un valor i el que pot fer en aquest valor és negar-lo, incrementar-lo o decrementar-lo, entre altres coses.&lt;br /&gt;
* L’operador '''binari''' opera sobre dos valors i permet sumar-los, restar-los o comparar-los.&lt;br /&gt;
* L’operador '''ternari''' permet escollir entre dues expressions en funció d’una altra.&lt;br /&gt;
&lt;br /&gt;
'''Operadors Aritmètics '''&lt;br /&gt;
Teniu en compte que la divisió retornarà un valor en coma flotant si el resultat de la divisió no és exacte.&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
|-$valor||Negació||Oposat de $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor + $valorB ||Addició||Suma de $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
| $valor - $valorB ||Subtracció||Diferència entre $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
| $valor * $valorB||Multiplicació||Producte de $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
| $valor / $ valorB||Divisió||Quocient de $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
| $valor % $valorB||Mòdul||Resta de $valor dividit per $valorB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Operadors d'assignació '''&lt;br /&gt;
L’operador bàsic d’assignació és l’igual. Amb l’operador igual la variable de l’esquerra rep el valor de l’expressió de la dreta.&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
| $valor = $valorB||Assignació||Assignar el contingut de $valorB a $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor += $valorB||Addició i Assignació||Suma de $valor i $valorB i ho emmagatzemar a $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor -= $valorB ||Subtracció||Diferència entre $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
| $valor.= “text”||Concatenació i Assignació||Concatenar la cadena de la dreta a la de l’esquerra&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Operadors de bit '''&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;amp; $valorB||i||Assignar el contingut de $valorB a $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor I $valorB||o i Assignació||Suma de $valor i $valorB i ho emmagatzemar a $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor ˆ $valorB ||xor||Diferència entre $valor i $valorB&lt;br /&gt;
|-&lt;br /&gt;
|  ̃ $valor||Negació||Concatenar la cadena de la dreta a la de l’esquerra&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;lt;&amp;lt;$valorB ||Desplaçament a l’esquerra||Concatenar la cadena de la dreta a la de l’esquerra&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;gt;&amp;gt;$valorB||Desplaçament a la dreta||Concatenar la cadena de la dreta a la de l’esquerra&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Operadors de comparació '''&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;250 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
| $valor == $valorB||Igual||TRUE si $valor és igual a $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor === $valorB||Idèntic||TRUE si $valor és igual a $valorB i són del mateix tipus.&lt;br /&gt;
|-&lt;br /&gt;
| $valor != $valorB ||Diferent||TRUE si $valor no és igual a $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;lt;&amp;gt; $ valorB||Diferent||TRUE si $valor no és igual a $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor !== $valorB ||No idèntic||TRUE si $valor no és igual a $valorB o no són del mateix tipus&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;lt; $valorB||Més petit que||TRUE si $valor és més petit que $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;gt; $valorB||Més gran que||TRUE si $valor és més gran que $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;lt;= $valorB||Més petit o igual que||TRUE si $valor és més petit o igual que $valorB.&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;gt;= $valorB||Més gran o igual que||TRUE si $valor és més gran o igual que $valorB.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Operadors d’increment i decrement '''&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;250 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
| ++$valor||Preincrement||Incrementa $valor una unitat, i després retorna $valor.&lt;br /&gt;
|-&lt;br /&gt;
| $valor++||Postincrement||Retorna $valor i incrementa $valor una unitat.&lt;br /&gt;
|-&lt;br /&gt;
| –$valor ||Predecrement||Decrementa $valor una unitat i retorna $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor–||Postdecrement||Retorna $valor i decrementa $valor una unitat.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Operadors de lògica '''&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Operador&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Nom&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;250 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Acció&lt;br /&gt;
|-&lt;br /&gt;
| $valor and valorB||i||TRUE si $valor i $valorB són TRUE&lt;br /&gt;
|-&lt;br /&gt;
| $valor or $valorB||o||TRUE si $valor o $valorB són TRUE.&lt;br /&gt;
|-&lt;br /&gt;
| $valor xor $valorB ||xor||TRUE si $valor o $valorB són TRUE, però no tots dos alhora.&lt;br /&gt;
|-&lt;br /&gt;
| !$valor||No||Inverteix el contingut de $valor&lt;br /&gt;
|-&lt;br /&gt;
| $valor &amp;amp;&amp;amp; $valorB ||i||TRUE si $valor i $valorB són TRUE.&lt;br /&gt;
|-&lt;br /&gt;
| $valor II $valorB||o||TRUE si $valor o $valorB són TRUE.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Els Vectors i les Matrius (Arrays) ===&lt;br /&gt;
Les matrius i els vectors són conjunts de dades que poden estar definides en un Guió de PHP. Les matrius poden contenir altres matrius dintre d'ells sense restricció (multidimensionals). &lt;br /&gt;
&lt;br /&gt;
Els vectors es poden crear de dues maneres. La primera consisteix en l'ús de la funció '''array()'''. La segona implica l'ús de claudàtors.&lt;br /&gt;
Exemple de declaracions d'arrays:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$elmeuarray = array($valor1, $valor2);&lt;br /&gt;
//Aquesta declaració genera un array a la variable '$elmeuarray' que te la següent informació:&lt;br /&gt;
$elmeuarray[0] = $valor1;&lt;br /&gt;
$elmeuarray[1] = $valor2;&lt;br /&gt;
&lt;br /&gt;
//També es pot declarar de la següent manera:&lt;br /&gt;
$elmeuarray = array('mes1' =&amp;gt; $valor1, 'mes2' =&amp;gt; $valor2);&lt;br /&gt;
//Aquesta declaració genera un array a la variable '$elmeuarray' que te la següent informació:&lt;br /&gt;
$elmeuarray['mes1'] = $valor1;&lt;br /&gt;
$elmeuarray['mes2'] = $valor2;&lt;br /&gt;
&lt;br /&gt;
//Però tambés es pot declarar directament amb claudàtors:&lt;br /&gt;
$elmeuarray[0] = $valor1;&lt;br /&gt;
//o amb la següent notació&lt;br /&gt;
$elmeuarray['mes1'] = $valor1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemples d'arrays:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$array = array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;Toyota&amp;quot;,&amp;quot;type&amp;quot;=&amp;gt;&amp;quot;Celica&amp;quot;,&amp;quot;colour&amp;quot;=&amp;gt;&amp;quot;black&amp;quot;,&amp;quot;manufactured&amp;quot;=&amp;gt;&amp;quot;1991&amp;quot;);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
$array2 = array(&amp;quot;Toyota&amp;quot;,&amp;quot;Celica&amp;quot;,&amp;quot;black&amp;quot;,&amp;quot;1991&amp;quot;);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
$array3 = array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;Toyota&amp;quot;,&amp;quot;Celica&amp;quot;,&amp;quot;colour&amp;quot;=&amp;gt;&amp;quot;black&amp;quot;,&amp;quot;1991&amp;quot;);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
print_r($array);&lt;br /&gt;
print_r($array2);&lt;br /&gt;
print_r($array3);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
$array['name']=&amp;quot;BMW&amp;quot;;&lt;br /&gt;
$array['type']=&amp;quot;SERIE 1&amp;quot;;&lt;br /&gt;
$array['colour']=&amp;quot;BLANCO&amp;quot;;&lt;br /&gt;
$array['manufactured']=&amp;quot;2035&amp;quot;;&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
$array2[]=&amp;quot;AUDI&amp;quot;;&lt;br /&gt;
$array2[]=&amp;quot;A5&amp;quot;;&lt;br /&gt;
$array2[]=&amp;quot;ROJO&amp;quot;;&lt;br /&gt;
$array2[]=&amp;quot;2038&amp;quot;;&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
$array3['name']=&amp;quot;FERRARI&amp;quot;;&lt;br /&gt;
$array3[]=&amp;quot;SPIDER&amp;quot;;&lt;br /&gt;
$array3['colour']=&amp;quot;VERDE&amp;quot;;&lt;br /&gt;
$array3[]=&amp;quot;2013&amp;quot;;&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
print_r($array);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
print_r($array2);&lt;br /&gt;
print_r(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
print_r($array3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les matrius son vectors multidimensionals. Els elements d'un vector a la seva vegada poden ser un altre vector. Un exemple és el següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$cars = array(&lt;br /&gt;
   &amp;quot;car1&amp;quot; =&amp;gt; array(&amp;quot;make&amp;quot; =&amp;gt; &amp;quot;Toyota&amp;quot;,&amp;quot;colour&amp;quot; =&amp;gt; &amp;quot;Green&amp;quot;,&amp;quot;year&amp;quot; =&amp;gt; 1999,&amp;quot;engine_cc&amp;quot; =&amp;gt; 1998),&lt;br /&gt;
   &amp;quot;car2&amp;quot; =&amp;gt; array(&amp;quot;make&amp;quot; =&amp;gt; &amp;quot;BMW&amp;quot;,&amp;quot;colour&amp;quot; =&amp;gt; &amp;quot;RED&amp;quot;,&amp;quot;year&amp;quot; =&amp;gt; 2005,&amp;quot;engine_cc&amp;quot; =&amp;gt; 2400),&lt;br /&gt;
   &amp;quot;car3&amp;quot; =&amp;gt; array(&amp;quot;make&amp;quot; =&amp;gt; &amp;quot;Renault&amp;quot;,&amp;quot;colour&amp;quot; =&amp;gt; &amp;quot;White&amp;quot;,&amp;quot;year&amp;quot; =&amp;gt; 1993,&amp;quot;engine_cc&amp;quot; =&amp;gt; 1395),&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo $cars['car1']['make'],&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
echo $cars['car3']['engine_cc'];&lt;br /&gt;
&lt;br /&gt;
/* El resultat de l'execució de les intruccions anteriors és:&lt;br /&gt;
Toyota&lt;br /&gt;
1395&lt;br /&gt;
*/&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Més informació sobre arrays [http://php.net/manual/en/language.types.array.php aquí.]&lt;br /&gt;
Existeixen MOLTES funcions per manipular els arrays. Dona una ullada a [http://php.net/manual/en/ref.array.php aquesta pàgina] abans que comencis a implementar funcions que ja existeixen a la llibreria de php.&lt;br /&gt;
&lt;br /&gt;
=== Estructures de control ===&lt;br /&gt;
==== La sentència '''IF''' i l'Operador Ternari ====&lt;br /&gt;
Les estructures condicionals s'utilitzen per controlar quines instruccions s'executen. Els condicionals en PHP estan estructurats de manera similar als trobats en C ++ i Java .&lt;br /&gt;
Exemple d'estructures condicionals:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
//Exemple 1&lt;br /&gt;
$foo = 1;&lt;br /&gt;
$bar = 2;&lt;br /&gt;
if($foo == $bar) {&lt;br /&gt;
    echo &amp;quot;$foo is equal to $bar.&amp;quot;;&lt;br /&gt;
} elseif ($foo &amp;gt; $bar) {&lt;br /&gt;
    echo &amp;quot;$foo is greater than $bar.&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;$foo is less than $bar.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Exemple 2&lt;br /&gt;
$lower = 10;&lt;br /&gt;
$upper = 100;&lt;br /&gt;
$needle = 25;&lt;br /&gt;
if(($needle &amp;gt;= $lower) &amp;amp;&amp;amp; ($needle &amp;lt;= $upper)) {&lt;br /&gt;
    echo &amp;quot;The needle is in the haystack.&amp;quot;;&lt;br /&gt;
} elseif (($needle &amp;lt;= $lower) || ($needle &amp;gt;= $upper)) {&lt;br /&gt;
    echo &amp;quot;The needle is outside of the haystack.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Exemple Operador Ternari&lt;br /&gt;
&lt;br /&gt;
$missatge =  (date('G') &amp;lt; 12) ? 'Buenos días' : 'Buenas tardes';&lt;br /&gt;
&lt;br /&gt;
//equival a la següent estructura:&lt;br /&gt;
if (date('G') &amp;lt; 12) {&lt;br /&gt;
$missatge = 'Buenos días';&lt;br /&gt;
} else {&lt;br /&gt;
$missatge = 'Buenas tardes';&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La sentència '''SWITCH''' ====&lt;br /&gt;
Quan es necessita utilitzar un IF amb molts Else pot resultar que es vegi un codi molt redundant. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($user_command == &amp;quot;n&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
  go_north();&lt;br /&gt;
}&lt;br /&gt;
else if($user_command == &amp;quot;e&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
  go_east();&lt;br /&gt;
}&lt;br /&gt;
else if($user_command == &amp;quot;s&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
  go_south();&lt;br /&gt;
}&lt;br /&gt;
else if($user_command == &amp;quot;w&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
  go_west();&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  do_something_else();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per millorar la llegibilitat del codi utilitzarem l'estructura 'Switch' de la següent manera:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 switch($user_command)&lt;br /&gt;
 {&lt;br /&gt;
   case 'n':&lt;br /&gt;
     go_north();&lt;br /&gt;
     break;&lt;br /&gt;
   case 'e':&lt;br /&gt;
     go_east();&lt;br /&gt;
     break;&lt;br /&gt;
   case 's':&lt;br /&gt;
     go_south();&lt;br /&gt;
     break;&lt;br /&gt;
   case 'w':&lt;br /&gt;
     go_west();&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     do_something_else();&lt;br /&gt;
     break;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un altre exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($firstvariable == 'comparison1' &lt;br /&gt;
         || $firstvariable == 'comparison2')&lt;br /&gt;
 {&lt;br /&gt;
      doSomething();&lt;br /&gt;
      doSomethingElse();&lt;br /&gt;
 }&lt;br /&gt;
 else if ($firstvariable == 'comparison3')&lt;br /&gt;
 {&lt;br /&gt;
      doAThirdThing();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
      launchMissiles();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
//amb l'estructura switch :&lt;br /&gt;
 switch($firstvariable)&lt;br /&gt;
 {&lt;br /&gt;
  case 'comparison1':&lt;br /&gt;
  case 'comparison2':&lt;br /&gt;
      doSomething();&lt;br /&gt;
      doSomethingElse();&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
  case 'comparison3':&lt;br /&gt;
      doAThirdThing();&lt;br /&gt;
      break;&lt;br /&gt;
 &lt;br /&gt;
  default: &lt;br /&gt;
      launchMissiles();&lt;br /&gt;
      break;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La sentència '''WHILE''' ====&lt;br /&gt;
Aquesta sentència s'utilitzarà per repetir una serie d'instruccions tantes vegades com el condicional sigui evaluat a True.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$c = 0;&lt;br /&gt;
while ($c &amp;lt; 5) {&lt;br /&gt;
   echo $c++;&lt;br /&gt;
} ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mira el següent codi i enraona si serà un bucle infinit o no:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$c = 1;&lt;br /&gt;
$myName=&amp;quot;Fred&amp;quot;;&lt;br /&gt;
while ($myName != &amp;quot;Rumplestilskin&amp;quot;) &lt;br /&gt;
{&lt;br /&gt;
   if ($myName==&amp;quot;Fred&amp;quot;) &lt;br /&gt;
   {&lt;br /&gt;
      $myName=&amp;quot;Leslie&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   else &lt;br /&gt;
   {&lt;br /&gt;
      $myName=&amp;quot;Marc&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   $c++;&lt;br /&gt;
 &lt;br /&gt;
   if ($c==3) &lt;br /&gt;
   {&lt;br /&gt;
      break;&lt;br /&gt;
   }&lt;br /&gt;
};&lt;br /&gt;
echo &amp;quot;You lose and I get your baby!\n&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La sentència '''do ... WHILE''' ====&lt;br /&gt;
És semblan al bucle anterior però les intruccions sempre s'execulten almenys 1 vegada. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $c = 6;&lt;br /&gt;
  do {&lt;br /&gt;
    echo 'Hi';&lt;br /&gt;
  } while ($c &amp;lt; 5);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== La sentència '''FOR''' ====&lt;br /&gt;
La sintaxi bàsica d'aquesta sentencia és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 for([initialization]; [condition]; [step])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple d'ús:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 for($i = 0; $i &amp;lt; 5; $i++)&lt;br /&gt;
 {&lt;br /&gt;
  echo($i . &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple d'utilització amb arrays:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $menu = array(&amp;quot;Toast and Jam&amp;quot;, &amp;quot;Bacon and Eggs&amp;quot;, &amp;quot;Homefries&amp;quot;, &amp;quot;Skillet&amp;quot;, &amp;quot;Milk and Cereal&amp;quot;);&lt;br /&gt;
 // note to self: get breakfast after writing this article&lt;br /&gt;
 $count = count($menu);&lt;br /&gt;
 for($i = 0; $i &amp;lt; $count; $i++)&lt;br /&gt;
 {&lt;br /&gt;
  echo($i + 1 . &amp;quot;. &amp;quot; . $menu[$i] . &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== La sentència '''FOREACH''' ====&lt;br /&gt;
Aquesta sentència és molt utilitzada per recòrrer arrays. Com el parell array[key]=value pot ser string en ambdós casos, aquesta estructura ens permet obternir-los:&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach ($array as $someVar) {&lt;br /&gt;
  echo ($someVar . &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//un altre exemple:&lt;br /&gt;
foreach ($array as $key =&amp;gt; $value) {&lt;br /&gt;
  echo ($key.&amp;quot;holds the value &amp;quot;.$value.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== La sentència '''break''' ====&lt;br /&gt;
&lt;br /&gt;
La sentència break provoca la sortida de qualsevol estructura de control, trencant així un bucle. Penseu per exemple un bucle que cerca un element d’un array. Una vegada trobat, és ineficient acabar de recórrer la resta de l’array.&lt;br /&gt;
''Podeu indicar a aquesta sentència quantes estructures de control voleu saltar. ''&lt;br /&gt;
En l’exemple següent el break provoca la sortida de dos blocs de codi:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
while($edat&amp;lt;20)&lt;br /&gt;
{&lt;br /&gt;
	for( ; ; $edat=$edat+1)&lt;br /&gt;
	{&lt;br /&gt;
		if($edat==18)&lt;br /&gt;
		{&lt;br /&gt;
			echo &amp;quot;Ara ja tens $edat anys!&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
			break 2;&lt;br /&gt;
		}&lt;br /&gt;
		echo &amp;quot;Encara ets menor d’edat, ja que tens $edat anys!&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	echo &amp;quot;Aquesta línia no sortirà per pantalla!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;Ja no ets menor d’edat! Tens $edat anys!&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Exercicis ===&lt;br /&gt;
&lt;br /&gt;
===Exercici: tablita ===&lt;br /&gt;
Se desea crear una página web en la cual muestre un título y luego haga una tabla que imprima 10 filas mostrando &amp;quot;estamos en 2DAW&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Exercici: Vector ===&lt;br /&gt;
Queremos crear un vector &amp;quot;ciudades&amp;quot; donde introduciremos una serie  de ciudades, luego deberá mostrar cada una de las ciudades y el número total.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Recòrrer array ====&lt;br /&gt;
Donat el següent array:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$eu = array( &amp;quot;Italy&amp;quot;=&amp;gt;&amp;quot;Rome&amp;quot;, &amp;quot;Luxembourg&amp;quot;=&amp;gt;&amp;quot;Luxembourg&amp;quot;, &amp;quot;Belgium&amp;quot;=&amp;gt; &amp;quot;Brussels&amp;quot;, &lt;br /&gt;
&amp;quot;Denmark&amp;quot;=&amp;gt;&amp;quot;Copenhagen&amp;quot;, &amp;quot;Finland&amp;quot;=&amp;gt;&amp;quot;Helsinki&amp;quot;, &amp;quot;France&amp;quot; =&amp;gt; &amp;quot;Paris&amp;quot;, &amp;quot;Slovakia&amp;quot;=&amp;gt;&amp;quot;Bratislava&amp;quot;, &lt;br /&gt;
&amp;quot;Slovenia&amp;quot;=&amp;gt;&amp;quot;Ljubljana&amp;quot;, &amp;quot;Germany&amp;quot; =&amp;gt; &amp;quot;Berlin&amp;quot;, &amp;quot;Greece&amp;quot; =&amp;gt; &amp;quot;Athens&amp;quot;, &amp;quot;Ireland&amp;quot;=&amp;gt;&amp;quot;Dublin&amp;quot;, &lt;br /&gt;
&amp;quot;Netherlands&amp;quot;=&amp;gt;&amp;quot;Amsterdam&amp;quot;, &amp;quot;Portugal&amp;quot;=&amp;gt;&amp;quot;Lisbon&amp;quot;, &amp;quot;Spain&amp;quot;=&amp;gt;&amp;quot;Madrid&amp;quot;, &amp;quot;Sweden&amp;quot;=&amp;gt;&amp;quot;Stockholm&amp;quot;,&lt;br /&gt;
 &amp;quot;United Kingdom&amp;quot;=&amp;gt;&amp;quot;London&amp;quot;, &amp;quot;Cyprus&amp;quot;=&amp;gt;&amp;quot;Nicosia&amp;quot;, &amp;quot;Lithuania&amp;quot;=&amp;gt;&amp;quot;Vilnius&amp;quot;, &lt;br /&gt;
&amp;quot;Czech Republic&amp;quot;=&amp;gt;&amp;quot;Prague&amp;quot;, &amp;quot;Estonia&amp;quot;=&amp;gt;&amp;quot;Tallin&amp;quot;, &amp;quot;Hungary&amp;quot;=&amp;gt;&amp;quot;Budapest&amp;quot;, &amp;quot;Latvia&amp;quot;=&amp;gt;&amp;quot;Riga&amp;quot;, &lt;br /&gt;
&amp;quot;Malta&amp;quot;=&amp;gt;&amp;quot;Valetta&amp;quot;, &amp;quot;Austria&amp;quot; =&amp;gt; &amp;quot;Vienna&amp;quot;, &amp;quot;Poland&amp;quot;=&amp;gt;&amp;quot;Warsaw&amp;quot;) ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Crea un script amb PHP que mostri un llistat amb el noms de les capitals i els seus corresponents països. El llistat ha de ser semblant a:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
La capital de Netherlands és Amsterdam&lt;br /&gt;
La capital de Greece és Athens&lt;br /&gt;
La capital de Germany és Berlin&lt;br /&gt;
....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:[[solucio_php_recorrer_array]]&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Afegir un element a un array ====&lt;br /&gt;
Escriu un programa que afegeixi un nou element a un array en una posició determinada.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//abans:&lt;br /&gt;
12345&lt;br /&gt;
&lt;br /&gt;
//després d'afegir $ l'array és:&lt;br /&gt;
123$45&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_afegir_element_array_php]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Curta i llarga ====&lt;br /&gt;
Escriu un programa en PHP que retorni la longitud màxima i mínima dels strings que conté un array.&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
array: (&amp;quot;abcd&amp;quot;,&amp;quot;abc&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;hjjj&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;wer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
La longitud més curta és 1 i la més llarga és 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Solució:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
&lt;br /&gt;
/* &lt;br /&gt;
array: (&amp;quot;abcd&amp;quot;,&amp;quot;abc&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;hjjj&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;wer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
La longitud més curta és 1 i la més llarga és 4.&lt;br /&gt;
&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$ar = array(&amp;quot;abcd&amp;quot;,&amp;quot;abc&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;hjjj&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;wer&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$max=0;&lt;br /&gt;
$min = PHP_INT_MAX;&lt;br /&gt;
&lt;br /&gt;
foreach($ar as $valor){&lt;br /&gt;
    if( strlen($valor) &amp;lt; $min){&lt;br /&gt;
        $min = strlen($valor);&lt;br /&gt;
    }&lt;br /&gt;
    if (strlen($valor) &amp;gt; $max){&lt;br /&gt;
        $max = strlen($valor);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;La longitud mes curta es $min i la mes llarga es $max.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Otra solucion:&lt;br /&gt;
&lt;br /&gt;
$my_array = array(&amp;quot;abcd&amp;quot;,&amp;quot;abc&amp;quot;,&amp;quot;de&amp;quot;,&amp;quot;hjjj&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;wer&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$otroarray = array_map('strlen', $my_array);&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;La longitud mes curta es &amp;quot;. min($otroarray) .&amp;quot; i la mes llarga es &amp;quot;. max($otroarray).&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print_r($otroarray);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Dibuixa asteriscs ====&lt;br /&gt;
Dibuixa amb PHP utilitzant asteriscs el següent dibuix:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* &lt;br /&gt;
* * &lt;br /&gt;
* * * &lt;br /&gt;
* * * * &lt;br /&gt;
* * * * * &lt;br /&gt;
* * * * * &lt;br /&gt;
* * * * &lt;br /&gt;
* * * &lt;br /&gt;
* * &lt;br /&gt;
* &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
$n=5;  &lt;br /&gt;
&lt;br /&gt;
for($i=1; $i&amp;lt;=$n; $i++)  &lt;br /&gt;
{  &lt;br /&gt;
  for($j=1; $j&amp;lt;=$i; $j++)  &lt;br /&gt;
  {  &lt;br /&gt;
    echo ' * ';  &lt;br /&gt;
  }  &lt;br /&gt;
  echo '&amp;lt;br&amp;gt;';  &lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
for($i=$n; $i&amp;gt;=1; $i--)  &lt;br /&gt;
{  &lt;br /&gt;
  for($j=1; $j&amp;lt;=$i; $j++)  &lt;br /&gt;
  {  &lt;br /&gt;
    echo ' * ';  &lt;br /&gt;
  }  &lt;br /&gt;
  echo '&amp;lt;br&amp;gt;';  &lt;br /&gt;
}  &lt;br /&gt;
?&amp;gt;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Escacs ====&lt;br /&gt;
Dibuixa una taula d'escacs com la que pots veure a continuació. &lt;br /&gt;
Table width=&amp;quot;270px&amp;quot; i cada cel·la ocupa 30px d'amplada i d'altura.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:escacs.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:solucio_escacs_php]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=== Funcions ===&lt;br /&gt;
&lt;br /&gt;
Les funcions son grup d'instruccions que poden ser cridades en qualsevol moment. Les funcions són útils per re-utilitzar codi de manera sencilla dintre de la nostra aplicació.&lt;br /&gt;
====Funcions definides per l’usuari====&lt;br /&gt;
L’usuari pot definir totes les funcions que necessiti. És imprescindible que el nom donat a la funció no estigui prohibit, és a dir, no es poden fer servir:&lt;br /&gt;
*paraules reservades (per exemple, echo), &lt;br /&gt;
*començar amb un nombre o un caràcter especial&lt;br /&gt;
*repetir el nom d’una funció dins un mateix àmbit. &lt;br /&gt;
Tot i que el PHP '''no farà cap distinció entre majúscules i minúscules''', es recomana utilitzar el nom de la funció idèntic a l’utilitzat en la declaració.&lt;br /&gt;
Les funcions poden rebre paràmetres. El pas de paràmetres d’entrada es fa escrivint entre parèntesis i a continuació del nom de la funció.&lt;br /&gt;
En l’exemple següent podeu veure com es declara la funció missatge i com, posteriorment, es crida passant-hi un paràmetre.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function missatge($argument)&lt;br /&gt;
{&lt;br /&gt;
	echo &amp;quot;$argument&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
missatge(&amp;quot;Aquest és l’argument que es passa en aquest exemple.&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les funcions també podran retornar valors. Per fer-ho caldrà utilitzar la sentència '''return'''.&lt;br /&gt;
En l’exemple següent comprovareu com la funció suma, la qual rep dos paràmetres, retorna el resultat de sumar dos nombres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
function suma ($valor1,$valor2)&lt;br /&gt;
{&lt;br /&gt;
	return($valor1+$valor2);&lt;br /&gt;
}&lt;br /&gt;
echo suma(4,6);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Funcions Internes====&lt;br /&gt;
El llenguatge PHP té funcions definides internament. Aquestes funcions són de gran utilitat per al programador i resulta imprescindible estudiarles i conèixer-ne les més importants.&lt;br /&gt;
&lt;br /&gt;
És possible que diverses funcions no es reconeguin en el vostre entorn de treball del PHP; el motiu d’això és que algunes funcions internes no s’han inclòs en la compilació, la qual cosa ha fet necessària una compilació dels mòduls que les contenen. Amb phpinfo() es poden veure les extensions carregades en la vostra configuració del PHP.&lt;br /&gt;
&lt;br /&gt;
Són funcions internes molt usuals ''echo, fprintf, print, printf i sprintf'', en què queda demostrat que el llenguatge PHP ja té definides funcions específiques que poden ser de gran utilitat per a l’usuari. &lt;br /&gt;
&lt;br /&gt;
Podeu mirar l’ajuda de PHP a la [https://www.php.net/manual/es/funcref.php pàgina oficial].&lt;br /&gt;
Funcions de Strings: [http://php.net/manual/en/ref.strings.php pàgina oficial].&lt;br /&gt;
&lt;br /&gt;
En l’exemple següent es mostra com es pot codificar amb codificació ''md5'' el contingut d’una variable:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$nom = 'Blanca';&lt;br /&gt;
echo(&amp;quot;La codificació md5 de $nom és:&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
echo md5($nom);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercici===&lt;br /&gt;
El código de encriptación md5 y sha están comprometido ya que son fáciles de desencriptar. ¿Qué algoritmo se debería utilizar?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Algoritmes d'ordenació====&lt;br /&gt;
Segons el següent array &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$fruits = array(&amp;quot;lemon&amp;quot;, &amp;quot;orange&amp;quot;, &amp;quot;banana&amp;quot;, &amp;quot;apple&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SORT''' Esta función ordena una matriz. Los elementos se organizarán de menor a mayor cuando se haya completado esta función.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$cars=array(&amp;quot;Volvo&amp;quot;,&amp;quot;BMW&amp;quot;,&amp;quot;Toyota&amp;quot;);&lt;br /&gt;
sort($cars);&lt;br /&gt;
&lt;br /&gt;
BMW&lt;br /&gt;
Toyota&lt;br /&gt;
Volvo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RSORT''' Esta función ordena una matriz en orden inverso (de mayor a menor).&lt;br /&gt;
Nota: Esta función asigna nuevas claves para los elementos en la matriz. Eliminará todas las claves existentes que haya asignado, en lugar de simplemente reordenar las claves.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$cars=array(&amp;quot;Volvo&amp;quot;,&amp;quot;BMW&amp;quot;,&amp;quot;Toyota&amp;quot;);&lt;br /&gt;
rsort($cars);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Volvo&lt;br /&gt;
Toyota&lt;br /&gt;
BMW&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''asort'''()&lt;br /&gt;
Esta función ordena una matriz de modo que los índices de la matriz mantengan su correlación con los elementos de la matriz a los que están asociados. Esto se usa principalmente al ordenar matrices asociativas donde el orden de los elementos reales es significativo.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
array(&amp;quot;Peter&amp;quot;=&amp;gt;&amp;quot;345&amp;quot;,&amp;quot;Ben&amp;quot;=&amp;gt;&amp;quot;3&amp;quot;,&amp;quot;Joe&amp;quot;=&amp;gt;&amp;quot;43&amp;quot;);&lt;br /&gt;
asort($age)&lt;br /&gt;
&lt;br /&gt;
Array ( [Ben] =&amp;gt; 3 [Joe] =&amp;gt; 43 [Peter] =&amp;gt; 345 ) &lt;br /&gt;
Key=Ben, Value=3&lt;br /&gt;
Key=Joe, Value=43&lt;br /&gt;
Key=Peter, Value=345&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''arsort''' ()&lt;br /&gt;
Esta función ordena una matriz de modo que los índices de la matriz mantengan su correlación con los elementos de la matriz a los que están asociados. Esto se usa principalmente al ordenar matrices asociativas donde el orden de los elementos reales es significativo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$age=array(&amp;quot;Peter&amp;quot;=&amp;gt;&amp;quot;35&amp;quot;,&amp;quot;Ben&amp;quot;=&amp;gt;&amp;quot;37&amp;quot;,&amp;quot;Joe&amp;quot;=&amp;gt;&amp;quot;43&amp;quot;);&lt;br /&gt;
arsort($age);&lt;br /&gt;
&lt;br /&gt;
Array ( [Peter] =&amp;gt; 345 [Joe] =&amp;gt; 43 [Ben] =&amp;gt; 3 ) &lt;br /&gt;
Key=Peter, Value=345&lt;br /&gt;
Key=Joe, Value=43&lt;br /&gt;
Key=Ben, Value=3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ksort''' ()&lt;br /&gt;
Ordena una matriz por clave, manteniendo la clave de las correlaciones de datos. Esto es útil principalmente para matrices asociativas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$age=array(&amp;quot;Peter&amp;quot;=&amp;gt;&amp;quot;200&amp;quot;,&amp;quot;Ben&amp;quot;=&amp;gt;&amp;quot;99&amp;quot;,&amp;quot;Joe&amp;quot;=&amp;gt;&amp;quot;43&amp;quot;);&lt;br /&gt;
ksort($age);&lt;br /&gt;
&lt;br /&gt;
Key=Ben, Value=99&lt;br /&gt;
Key=Joe, Value=43&lt;br /&gt;
Key=Peter, Value=200&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''krsort'''()                &lt;br /&gt;
Sorts an array by key in reverse order, maintaining key to data correlations. This is useful mainly for associative arrays.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$age=array(&amp;quot;Peter&amp;quot;=&amp;gt;&amp;quot;35&amp;quot;,&amp;quot;Ben&amp;quot;=&amp;gt;&amp;quot;37&amp;quot;,&amp;quot;Joe&amp;quot;=&amp;gt;&amp;quot;43&amp;quot;);&lt;br /&gt;
krsort($age);&lt;br /&gt;
&lt;br /&gt;
Key=Peter, Value=35&lt;br /&gt;
Key=Joe, Value=43&lt;br /&gt;
Key=Ben, Value=37&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''natsort''' ()&lt;br /&gt;
Esta función implementa un algoritmo de ordenamiento que ordena cadenas alfanuméricas en la forma en que lo haría un ser humano mientras mantiene asociaciones de clave / valor. Esto se describe como un &amp;quot;orden natural&amp;quot;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$array1 = $array2 = array(&amp;quot;img12.png&amp;quot;, &amp;quot;img10.png&amp;quot;, &amp;quot;img2.png&amp;quot;, &amp;quot;img1.png&amp;quot;);&lt;br /&gt;
sort($array1);&lt;br /&gt;
echo &amp;quot;Standard sorting\n&amp;quot;;print_r($array1);&lt;br /&gt;
natsort($array2);&lt;br /&gt;
echo &amp;quot;\nNatural order sorting\n&amp;quot;;print_r($array2);?&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
The above example will output:&lt;br /&gt;
Standard sorting&lt;br /&gt;
Array&lt;br /&gt;
(&lt;br /&gt;
    [0] =&amp;gt; img1.png&lt;br /&gt;
    [1] =&amp;gt; img10.png&lt;br /&gt;
    [2] =&amp;gt; img12.png&lt;br /&gt;
    [3] =&amp;gt; img2.png&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
Natural order sorting&lt;br /&gt;
Array&lt;br /&gt;
(&lt;br /&gt;
    [3] =&amp;gt; img1.png&lt;br /&gt;
    [2] =&amp;gt; img2.png&lt;br /&gt;
    [1] =&amp;gt; img10.png&lt;br /&gt;
    [0] =&amp;gt; img12.png&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercicis ===&lt;br /&gt;
====Exercici: Ordenació ====&lt;br /&gt;
Crea una funció que ordeni un array. &lt;br /&gt;
*Per claus de menor a major i de major a menor&lt;br /&gt;
*Per valors de menor a major i de major a menor&lt;br /&gt;
&lt;br /&gt;
[[:Solucio_ordenacio]]&lt;br /&gt;
&lt;br /&gt;
==== Exercici: Comprova minúscules ====&lt;br /&gt;
Crea una funció que comprovi si tots els caràcters d'un string son minúscules.&lt;br /&gt;
&lt;br /&gt;
Solució:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
function is_str_lowercase($str1)  &lt;br /&gt;
   {  &lt;br /&gt;
    for ($sc = 0; $sc &amp;lt; strlen($str1); $sc++) {  &lt;br /&gt;
          if (ord($str1[$sc]) &amp;gt;= ord('A') &amp;amp;&amp;amp;  ord($str1[$sc]) &amp;lt;= ord('Z')) {    // ord — devuelve el valor ASCII de un caracter&lt;br /&gt;
      return false;  &lt;br /&gt;
         }  &lt;br /&gt;
         }  &lt;br /&gt;
      return true;  &lt;br /&gt;
       }  &lt;br /&gt;
var_dump(is_str_lowercase('abc def ghi'));  &lt;br /&gt;
var_dump(is_str_lowercase('abc dEf ghi'));  &lt;br /&gt;
?&amp;gt;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exercici: Primers====&lt;br /&gt;
Crea una funció que indiqui si un número és primer.&lt;br /&gt;
&lt;br /&gt;
Solució:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
function IsPrime($n)  &lt;br /&gt;
{  &lt;br /&gt;
 for($x=2; $x&amp;lt;$n; $x++)  &lt;br /&gt;
   {  &lt;br /&gt;
      if($n %$x ==0)  &lt;br /&gt;
          {  &lt;br /&gt;
           return 0;  &lt;br /&gt;
          }  &lt;br /&gt;
    }  &lt;br /&gt;
  return 1;  &lt;br /&gt;
   }  &lt;br /&gt;
$a = IsPrime(3);  &lt;br /&gt;
if ($a==0)  &lt;br /&gt;
echo 'No es Primo.....';  &lt;br /&gt;
else  &lt;br /&gt;
echo 'ES primo..';  &lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici- Normalizar ===&lt;br /&gt;
&lt;br /&gt;
Tenemos una base de datos que sólo acepta nombres y apellidos SIN acentos, ni dieresis... por tanto, queremos que cuando escriba el usuario un nombre como &amp;quot;jÚlïÒ&amp;quot; lo normalice a &amp;quot;JULIO&amp;quot;. &lt;br /&gt;
  $originales = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ';&lt;br /&gt;
&lt;br /&gt;
  $modificadas = 'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr';&lt;br /&gt;
&lt;br /&gt;
Es interesante investigar sobre la función strtr&lt;br /&gt;
&lt;br /&gt;
solución:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UTF-8 es una codificación multibyte que puede representar cualquier carácter Unicode.&lt;br /&gt;
ISO 8859-1 es una codificación de un solo byte que puede representar los primeros 256 caracteres Unicode.&lt;br /&gt;
Ambos codifican ASCII exactamente de la misma manera.&lt;br /&gt;
&lt;br /&gt;
utf8_decode -&amp;gt;  Convierte una cadena con los caracteres codificados ISO-8859-1 con UTF-8 &lt;br /&gt;
&lt;br /&gt;
   //función que quita los acentos, dieresis, Ñ....&lt;br /&gt;
    $originales = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ';&lt;br /&gt;
    $modificadas = 'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyRr';&lt;br /&gt;
    $cadena = utf8_decode($cadena);&lt;br /&gt;
    $cadena = strtr($cadena, utf8_decode($originales), $modificadas);&lt;br /&gt;
    $cadena = strtoupper($cadena);&lt;br /&gt;
    return utf8_encode($cadena);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //$cadena = strtr(utf8_decode($cadena), utf8_decode($originales), $modificadas);   //Altra solució&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tipus de Dades en PHP ==&lt;br /&gt;
&lt;br /&gt;
*'''Boolean'''&lt;br /&gt;
És un tipus de dades molt simple que pot representar un valor cert (TRUE) o fals (FALSE). Aquest tipus de dades s’utilitza molt en estructures de control. Si feu conversió de dades és molt important que tingueu en&lt;br /&gt;
compte que es considerarà fals el nombre enter, la cadena 0 o una cadena buida, una matriu buida, un objecte sense variables, el tipus NULL i els objectes SimpleXML que s’hagin creat d’etiquetes buides.&lt;br /&gt;
&lt;br /&gt;
*'''Integer'''&lt;br /&gt;
Aquest tipus representa nombres no fraccionables per sota de la unitat. Poden ser positius i negatius. Aquests nombres enters els podeu representar en notació decimal, hexadecimal o octal. La plataforma sobre la&lt;br /&gt;
qual treballeu determinarà la mida de les variables enteres. El PHP forçarà un canvi de tipus a flotant si es produeix un desbordament, tant si és positiu com negatiu. A continuació, es mostren dos exemples de variables enteres.&lt;br /&gt;
&lt;br /&gt;
*'''float'''&lt;br /&gt;
Aquest tipus fa referència als nombres de coma flotant, i normalment treballa amb una precisió aproximada de catorze dígits decimals. A continuació, es mostra un exemple d’una variable amb coma flotant.&lt;br /&gt;
&lt;br /&gt;
*'''String'''&lt;br /&gt;
Es tracta d’una cadena de caràcters. El llenguatge del PHP no imposa un límit a la mida d’aquestes cadenes; ara bé, no oblideu que el límit el marcarà la memòria del maquinari en què estigui funcionant el PHP. Aquí&lt;br /&gt;
teniu diversos exemples de cadenes.&lt;br /&gt;
&lt;br /&gt;
*'''array'''&lt;br /&gt;
un array és una matriu, d’una dimensió o més, que conté dades que s’associen segons unes claus. És un tipus molt útil, i comprovareu que el seu ús té una gran potència. Per crear una matriu podeu utilitzar la paraula&lt;br /&gt;
reservada ''array()'' o bé acompanyar el nom de la variable amb ''[ ]''.&lt;br /&gt;
&lt;br /&gt;
*'''object'''&lt;br /&gt;
aquest tipus d’objecte està previst en el llenguatge PHP perquè suporta el llenguatge orientat a objectes. Un objecte és un ítem amb unes característiques i funcionalitats marcades per la classe a la qual pertany. Per crear un objecte cal utilitzar la partícula ''new''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//tipus boolean:&lt;br /&gt;
$sortir=FALSE;&lt;br /&gt;
$entrar=TRUE;&lt;br /&gt;
&lt;br /&gt;
//tipus integer:&lt;br /&gt;
$positiu=3451;&lt;br /&gt;
$negatiu= − 4345&lt;br /&gt;
&lt;br /&gt;
//tipus float:&lt;br /&gt;
$amb_coma=34.5;&lt;br /&gt;
&lt;br /&gt;
//tipus string:&lt;br /&gt;
$nom=’Wayan’;&lt;br /&gt;
$salutacio=&amp;quot;Hola $nom!&amp;quot;;&lt;br /&gt;
echo $salutacio.&amp;quot; Benvingut&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//tipus array:&lt;br /&gt;
$grau_cicles=array(&amp;quot;superior&amp;quot;,&amp;quot;mitja&amp;quot;);&lt;br /&gt;
$families[]=&amp;quot;Informàtica&amp;quot;;&lt;br /&gt;
$families[]=&amp;quot;Electrònica&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//tipus objecte:&lt;br /&gt;
class Alumne {&lt;br /&gt;
public function matricular($nom)&lt;br /&gt;
{&lt;br /&gt;
	echo &amp;quot;Ja estàs matriculat $nom&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$alumne1=new Alumne();&lt;br /&gt;
$alumne1−&amp;gt;matricular(’Made’);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creació Classes/ OBJECTES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class Coche&lt;br /&gt;
{&lt;br /&gt;
	static $numruedas = 4;&lt;br /&gt;
	var $color;&lt;br /&gt;
	var $posx;&lt;br /&gt;
	var $posy;&lt;br /&gt;
	var $velocidad;&lt;br /&gt;
	function __construct($color, $posx, $posy)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;color = $color;&lt;br /&gt;
		$this-&amp;gt;posx = $posx;&lt;br /&gt;
		$this-&amp;gt;posy = $posy;&lt;br /&gt;
		$this-&amp;gt;velocidad = 0;&lt;br /&gt;
	}&lt;br /&gt;
	function mover($x, $y)&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;posx = $x;&lt;br /&gt;
		$this-&amp;gt;posy = $y;&lt;br /&gt;
	}&lt;br /&gt;
	function acelerar()&lt;br /&gt;
	{&lt;br /&gt;
		$this-&amp;gt;velocidad = $this-&amp;gt;velocidad + 10;&lt;br /&gt;
		return $this-&amp;gt;velocidad;&lt;br /&gt;
	}&lt;br /&gt;
	function frenar()&lt;br /&gt;
	{&lt;br /&gt;
		if ($this-&amp;gt;velocidad &amp;gt; 10)&lt;br /&gt;
			$this-&amp;gt;velocidad = $this-&amp;gt;velocidad - 10;&lt;br /&gt;
		else&lt;br /&gt;
			$this-&amp;gt;velocidad = 0;&lt;br /&gt;
		return $this-&amp;gt;velocidad;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$car = new Coche(&amp;quot;verde&amp;quot;,10,10);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Les dades especials ===&lt;br /&gt;
*'''resource'''&lt;br /&gt;
La variable que pertany a aquest tipus farà referència a un recurs extern. Determinades funcions faran ús d’aquest recurs. Per exemple, la funció mysql_db_query, que té la funció d’enviar una petició mySQL, retorna un tipus resource. En l’exemple següent la variable $resultat és de tipus resource:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$query=&amp;quot;SELECT * FROM alumnes&amp;quot;;&lt;br /&gt;
$resultat=mysql_query($query);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''NULL'''&lt;br /&gt;
Quan necessiteu una variable que no tingui cap valor haureu d’utilitzar aquest tipus.&lt;br /&gt;
&lt;br /&gt;
===Els pseudotipus===&lt;br /&gt;
* '''mixed''': aquest pseudotipus indica que la variable en questió pot emmagatzemar múltiples tipus.&lt;br /&gt;
* '''number''': indica que la variable pot contenir un valor enter o de coma flotant.&lt;br /&gt;
* '''callback''': utilitzareu aquest pseudotipus per emmagatzemar crides de retorn generades per funcions de l’usuari.&lt;br /&gt;
&lt;br /&gt;
=== Conversions de tipus ===&lt;br /&gt;
&lt;br /&gt;
Per forçar un canvi de tipus haureu d’especificar entre parèntesis el tipus al qual voleu fer la conversió i col·locar-lo davant la variable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Senténcia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;150 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Modelat a &lt;br /&gt;
|-&lt;br /&gt;
| (integer), (int) ||integer.&lt;br /&gt;
|-&lt;br /&gt;
| (boolean)||boolean&lt;br /&gt;
|-&lt;br /&gt;
| (float), (double), (real) ||float&lt;br /&gt;
|-&lt;br /&gt;
| (string) ||string&lt;br /&gt;
|-&lt;br /&gt;
| (binary) ||string&lt;br /&gt;
|-&lt;br /&gt;
| (array)||array&lt;br /&gt;
|-&lt;br /&gt;
| (object)|| object&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Sense modelar 27/5: &amp;quot;.(27/5).&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
echo &amp;quot;I ara ja modelat: &amp;quot;.(integer)(27/5);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Constants===&lt;br /&gt;
Una constant és un identificador (nom) per expressar un valor simple. Com el nom suggereix, aquest valor no pot variar durant l'execució del script. (A excepció de les [[http://php.net/manual/es/language.constants.predefined.php constants màgiques]], que en realitat no són constants). Una constant és sensible a majúscules per defecte. Per convenció, els identificadors de constants sempre solen declarar-se en majúscules.&lt;br /&gt;
&lt;br /&gt;
El nom d'una constant segueix les mateixes regles que qualsevol altra etiqueta de PHP. Un nom de constant vàlid comença per una lletra o subguió, seguit per qualsevol nombre o lletres, nombres o subguions. Usant una expressió regular, es representaria de la següent manera: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
define('MIN_VALUE', '0.0');   // OK - Funciona FORA d'una definició de classe&lt;br /&gt;
define('MAX_VALUE', '1.0');   // OK - Funciona FORA d'una definició de classe&lt;br /&gt;
&lt;br /&gt;
echo MIN_VALUE;&lt;br /&gt;
//const MIN_VALUE = 0.0;         Aquí Malament - Però funciona DINTRE d'una definició de classe&lt;br /&gt;
//const MAX_VALUE = 1.0;         Aquí Malament - Però funciona DINTRE d'una definició de classe&lt;br /&gt;
&lt;br /&gt;
class Exemple1&lt;br /&gt;
{&lt;br /&gt;
  //define('MIN_VALUE', '0.0');  Malament - Funciona FORA d'una definició de classe&lt;br /&gt;
  //define('MAX_VALUE', '1.0');  Malament - Funciona FORA d'una definició de classe&lt;br /&gt;
&lt;br /&gt;
  const MIN_VALUE = 0.0;      // OK - Funciona DINTRE d'una definició de classe&lt;br /&gt;
  const MAX_VALUE = 1.0;      // OK - Funciona DINTRE d'una definició de classe&lt;br /&gt;
&lt;br /&gt;
  public static function getMinValue()&lt;br /&gt;
  {&lt;br /&gt;
    return self::MIN_VALUE;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public static function getMaxValue()&lt;br /&gt;
  {&lt;br /&gt;
    return self::MAX_VALUE;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
echo Exemple1::getMinValue();   //invocamos clase &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es la diferencia entre $this y self:: ?'''&lt;br /&gt;
&lt;br /&gt;
Uno usa $this para referenciar al objeto actual, y se utiliza self:: para referenciar la clase actual. Se utiliza $this-&amp;gt;nombre para nombres no estáticos y se utiliza self::nombres para nombres estáticos.&lt;br /&gt;
&lt;br /&gt;
=== Variables predefinides ===&lt;br /&gt;
&lt;br /&gt;
En PHP hi ha una sèrie de variables predefinides que resulten de gran ajuda per al programador. Dins d’aquestes variables predefinides cal destacar un gran grup, el grup de les anomenades superglobals.&lt;br /&gt;
&lt;br /&gt;
Les variables '''superglobals''' són variables que sempre estan disponibles en tots els àmbits.&lt;br /&gt;
&lt;br /&gt;
*'''$GLOBALS''':fa referència a totes les variables disponibles en l’àmbit global. Es tracta d’una variable de tipus matriu associativa.&lt;br /&gt;
En l’exemple següent es recorre la variable superglobal $GLOBALS:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$una_variable=&amp;quot;Hola&amp;quot;;&lt;br /&gt;
$una_altra_variable=&amp;quot;Com va?&amp;quot;;&lt;br /&gt;
foreach ($GLOBALS as $key =&amp;gt; $valor)&lt;br /&gt;
   echo &amp;quot;GLOBALS[$key] = $valor&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$_SERVER''':ofereix informació molt últil sobre el servidor i l’entorn d’execució. Els valors que emmagatzema són generats pel navegador web.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Executeu-lo i veureu un seguit de dades&lt;br /&gt;
referents a la màquina que fa de servidor del PHP. Entre altres coses, identificareu&lt;br /&gt;
el nom de la màquina, la versió del navegador, la versió del servidor web, la&lt;br /&gt;
ubicació de fitxers importants i un llarg etcètera.*/&lt;br /&gt;
&lt;br /&gt;
foreach ($_SERVER as $key =&amp;gt; $valor)&lt;br /&gt;
   echo &amp;quot;SERVER[$key] = $valor&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$_GET''': correspon a la variable GET del protocol HTTP. Emmagatzema els valors de les variables que es trasmeten per mitjà del protocol HTTP mitjançant el mètode GET. El seu ús és molt normal en formularis.&lt;br /&gt;
&lt;br /&gt;
*'''$_POST''': correspon a la variable POST del protocol HTTP. Emmagatzema els valors de les variables que es transmeten per mitjà del protocol HTTP mitjançant el mètode POST. El seu ús és, generalment, més adequat que el mètode GET per a temes de seguretat.&lt;br /&gt;
&lt;br /&gt;
*'''$_COOKIE''': és una variable de tipus matriu associativa que emmagatzemarà les variables passades a l’script per mitjà de les galetes de l’HTML.&lt;br /&gt;
&lt;br /&gt;
*'''$_REQUEST''': és una matriu associativa que conté les dades de $_GET ,$_POST i $_COOKIE.&lt;br /&gt;
&lt;br /&gt;
*'''$_FILES''': aquesta variable s’utilitza en la càrrega de fitxers per mitjà del protocol HTTP. El mètode utilitzat és el POST.&lt;br /&gt;
&lt;br /&gt;
*'''$_SESSION''': conté les variables de sessió disponibles en l’script actual.&lt;br /&gt;
&lt;br /&gt;
*'''$_ENV''': conté les variables d’entorn.&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Detecció del Navegador ===&lt;br /&gt;
Escriu un script en PHP que detecti el navegador que està utilitzant el client que ha demanat la pàgina.&lt;br /&gt;
&lt;br /&gt;
[[:solució_detecció_navegador_php]]&lt;br /&gt;
&lt;br /&gt;
=== Variables estàtiques ===&lt;br /&gt;
Les variables estàtiques sempre mantenen el valor encara que el programa abandoni l’àmbit de la variable, i existeixen només en l’àmbit local de les funcions. No s’hi pot accedir fora d’aquest àmbit.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function comptador()&lt;br /&gt;
{&lt;br /&gt;
   $a = 0;&lt;br /&gt;
   echo &amp;quot;Al comptador: &amp;quot;.$a.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
   $a++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function comptadorEstatic()&lt;br /&gt;
{&lt;br /&gt;
   static $b = 0;&lt;br /&gt;
   echo &amp;quot;Al comptador estàtic: &amp;quot;.$b.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
   $b++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for($i=0;$i&amp;lt;3;$i++)&lt;br /&gt;
{&lt;br /&gt;
   comptador();&lt;br /&gt;
   comptadorEstatic();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integració PHP ==&lt;br /&gt;
&lt;br /&gt;
Normalment trobareu el llenguatge de programació PHP dins d’altres llenguatges.&lt;br /&gt;
El més usual és escriure codi en PHP dins de codi HTML.&lt;br /&gt;
&lt;br /&gt;
Heu de recordar que el codi PHP és interpretat pel servidor, i els resultats es mostren en el navegador que utilitzeu. La simbiosi que es crea entre el PHP i l’HTML permet al PHP generar HTML i a l’HTML passar dades al PHP.&lt;br /&gt;
&lt;br /&gt;
=== PHP dintre de PHP ===&lt;br /&gt;
&lt;br /&gt;
==== Include vs Require ====&lt;br /&gt;
És possible inserir el contingut d'un fitxer PHP en un altre arxiu PHP (abans que el servidor l'executi), amb la declaració d'incloure o requerir. Les sentències d'inclusió i requereixen són idèntics , excepte en cas de fallada :&lt;br /&gt;
&lt;br /&gt;
*'''requerir''' (require) produirà un error fatal ( E_COMPILE_ERROR ) i aturar la seqüència de comandaments&lt;br /&gt;
*'''inclou''' (include) només produirà una advertència ( E_WARNING ) i el guió seguirà&lt;br /&gt;
&lt;br /&gt;
Per tant, si voleu que l'execució continuï mostrant als usuaris la sortida, fins i tot si el fitxer d'inclusió falta, utilitzeu la instrucció d'inclusió. Altrament, en cas de FrameWork, CMS, o amb aplicacions PHP complexes, sempre utilitzeu la instrucció que requereix el fitxer per a poder continuar l'execució. Això ajudarà a evitar posar en perill la seguretat i la integritat de l'aplicació, per si de cas un arxiu clau falta accidentalment.&lt;br /&gt;
&lt;br /&gt;
Inclusió d'arxius estalvia molta feina. Això significa que pots crear una capçalera, peu de pàgina o arxiu de menú estàndard per a totes les pàgines web. Llavors, quan la capçalera ha de ser actualitzada, només s'ha d'actualitzar la capçalera inclouen l'arxiu.&lt;br /&gt;
&lt;br /&gt;
'''Sintaxi'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include 'filename.php';&lt;br /&gt;
&lt;br /&gt;
//or&lt;br /&gt;
&lt;br /&gt;
require 'Otherfilename.php';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Include_once vs Require_once ====&lt;br /&gt;
Require_once() es pot utilitzar per incloure un arxiu PHP en un altre, quan potser s'hagi de incloure el fitxer anomenat més d'una vegada. Si es comprova que l'arxiu ja ha estat inclòs, ignorarà altres inclusions. El seu funcionament és identic a require.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
require_once('x.php');  &lt;br /&gt;
require_once('x.php');  &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Include_once() es pot utilitzar per incloure un arxiu PHP en un altre, quan potser s'hagi de incloure el fitxer anomenat més d'una vegada. Si es comprova que l'arxiu ja ha estat inclòs, ignorarà altres inclusions. El seu funcionament és identic a include.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php  &lt;br /&gt;
include_once('x.php');  &lt;br /&gt;
include_once('x.php');  &lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://programacion.jias.es/2012/12/php-diferencias-entre-require-include-require_once-include_once/&lt;br /&gt;
&lt;br /&gt;
==== Redireccions ====&lt;br /&gt;
* Son sentencies on s'envia al navegador una nova pàgina. La pàgina que tenia el navegador desapareix i apareix una nova pàgina, la que està definida al location: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
header(&amp;quot;location: novapàgina.php&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici PHP amb cap i peus ===&lt;br /&gt;
&lt;br /&gt;
L’objectiu d’aquesta activitat és mostrar el funcionament de la inclusió d’arxius a PHP. Fer servir includes us permet simplificar el codi de les pàgines. Per exemple, podeu afegir un fitxer de capçalera (cap.php) i un de peu (peu.php) amb els continguts comuns de totes les pàgines del vostre lloc (el bàner, el menú, la informació general). Senzillament incloent aquests fitxers a totes les pàgines, podeu aconseguir una estètica comú. Si heu de canviar en algun moment la capçalera, modificant l’arxiu cap.php ho tindreu modificat a totes les pàgines del web.&lt;br /&gt;
Feu una pàgina web amb continguts estructurats amb dos fitxers: cap.php i peu.php&lt;br /&gt;
&lt;br /&gt;
solució:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[:solucio_cap_peus_php]]&lt;br /&gt;
&lt;br /&gt;
[[:solucio_cap_peus_php2]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP i Formularis HTML ===&lt;br /&gt;
El formulari electrònic és una eina molt potent fortament establida a Internet. Permet l’intercanvi o la introducció de dades entre usuaris d’una manera ràpida i senzilla. Un formulari permet la interactivitat i és el detonant que converteix Internet en l’eina més poderosa per enviar informació a un destinatari.&lt;br /&gt;
&lt;br /&gt;
El llenguatge PHP representa un salt qualitatiu enorme en l’ús de formularis. L’HTML no és un llenguatge creat pensant a utilitzar formularis, sinó que es va crear amb altres objectius. El llenguatge PHP té un gran potencial en la gestió de dades; per tant, quan HTML i PHP treballen juntament amb formularis ens trobem amb un binomi ideal.&lt;br /&gt;
&lt;br /&gt;
====Preparació de l’HTML====&lt;br /&gt;
El llenguatge HTML mostrarà la façana que l’usuari veurà a la pantalla del navegador. El PHP serà darrere d’aquesta primera pantalla i treballarà amb les dades.&lt;br /&gt;
El primer que cal programar per fer servir un formulari dissenyat en PHP és crear&lt;br /&gt;
el codi HTML. Un formulari en HTML s’emmarca entre les etiquetes &amp;lt;FORM&amp;gt; i &amp;lt;/FORM&amp;gt;. Per manipular aquest formulari s’utilitza l’atribut ''ACTION''.&lt;br /&gt;
L’atribut ''ACTION'' indica el programa que s’encarrega de manipular les dades, tasca que encomanareu a un codi dissenyat en llenguatge PHP.&lt;br /&gt;
L’etiqueta &amp;lt;form&amp;gt; us permet fer servir dos mètodes per enviar informació: '''GET''' i '''POST'''.&lt;br /&gt;
El mètode '''GET''' és molt útil en motors de cerca, però no ofereix gaire seguretat, ja que les dades que envia es poden veure en l’URL del navegador.&lt;br /&gt;
El mètode '''POST''' és molt més segur, ja que quan el servidor detecta que el mètode de transacció d’informació és '''POST''' espera rebre dades immediatament sense fer servir l’URL, la qual cosa implica que aquestes dades no seran visibles en l’URL.&lt;br /&gt;
Exemple de Formulari:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;El nostre primer exemple amb formularis&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;H1&amp;gt;Introdueix el teu nom i prem el botó!&amp;lt;/H1&amp;gt;&lt;br /&gt;
&amp;lt;FORM ACTION=&amp;quot;contesta.php&amp;quot; METHOD=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
Si us plau, escriu el teu nom:&amp;lt;INPUT TYPE=&amp;quot;text&amp;quot; NAME=&amp;quot;nom&amp;quot;&amp;gt;&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;INPUT TYPE=&amp;quot;submit&amp;quot; VALUE=&amp;quot;Enviar&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/FORM&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Com valora el PHP un formulari ====&lt;br /&gt;
En el moment d’enviar les dades des del formulari d’una pàgina HTML a un fitxer escrit en PHP s’ha de tenir en compte que l’atribut ''NAME'' emmagatzema el valor.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Resposta a la petició de dades&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;H1&amp;gt;...Continuem amb l’exemple!&amp;lt;/H1&amp;gt;&lt;br /&gt;
El teu nom és:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo $_POST['nom'];&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
En el moment en què s’envien dades del formulari HTML cap a un fitxer PHP, aquestes dades apareixeran dins d’un array superglobal amb tots els seus valors.&lt;br /&gt;
&lt;br /&gt;
=== Exercici Mini Calculadora ===&lt;br /&gt;
&lt;br /&gt;
Se desea realizar una calculadora de sólo SUMA, para ello tendremos dos inputs y un botón, cuando se aprete el botón deberá enviar enviar el formulario al server haciendo la operación y mostrándola.&lt;br /&gt;
 &lt;br /&gt;
=== Exercici Formulari amb Vectors ===&lt;br /&gt;
&lt;br /&gt;
Se desea realizar un formulario en el servidor que genere 10 inputs y un botón, a continuación el servidor recogerá todos los datos los mostrará y calculará la suma total. &lt;br /&gt;
&lt;br /&gt;
solució:&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solu_vector_input]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Les matrius associatives i els formularis====&lt;br /&gt;
Podeu utilitzar les matrius associatives $_POST i $_GET ; el seu ús, però, serà condicionat pel mètode utilitzat en el pas de dades en el codi HTML. Així, si en el codi HTMLel mètode és '''POST''' haureu de fer servir la matriu associativa '''$_POST'''; en canvi, si heu fet servir el mètode '''GET''' en el codi HTML, haureu de fer servir la matriu associativa '''$_GET'''.&lt;br /&gt;
&lt;br /&gt;
Per accedir als valors emmagatzemats en les matrius associatives fareu servir l’atribut corresponent '''NAME''' de l’HTML com a índex de la matriu associativa. &lt;br /&gt;
&lt;br /&gt;
No heu d’oblidar que el PHP és un llenguatge de programació que, entre altres coses, us permet utilitzar bucles. En el formulari següent es defineix una selecció múltiple, en què podreu marcar els navegadors que coneixeu.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Un exemple amb un formulari&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;seleccioMultiple.php&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
Nom: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nom&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Correu electrònic: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot;&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Navegadors que coneixes: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;select name=&amp;quot;navegadors[]&amp;quot; multiple&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Chrome&amp;quot;&amp;gt;Chrome&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;MozillaFirefox&amp;quot;&amp;gt;Mozilla Firefox&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Safari&amp;quot;&amp;gt;Safari&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Opera&amp;quot;&amp;gt;Opera&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;Lynx&amp;quot;&amp;gt;Lynx&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Envia&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquí us trobareu amb un petit problema. Per recuperar els valors introduïts com a nom i correu electrònic no hi ha cap problema, la matriu $_POST us permetrà un recorregut buscant els valors emmagatzemats a nom iemail. Amb la selecció múltiple, però, sorgeix un petit problema. A diferència dels casos anteriors, ara navegadors pot contenir més d’un valor, com ho fareu per mostrar tots els valors per pantalla? La solució és utilitzar un bucle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach ($_POST['navegadors'] as $opcio)&lt;br /&gt;
echo $opcio.&amp;quot;\n&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un altre exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if ($_POST) {&lt;br /&gt;
    echo '&amp;lt;pre&amp;gt;';&lt;br /&gt;
    //echo htmlspecialchars(print_r($_POST, true));&lt;br /&gt;
    print_r($_POST);&lt;br /&gt;
    print_r($_POST['personal']);&lt;br /&gt;
    print_r($_POST['personal']['nombre']);&lt;br /&gt;
    echo '&amp;lt;/pre&amp;gt;';&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;form action=&amp;quot;&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
    Nombre:  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;personal[nombre]&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Email:   &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;personal[email]&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Cerveza: &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;select multiple name=&amp;quot;cerveza[]&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;option value=&amp;quot;warthog&amp;quot;&amp;gt;Warthog&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option value=&amp;quot;guinness&amp;quot;&amp;gt;Guinness&amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;option value=&amp;quot;stuttgarter&amp;quot;&amp;gt;Stuttgarter Schwabenbräu&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;¡enviarme!&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== El mètode GET ===&lt;br /&gt;
*El mètode GET produeix una cadena llarga que apareix en els logs del servidor i a la URL del navegador.&lt;br /&gt;
&lt;br /&gt;
*El mètode GET es limita a enviar fins a només 1.024 caràcters .&lt;br /&gt;
&lt;br /&gt;
*Mai utilitzeu el mètode GET, si voleu enviar la contrasenya o una altra informació confidencial al servidor .&lt;br /&gt;
&lt;br /&gt;
*GET no pot ser utilitzat per enviar dades binàries, com imatges o documents de text, al servidor .&lt;br /&gt;
&lt;br /&gt;
*Les dades enviades pel mètode GET es pot accedir mitjançant la variable d'entorn QUERY_STRING.&lt;br /&gt;
&lt;br /&gt;
*PHP proveeix la matriu associativa $_GET per accedeix a tota la informació que s'enviï mitjançant el mètode GET&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$PHP_SELF = $_SERVER['PHP_SELF'];&lt;br /&gt;
echo $PHP_SELF ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if( $_GET[&amp;quot;name&amp;quot;] || $_GET[&amp;quot;age&amp;quot;] )&lt;br /&gt;
  {&lt;br /&gt;
     echo &amp;quot;Welcome &amp;quot;. $_GET['name']. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
     echo &amp;quot;You are &amp;quot;. $_GET['age']. &amp;quot; years old.&amp;quot;;&lt;br /&gt;
     exit();&lt;br /&gt;
  }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;form action=&amp;lt;?php echo $_SERVER['PHP_SELF']?&amp;gt; method=&amp;quot;GET&amp;quot;&amp;gt;&lt;br /&gt;
  Name: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot; /&amp;gt;&lt;br /&gt;
  Age: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;age&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== El mètode POST ===&lt;br /&gt;
*El mètode POST no té cap restricció en la mida de les dades a enviar.&lt;br /&gt;
&lt;br /&gt;
*El mètode POST es pot utilitzar per enviar ASCII, així com dades binàries.&lt;br /&gt;
&lt;br /&gt;
*Les dades enviades pel mètode POST passa per la capçalera HTTP. La seguretat depèn de protocol HTTP. Mitjançant l'ús d'HTTP segur pots assegurar-te que la seva informació està segura .&lt;br /&gt;
&lt;br /&gt;
*El PHP proveeix de la matriu associativa $ _POST per accedeix a tota la informació enviada pel mètode POST.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  if( $_POST[&amp;quot;name&amp;quot;] || $_POST[&amp;quot;age&amp;quot;] )&lt;br /&gt;
  {&lt;br /&gt;
     echo &amp;quot;Welcome &amp;quot;. $_POST['name']. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
     echo &amp;quot;You are &amp;quot;. $_POST['age']. &amp;quot; years old.&amp;quot;;&lt;br /&gt;
     exit();&lt;br /&gt;
  }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;form action=&amp;quot;&amp;lt;?php echo $_SERVER['PHP_SELF']?&amp;gt;&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;   &amp;lt;!--&amp;lt;?php $_PHP_SELF ?&amp;gt;--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Name: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot; /&amp;gt;&lt;br /&gt;
  Age: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;age&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $_PHP_SELF ===&lt;br /&gt;
La variable $_PHP_SELF conté el nom del script PHP (pàgina php) el qual està executant.  ESTÁ DESFASADO USAR $_SERVER['PHP_SELF']&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  if( $_REQUEST[&amp;quot;name&amp;quot;] || $_REQUEST[&amp;quot;age&amp;quot;] )&lt;br /&gt;
  {&lt;br /&gt;
     echo &amp;quot;Welcome &amp;quot;. $_REQUEST['name']. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;
     echo &amp;quot;You are &amp;quot;. $_REQUEST['age']. &amp;quot; years old.&amp;quot;;&lt;br /&gt;
     exit();&lt;br /&gt;
  }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;form action=&amp;quot;&amp;lt;?php $_PHP_SELF ?&amp;gt;&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Name: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;name&amp;quot; /&amp;gt;&lt;br /&gt;
  Age: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;age&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;input type=&amp;quot;submit&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Acceso a Ficheros ===&lt;br /&gt;
&lt;br /&gt;
'''Abrir y cerrar el descriptor de ficheros'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $fitxer = fopen(&amp;quot;datos.txt&amp;quot;,&amp;quot;a&amp;quot;);&lt;br /&gt;
    fclose($fitxer);&lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'r' 	Apertura para sólo lectura; coloca el puntero al fichero al principio del fichero. &lt;br /&gt;
'w+' 	Apertura para lectura y escritura; coloca el puntero al fichero al principio del fichero y trunca el fichero a longitud cero. Si el fichero no existe se intenta crear. &lt;br /&gt;
'a+' 	Apertura para lectura y escritura; coloca el puntero del fichero al final del mismo. Si el fichero no existe, se intenta crear. En este modo, fseek() no tiene efecto, las escrituras siempre son pospuestas. &lt;br /&gt;
&lt;br /&gt;
'''Escribir datos en un fichero'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $fp = fopen('datos.txt', 'a');&lt;br /&gt;
    fwrite($fp, 'Julio');&lt;br /&gt;
    fwrite($fp, 'Noguera');&lt;br /&gt;
    fclose($fp);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Leer datos de un fichero'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
 $fitxer=fopen(&amp;quot;datos.txt&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
    while(!feof($fitxer)){&lt;br /&gt;
       $line = fgets($fitxer);&lt;br /&gt;
       echo $line;&lt;br /&gt;
    }&lt;br /&gt;
    fclose($fitxer);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Más info&lt;br /&gt;
http://www.php.net/manual/es/function.fopen.php&lt;br /&gt;
http://www.php.net/manual/es/function.fgets.php&lt;br /&gt;
http://www.php.net/manual/es/function.fwrite.php&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Formulari Insti // Acceso a ficheros ===&lt;br /&gt;
&lt;br /&gt;
Se desea crear un formulario donde se introduzcan los campos de nombre, apellidos, dni, contraseña, cuando se clique el botón de enviar, el servidor debe recibir todos los parámetros de ese usuario y escribirlos en un fichero de texto (fopen/fwrite), el siguiente usuario que rellene el formulario escribirá a continuación, después debe listar todos los ficheros que tiene el servidor (system()/shell_exec).&lt;br /&gt;
&lt;br /&gt;
solució: &lt;br /&gt;
&lt;br /&gt;
if ($_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;] == &amp;quot;POST&amp;quot;) { &lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php echo $_SERVER['PHP_SELF']; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $nombre = $_POST['nombre'];  //recibe los parámetros del formulario&lt;br /&gt;
    $apellido = $_POST['apellido'];&lt;br /&gt;
    $dni = $_POST['dni'];&lt;br /&gt;
    $pass = $_POST['pass'];&lt;br /&gt;
&lt;br /&gt;
    $file = fopen(&amp;quot;clase.txt&amp;quot;, &amp;quot;a&amp;quot;);    //crea un descriptor de fichero&lt;br /&gt;
    fwrite($file, ($nombre) . &amp;quot;,&amp;quot; . ($apellido) . &amp;quot;,&amp;quot; . ($dni) . &amp;quot;,&amp;quot; . ($pass) . &amp;quot;\n&amp;quot;);  //introduce datos dentro del fichero&lt;br /&gt;
    fclose($file);&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    $usuarioEnSistema = system('cat clase.txt');     //ejecuta terminal linux&lt;br /&gt;
   //$usuario = shell_exec('cat clase.txt'');   // comando más antiguo&lt;br /&gt;
&lt;br /&gt;
    echo $usuarioEnSistema;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;lt;?php $_PHP_SELF ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;apellido&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dni&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pass&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar formulario&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici: Calculadora PHP ===&lt;br /&gt;
Crea un formulari amb un únic TextBox on s'indiqui les operacions matemàtiques a realitzar. Envia el contingut del TextBox amb el mètode POST i realitza les operacions. Imprimeix per pantalla el resultat.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[Solucio_calculadora_m6]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ISSET ===&lt;br /&gt;
&lt;br /&gt;
isset -&amp;gt; Devuelve '''true''' si la variable existe y tiene un valor distinto de null, false de lo contrario.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
var_dump( isset($var) );   //isset() devuelve '''false''' por que $var no ha sido definida&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$var;&lt;br /&gt;
var_dump( isset($var) );  //isset() devuelve '''false''' aunque la variable haya sido declarada pues su valor es NULL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$var = &amp;quot;&amp;quot;;&lt;br /&gt;
var_dump( isset($var) );  //isset() devuelve '''true'''. El valor ya no es nulo aunque esté vacío&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''¿Y cuando deberías usar isset()?'''&lt;br /&gt;
&lt;br /&gt;
Siempre y cuando que quieras comprobar que la variable existe (variable inicializada), un ejemplo bueno sería si quieres saber si se ha mandado un formulario:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;campo1&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar formulario&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if (isset($_POST['submit']) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''isset(), is_null() y empty(): Diferencias y ejemplos de uso'''&lt;br /&gt;
&lt;br /&gt;
https://cybmeta.com/isset-is_null-y-empty-diferencias-y-ejemplos-de-uso&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/32133/como-y-cuando-se-usan-isset-y-empty-correctamente&lt;br /&gt;
&lt;br /&gt;
=== Exercici enviament de dades ===&lt;br /&gt;
És popular el disseny d’un document web, en què el mateix document conté la part del formulari HTML i el codi PHP que agafa les dades i les processa. Aquest procediment pot resultar estrany en principi, ja que esteu esperant dos documents ben diferenciats. Així i tot val la pena que veieu aquesta forma de treballar i decidiu si us resulta útil o no. Per fer-ho, simplement heu de fusionar els dos documents (el que envia les dades i el que les rep) en un document únic HTML+PHP de dues parts amb la següent estructura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if(primera vegada que s'entra al document)&lt;br /&gt;
{&lt;br /&gt;
crear formulari HTML i enviar-ho al propi document&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
rebre les dades a través de POST o GET&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Feu un document amb aquestes característiques que enviï les següents dades:&lt;br /&gt;
*nom&lt;br /&gt;
*cognom&lt;br /&gt;
*contrasenya&lt;br /&gt;
*si l’usuari és alumne o professor&lt;br /&gt;
*si l’usuari és actiu o no&lt;br /&gt;
*foto (únicament el nom del fitxer)&lt;br /&gt;
*edat (entre 18 i 99)&lt;br /&gt;
*comentaris&lt;br /&gt;
*un camp ocult amb el nom ocult i valor prova&lt;br /&gt;
solució:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[:solucio_enviament_dades_php]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Galetes ===&lt;br /&gt;
Les galetes són uns fitxers de text que emmagatzemen informació a l’ordinador client referent a la visita d’un usuari a una pàgina web.&lt;br /&gt;
Les galetes no són un acte d’intromissió per part de la pàgina web visitada; simplement, són una font d’informació molt útil per augmentar l’eficiència en l’accés.&lt;br /&gt;
Les galetes tenen una mida màxima d’1K i caduquen, la qual cosa fa molt difícil que s’utilitzin amb fins malintencionats. A més, únicament pot consultar la galeta el web que l’ha dipositada, la informació que conté no és visible per a la resta de pàgines web.&lt;br /&gt;
&lt;br /&gt;
Un ús molt freqüent de les galetes és emmagatzemar un perfil d’usuari. Així s’aconsegueix que cada vegada que el mateix usuari accedeix a un web, aquest en conegui les preferències i li mostri directament els continguts més adequats.&lt;br /&gt;
&lt;br /&gt;
Les galetes ajuden els programadors a crear un entorn més adequat per a l’usuari visitant. Moltes pàgines web permeten canviar la mida del text, els colors de la pàgina, la disposició d’alguns continguts, etc. Una vegada l’usuari ha modificat al seu gust l’aspecte de la pàgina web, aquestes dades s’emmagatzemen per a la propera visita.&lt;br /&gt;
&lt;br /&gt;
Importante: las cookies se envían al cliente mediante encabezados HTTP. Como cualquier otro encabezado, las cookies se deben enviar antes que cualquier salida que genere la página (antes que &amp;lt;html&amp;gt;, &amp;lt;head&amp;gt; o un simple espacio en blanco). &lt;br /&gt;
&lt;br /&gt;
'''Funcions del PHP per treballar amb galetes'''&lt;br /&gt;
&lt;br /&gt;
La funció que s’utilitza en PHP per crear galetes és setcookie.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
bool setcookie(string $nom [, string $valor [, int $caduca= 0[, string $ruta [, string $domini [, bool $seguretat= false [, bool $nomeshttp=false]]]]]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* $nom: és obligatori i indica el nom que donareu a la galeta, la resta de paràmetres són opcionals.&lt;br /&gt;
* $valor: és el valor que tindrà la galeta.&lt;br /&gt;
* $caduca: indica els segons que té de vida la galeta; si no s’indica res la galeta deixarà d’existir quan finalitzi la sessió de l’usuari.&lt;br /&gt;
* $ruta: indica on podeu trobar la galeta dins el servidor.&lt;br /&gt;
Si no ponemos la ruta (Path), la cookie sólo se puede usar en páginas que se encuentren en el mismo directorio que la página que la creó. Si queremos que se utilice en un directorio en concreto debemos añadir la ruta.&lt;br /&gt;
&lt;br /&gt;
//Cookie creada en el directorio /registro/login&lt;br /&gt;
&lt;br /&gt;
//Si queremos que las páginas del directorio raíz / puedan acceder a la cookie&lt;br /&gt;
&lt;br /&gt;
* $domini: marca el domini en què la galeta està disponible.&lt;br /&gt;
* $seguretat: tindrà el valor TRUE si voleu que la galeta només s’utilitzi en una connexió segura (conexió HTTPs), i FALSE (que és el valor per defecte), si no és necessari un cert grau de seguretat.&lt;br /&gt;
* $nomeshttp: si té per valor TRUE marcarà que la galeta solament és accessible si s’utilitza el protocol HTTP.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
setcookie(&amp;quot;nom&amp;quot;, &amp;quot;Maadiva&amp;quot;, 3600, &amp;quot;/&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El segon fitxer s’encarregarà de consultar a la matriu associativa '''$_COOKIE''' el valor de la galeta indicada, que en aquest cas seria nom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo $_COOKIE[&amp;quot;nom&amp;quot;];&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
setcookie(&amp;quot;valor&amp;quot;, 1, time() + 30);    //time() tiempo desde que se originó unix.&lt;br /&gt;
&lt;br /&gt;
print_r($_COOKIE);    //no muestra todas las cookies por temas de seguridad&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
unset($_COOKIE[&amp;quot;valor&amp;quot;]);  //otra forma setcookie('valor', 1, expire);  // setcookie(&amp;quot;valor&amp;quot;, 1, time() - 30);&lt;br /&gt;
&lt;br /&gt;
print_r($_COOKIE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exercici galetes ====&lt;br /&gt;
Se desea que cuente el número de visitas que realiza un usuario al visitar la página; este contador conserva su valor durante un año aún a pesar de que un usuario cierre el navegador y tarde días en volver a visitar la página.&lt;br /&gt;
&lt;br /&gt;
solució:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_contador_galletas]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exercici galetes ====&lt;br /&gt;
Les cookies us permeten desar informació al navegador que estarà disponible més endavant pel vostre web. Per exemple, podeu desar la configuració personal de l’usuari o la llengua en què ha escollit visitar el web. La propera vegada que l’usuari visiti el web, el vostre codi PHP podrà obtenir aquesta informació desada i presentar a l’usuari el web amb la seva configuració personal o la llengua escollida. És important destacar que les cookies queden desades al navegador de l’usuari i no al servidor web.&lt;br /&gt;
&lt;br /&gt;
Feu un web amb dos fitxers. El primer, index.php, s’encarregarà d’obtenir el nom de l’usuari i la llengua que vol fer servir per defecte entre una llista desplegable mitjançant un formulari. Enviarà aquestes dades a un altre fitxer, cookie.php, que desarà la informació a les cookies.&lt;br /&gt;
La propera vegada que l’usuari accedeixi a index.php el formulari estarà emplenat amb la informació desada la vegada anterior que va accedir-hi.&lt;br /&gt;
&lt;br /&gt;
sol&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[:solucio_galetes_php]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sessió ===&lt;br /&gt;
&lt;br /&gt;
Les variables de sessió són variables que estan disponibles en múltiples pàgines sense haver de fer servir pas de paràmetres. Les variables de sessió tenen un temps de vida limitat i s’emmagatzemen en el servidor.&lt;br /&gt;
&lt;br /&gt;
Podeu fer servir les variables de sessió per mantenir informació (l’anomenada informació de sessió) entre diferents pàgines. Per exemple,&lt;br /&gt;
el nom d’usuari o una selecció de productes que ja s’hagi fet.&lt;br /&gt;
&lt;br /&gt;
A continuació, estudiareu un exemple format per tres fitxers. El primer fitxer és un formulari senzill que demana a l’usuari un identificador i una contrasenya. Aquestes dades s’envien a un segon fitxer, anomenat exempleAutenticar.php, que crea les variables de sessió. Finalment, trobareu un tercer fitxer anomenat continuem.php, que recupera la informació emmagatzemada en les variables de sessió.&lt;br /&gt;
&lt;br /&gt;
Just a sota d’aquest text hi ha el fitxer del qual partireu. L’hem anomena exempleSessions.php, però el podeu anomenar d’una altra manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Exemple amb variables de sessió&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt; &lt;br /&gt;
&amp;lt;form action=&amp;quot;exempleAutenticar.php&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;
Escriu el teu nom:&lt;br /&gt;
&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;usuari&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Escriu la teva contrasenya:&lt;br /&gt;
&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;contrasenya&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Envia!&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tot seguit apareix el codi del fitxer exempleAutenticar.php. En aquest fitxer creareu i inicialitzareu les dues variables de sessió que utilitzareu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
$_SESSION['id_usuari']=$_REQUEST['usuari'];&lt;br /&gt;
$_SESSION['clau_acces']=$_REQUEST['contrasenya'];&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;HTML&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;...continueu amb l’exemple de variables de sessió...&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
Ja s’han emmagatzemat les variables de sessió.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;continuem.php&amp;quot;&amp;gt;Vinga! Cap al final de l’exemple!&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fixeu-vos que el primer que es fa és cridar la funció '''session_start()'''. És obligatori que inicieu la sessió abans de cap etiqueta HTML perquè tot funcioni correctament.&lt;br /&gt;
Amb $_REQUEST es recuperen els dos valors que s’han passat des del fitxer inicial, és a dir, usuari i contrasenya, i els heu d’emmagatzemar en dues variables de sessió creades a $_SESSION, que rebran el nom d’id_usuari i clau_acces.&lt;br /&gt;
$_REQUEST és un array associatiu global que per defecte té els continguts de $_GET, $_POST i $_COOKIE.&lt;br /&gt;
A part de crear les variables de sessió i donar-los valors trobareu un enllaç cap al tercer fitxer.&lt;br /&gt;
El codi del tercer fitxer, continuem.php, el teniu a continuació:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;...i acabem l’exemple de variables de sessió!&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo &amp;quot;L’usuari que havíeu escrit era: &amp;quot;.$_SESSION['id_usuari'];echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
echo &amp;quot;La contrasenya que havíeu escrit era: &amp;quot;.$_SESSION['clau_acces'];&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Com que esteu treballant amb sessions, el primer que hauríeu de fer és llançar la sessió amb session_start(). A continuació, es recuperen els valors emmagatzemats en les dues variables de sessió.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eliminar sesión&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
session_start();&lt;br /&gt;
unset($_SESSION['id_usuari']); // will delete just the name data&lt;br /&gt;
&lt;br /&gt;
//session_destroy(); // borrará todos los datos asociados a ese usuario. También $_SESSION = array(); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;...i acabem l’exemple de variables de sessió!&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo &amp;quot;L’usuari que havíeu escrit era: &amp;quot;.$_SESSION['id_usuari'];echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
echo &amp;quot;La contrasenya que havíeu escrit era: &amp;quot;.$_SESSION['clau_acces'];&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;index3.php&amp;quot;&amp;gt;Destruir Variables de sesion&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/HTML&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les sessions us permeten emmagatzemar dades que podran ser compartides entre les diferents pàgines del web. Aquestes dades, a diferència de les cookies, estan emmagatzemades al servidor i estan disponibles durant tot el temps que l’usuari està interactuant amb la pàgina (temps de sessió).&lt;br /&gt;
Alguns exemples de dades que solen guardar-se a les sessions és si l’usuari ha accedit al web mitjançant els valors usuari/contrasenya, o un carret de la compra.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exercici Sessions ====&lt;br /&gt;
1. Feu una pàgina web que passi entre les seves pàgines el nom de l’usuari i una variable (cost) que s’anirà incrementant en 10 cada vegada que l’usuari passa entre les pàgines (podem pensar que aquesta variable representa el cost de les compres que ha fet fins ara l’usuari al web).&lt;br /&gt;
La sessió es tancarà quan l’usuari torni a la pàgina de login.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://codigosdeprogramacion.com/2016/12/20/sistema-de-usuarios-y-sesiones-en-php-y-mysql-1-login-sesiones-y-logout/&lt;br /&gt;
&lt;br /&gt;
http://velozityweb.com/blog/php/login-de-usuarios-y-creacion-de-sesiones-con-php-y-mysql/#sthash.XbMcrnTA.PSO2jYQ9.dpbs&lt;br /&gt;
&lt;br /&gt;
http://www.formacionwebonline.com/crear-sesiones-php-en-intranet/&lt;br /&gt;
&lt;br /&gt;
=== Exercici Moodle ===&lt;br /&gt;
&lt;br /&gt;
2.Se trata de la hacer un moodle, tenemos un formulario y almacenaremos una base de datos (simulada) en la que guardaremos en un archivo el usuario, contraseña y rol de un profe y un alumno. &lt;br /&gt;
Deberá de comprobar si está registrado, en caso de estarlo se crearán las cookies y variables de sesión(5 minutos para el alumnado y 10 para el profe), en caso de no acceder deberán redireccionarse al login.&lt;br /&gt;
Si se validan correctamente, deberá acceder al menu y mostrar la información si tiene rol de alumno (ROLE_ALUMNO) y otra diferente si es profesor(ROLE_ALUMNO). &lt;br /&gt;
También deberá existir un logout en caso de querer terminar la sesión. &lt;br /&gt;
$_SESSION['caduca']=time()+60; &lt;br /&gt;
&lt;br /&gt;
Solució Exercici Moodle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_moodle]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ejercicio Carrito ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--http://evilnapsis.com/2016/10/30/ejemplo-de-carrito-de-compras-sencillo-con-php-y-mysql/--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Exercici Complert ====&lt;br /&gt;
Exercici que engloba Galetes, Idioma, Login, Intranet amb Cap, Peus, Menu i contingut i Sessions.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[http://www.infomerce.es/moodle/mod/resource/view.php?id=11136 Exercici de Classe]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML ==&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
=== Creació del Arbre XML ===&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$xmlDoc = new DOMDocument();&lt;br /&gt;
$xmlDoc-&amp;gt;load(&amp;quot;file.xml&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
=== Obtenir un element del arbre ===&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Recòrrer tots els elemens ===&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
print $xmlDoc-&amp;gt;saveXML(); //imprimir toda la info&lt;br /&gt;
&lt;br /&gt;
// recorrer las etiquetas y los valores&lt;br /&gt;
$x = $xmlDoc-&amp;gt;documentElement;&lt;br /&gt;
foreach ($x-&amp;gt;childNodes AS $item) {&lt;br /&gt;
  print $item-&amp;gt;nodeName . &amp;quot; = &amp;quot; . $item-&amp;gt;nodeValue . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//otra manera de recorrer&lt;br /&gt;
$aulas = $xmlDoc-&amp;gt;getElementsByTagName('aula');   //selecciona todas las etiquetas aula y muestra el contenido dentro de ellas&lt;br /&gt;
foreach ($aulas as $aula) {&lt;br /&gt;
    echo $aula-&amp;gt;nodeName;&lt;br /&gt;
    echo $aula-&amp;gt;nodeValue, PHP_EOL;&lt;br /&gt;
    echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Otra forma de recorrer&lt;br /&gt;
$aulas = $xmlDoc-&amp;gt;getElementsByTagName('aula');   // otra forma de acceder&lt;br /&gt;
foreach ($aulas as $aula) {&lt;br /&gt;
   echo $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)[0]-&amp;gt;nodeValue;   //equivale a -&amp;gt;item(0)&lt;br /&gt;
   echo  $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
   echo $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afegir un nou element ===&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$auladom = $xmlDoc-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmlDoc-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmlDoc-&amp;gt;createTextNode(strtolower(&amp;quot;prueba&amp;quot;));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmlDoc-&amp;gt;createElement(&amp;quot;XARXA_AULA_XML&amp;quot;);&lt;br /&gt;
$domnode = $xmlDoc-&amp;gt;createTextNode(strtolower(&amp;quot;prueba&amp;quot;));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmlDoc-&amp;gt;createElement(&amp;quot;MASK_AULA_XML&amp;quot;);&lt;br /&gt;
$domnode = $xmlDoc-&amp;gt;createTextNode(strtolower(&amp;quot;prueba&amp;quot;));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmlDoc-&amp;gt;createElement(&amp;quot;INIT_AULA_XML&amp;quot;);&lt;br /&gt;
$domnode = $xmlDoc-&amp;gt;createTextNode(strtolower(&amp;quot;prueba&amp;quot;));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmlDoc-&amp;gt;createElement(&amp;quot;CURRENT_AULA_XML&amp;quot;);&lt;br /&gt;
$domnode = $xmlDoc-&amp;gt;createTextNode(strtolower(&amp;quot;prueba&amp;quot;));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
&lt;br /&gt;
$root = $xmlDoc-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmlDoc-&amp;gt;save(&amp;quot;file.xml&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
=== Esborrar un element ===&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//borrar nodo&lt;br /&gt;
$xmlDoc = new DOMDocument;&lt;br /&gt;
$xmlDoc-&amp;gt;load('file.xml');   //cargamos fichero&lt;br /&gt;
&lt;br /&gt;
$aula = $xmlDoc-&amp;gt;documentElement;&lt;br /&gt;
&lt;br /&gt;
// seleccionamos el nodo concreto 0 y lo eleminamos&lt;br /&gt;
$aulaSeleccionada = $aula-&amp;gt;getElementsByTagName('aula')-&amp;gt;item(0);&lt;br /&gt;
$aulaborrada = $aula-&amp;gt;removeChild($aulaSeleccionada);&lt;br /&gt;
&lt;br /&gt;
$xmlDoc-&amp;gt;save(&amp;quot;file.xml&amp;quot;); //guardamos cambios&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exercici crear XML'''&lt;br /&gt;
&lt;br /&gt;
Tenim un formulari i volem ficar dins del nostre xml noves dades, per tant, haurem de crear un formulari on introduirem les dades.&lt;br /&gt;
&lt;br /&gt;
= Bibliografia / Webgrafia =&lt;br /&gt;
*[http://php.net/manual/es/ Manual oficial de PHP]&lt;br /&gt;
*[http://www.codeacademy.com Introducció a PHP]&lt;br /&gt;
*David Sklar, Adam Trachtenberg, &amp;quot;PHP Cookbook, Third Edition&amp;quot;, O’Reilly Media Inc., 2014. ISBN 978-1-449-36375-8&lt;br /&gt;
*Eduard García Sacristán, Eduard Latorre Jarque, Montserrat Madridejos Mora, Raúl Velaz Mayo, &amp;quot;Llenguatges de guions de servidor&amp;quot;, IOC, 2014 &lt;br /&gt;
*[https://docs.google.com/presentation/d/1ZQgIsW4KCyIfH8NyiqH9ueanM83Ym7bjitaxyQKS0hs/edit#slide=id.i14 Llenguatges de programació del costat del servidor]&lt;br /&gt;
*[http://www.adelat.org/media/docum/nuke_publico/lenguajes_del_lado_servidor_o_cliente.html www.Adelat.org]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== EMMAGATZEMAR I LLEGIR FITXERS ==&lt;br /&gt;
A PHP s'utilitzen dos funcions per manipular JSON: json_encode i json_decode. A la següent Web trobareu com utilitzar-les: http://www.php.net/manual/es/function.json-decode.php&lt;br /&gt;
&lt;br /&gt;
'''LLegir i escriure  Fitxer desde PHP '''&lt;br /&gt;
&lt;br /&gt;
Si volem llegir un fitxer .json haurem d'utilitzar la instrucció &amp;quot;file_get_contents&amp;quot;. Les dades que obtinguis d'aquesta funció, els hauràs de guardar en una variable qualsevol&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$json = file_get_contents (&amp;quot;./datos.json&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Guarda información dentro de un fichero, en este caso un JSON&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$json_string1 = '{&amp;quot;posicionX&amp;quot;:250,&amp;quot;posicionY&amp;quot;:100}'&lt;br /&gt;
file_put_contents('./datos.json', $json_string1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SERIALIZACIÓN ==&lt;br /&gt;
&lt;br /&gt;
En PHP existe una forma muy sencilla de almacenar o transmitir cualquier tipo de valor (excepto el tipo resource) en forma de una cadena seriada: la serialización.&lt;br /&gt;
&lt;br /&gt;
La serialización te permite, por ejemplo, guardar un objeto o array en una base de datos o transmitirlo entre aplicaciones remotas, para luego volver a convertirlo a su tipo y estructura original.&lt;br /&gt;
&lt;br /&gt;
Supongamos que tienes el siguiente array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$arr = array(&lt;br /&gt;
  &amp;quot;fruta&amp;quot; =&amp;gt; &amp;quot;manzana&amp;quot;, &lt;br /&gt;
  &amp;quot;objeto&amp;quot; =&amp;gt; &amp;quot;bicicleta&amp;quot;, &lt;br /&gt;
  &amp;quot;animales&amp;quot; =&amp;gt; array(&lt;br /&gt;
             &amp;quot;perro&amp;quot;, &lt;br /&gt;
             &amp;quot;gato&amp;quot;, &lt;br /&gt;
             &amp;quot;caballo&amp;quot;) &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si lo deseas guardar en una tabla de una base de datos, lo puedes serializar de esta forma:&lt;br /&gt;
&lt;br /&gt;
'''$string = serialize($arr);'''&lt;br /&gt;
&lt;br /&gt;
La función serialize devolverá un valor fácilmente almacenable o transmitible:&lt;br /&gt;
&lt;br /&gt;
''a:3:{s:5:&amp;quot;fruta&amp;quot;;s:7:&amp;quot;manzana&amp;quot;;s:6:&amp;quot;objeto&amp;quot;;s:9:&amp;quot;bicicleta&amp;quot;;s:8:&amp;quot;animales&amp;quot;;a:3: i:0;s:5:&amp;quot;perro&amp;quot;;i:1;s:4:&amp;quot;gato&amp;quot;;i:2;s:7:&amp;quot;caballo&amp;quot;;}}''&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor original en PHP a partir de la cadena seriada:&lt;br /&gt;
&lt;br /&gt;
'''$arr = unserialize($string);'''&lt;br /&gt;
&lt;br /&gt;
Un ejemplo del uso de la serialización la tenemos en la forma en que WordPress almacena información variada en algunas de sus tablas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Serializar'''&lt;br /&gt;
&lt;br /&gt;
http://www.cucuza.com/como-serializar-datos-en-php/&lt;br /&gt;
&lt;br /&gt;
==EXEMPLE CLASSE SERIALIZACIÓN==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class Serializer {&lt;br /&gt;
&lt;br /&gt;
    private static $path = &amp;quot;./database/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    public static function save($obj, $id) {  //$obj es un JSON , $id es el nombre del archivo &lt;br /&gt;
&lt;br /&gt;
        $arr = serialize($obj);&lt;br /&gt;
        &lt;br /&gt;
        return file_put_contents(self::$path . $id, $arr);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static function restore($id) {&lt;br /&gt;
        &lt;br /&gt;
        if  (file_exists ( self::$path . $id ) ){&lt;br /&gt;
            &lt;br /&gt;
            $xmlString = file_get_contents(self::$path . $id);&lt;br /&gt;
            &lt;br /&gt;
            return unserialize($xmlString);  &lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static function showIds(){&lt;br /&gt;
        &lt;br /&gt;
        return array_slice(scandir(self::$path),2);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//al ser una classe estàtica es pot invocar els mètodes de la següent forma, per exemple:&lt;br /&gt;
&lt;br /&gt;
Serializer::save(json,nom_arxiu);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Crear un JSON desde PHP (json_encode)==&lt;br /&gt;
&lt;br /&gt;
Creem un objecte Json a partir de un array en PHP&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$miArray = array(&amp;quot;manzana&amp;quot;=&amp;gt;&amp;quot;verde&amp;quot;, &amp;quot;uva&amp;quot;=&amp;gt;&amp;quot;Morada&amp;quot;, &amp;quot;fresa&amp;quot;=&amp;gt;&amp;quot;roja&amp;quot;);&lt;br /&gt;
print_r(json_encode($miArray));&lt;br /&gt;
&lt;br /&gt;
//resultat que mostrar  {&amp;quot;manzana&amp;quot;:&amp;quot;verde&amp;quot;,&amp;quot;uva&amp;quot;:&amp;quot;Morada&amp;quot;,&amp;quot;fresa&amp;quot;:&amp;quot;roja&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Crear un objeto en PHP con JSON (json_decode)==&lt;br /&gt;
&lt;br /&gt;
Tenim un objecte Json y el transformen a un array de PHP&lt;br /&gt;
exemple 1 un json simple.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsonData = '{ &amp;quot;usuario&amp;quot;:&amp;quot;Julio&amp;quot;, &amp;quot;edad&amp;quot;:30, &amp;quot;comunidad&amp;quot;:&amp;quot;catalunya&amp;quot; }';&lt;br /&gt;
&lt;br /&gt;
$phpArray = json_decode($jsonData);&lt;br /&gt;
&lt;br /&gt;
//print_r($phpArray);&lt;br /&gt;
//stdClass Object ( [usuario] =&amp;gt; Julio [edad] =&amp;gt; 30 [comunidad] =&amp;gt; catalunya ) &lt;br /&gt;
&lt;br /&gt;
//en el cas de volver recorrer l'array mostraría la clau i el valor&lt;br /&gt;
foreach ($phpArray as $key =&amp;gt; $value) { &lt;br /&gt;
    echo &amp;quot;&amp;lt;p&amp;gt;$key | $value&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Altre exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$jsonData = '[{ &amp;quot;usuario&amp;quot;:&amp;quot;Julio&amp;quot;, &amp;quot;edad&amp;quot;:30, &amp;quot;comunidad&amp;quot;:&amp;quot;catalunya&amp;quot; },{ &amp;quot;usuario&amp;quot;:&amp;quot;pepe&amp;quot;, &amp;quot;edad&amp;quot;:28, &amp;quot;comunidad&amp;quot;:&amp;quot;valencia&amp;quot; },{ &amp;quot;usuario&amp;quot;:&amp;quot;pep&amp;quot;, &amp;quot;edad&amp;quot;:23, &amp;quot;comunidad&amp;quot;:&amp;quot;murcia&amp;quot; }]';&lt;br /&gt;
$phpArray = json_decode($jsonData);&lt;br /&gt;
&lt;br /&gt;
//print_r($phpArray);&lt;br /&gt;
/*Array ( [0] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; Julio [edad] =&amp;gt; 30 [comunidad] =&amp;gt; catalunya ) [1] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; pepe [edad] =&amp;gt; 28 [comunidad] =&amp;gt; valencia ) [2] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; pep [edad] =&amp;gt; 23 [comunidad] =&amp;gt; murcia ) ) Julio 30 catalunya pepe 28 valencia pep 23 murcia */&lt;br /&gt;
&lt;br /&gt;
//recorrer un array i mostrar les dades.&lt;br /&gt;
foreach($phpArray as $obj){&lt;br /&gt;
        $id_usuario = $obj-&amp;gt;usuario;&lt;br /&gt;
        $edad = $obj-&amp;gt;edad;&lt;br /&gt;
        $comunidad = $obj-&amp;gt;comunidad;&lt;br /&gt;
        echo $id_usuario.&amp;quot; &amp;quot;.$edad.&amp;quot; &amp;quot;.$comunidad;&lt;br /&gt;
        echo &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//també podem accedir al contingut de la seguüent manera echo &amp;quot;$phparray[0]-&amp;gt;usuario&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENVIAR CORREOS ==&lt;br /&gt;
&lt;br /&gt;
Mediente la función MAIL() de PHP podemos enviar correos, por ello, nuestro servidor deberá tener instalado el servicio.&lt;br /&gt;
En nuestro caso, en nuestro Hosting-ng lo tenemos.&lt;br /&gt;
Existe otra función PHPMailer dónde contiene más opciones. https://github.com/PHPMailer/PHPMailer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Forma simple'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// El mensaje&lt;br /&gt;
$msg = &amp;quot;Estimado alumno de La Mercè\nEstas invitado a participar en  clase&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// usar wordwrap() si las lineas son más largas de 70 caracteres&lt;br /&gt;
$msg = wordwrap($msg,70);&lt;br /&gt;
&lt;br /&gt;
// Enviar mail&lt;br /&gt;
mail(&amp;quot;alguien@ejemplo.cat&amp;quot;,&amp;quot;Mi título&amp;quot;,$msg);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Más opciones'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
    $to = &amp;quot;ejemploPrueba@ejemplo.com&amp;quot;;&lt;br /&gt;
    $subject = &amp;quot;Asunto&amp;quot;;&lt;br /&gt;
    $txt = &amp;quot;Estamos en clase de DAW&amp;quot;;&lt;br /&gt;
    $headers = &amp;quot;From: webmaster@example.com&amp;quot; . &amp;quot;\r\n&amp;quot; .&lt;br /&gt;
        &amp;quot;CC: somebodyelse@example.com&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    mail($to,$subject,$txt,$headers);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' En terminal '''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
//también podemos hacerlo desde el terminal de linux en nuestro servidor&lt;br /&gt;
system('mail -t alguien@ejemplo.cat -s ALTA ALUMNOS INSTI &amp;lt;&amp;lt;&amp;lt; &amp;quot;El alumno&amp;quot;'.$nom.&amp;quot; &amp;quot;.$cognoms.&amp;quot; está en espera de darse de alta&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SUBIR FICHEROS =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// En versiones de PHP anteriores a la 4.1.0, debería utilizarse $HTTP_POST_FILES en lugar&lt;br /&gt;
// de $_FILES.&lt;br /&gt;
&lt;br /&gt;
 //Directori de pujada. Permís d'escriptura i accés per a www-data&lt;br /&gt;
$dir_subida = './';  &lt;br /&gt;
 //Anexem la carpeta amb el nos del finder que ens puja&lt;br /&gt;
$fichero_subido = $dir_subida . basename($_FILES['file']['name']); //basename: muestra el nombre del fichero con la extensión&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Movem el fitxer temporal creat a /tmp a la ubicació o nom indicats&lt;br /&gt;
echo '&amp;lt;pre&amp;gt;';&lt;br /&gt;
if (move_uploaded_file($_FILES['file']['tmp_name'], $fichero_subido)) {    &lt;br /&gt;
    echo &amp;quot;El fichero es válido y se subió con éxito.\n&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;¡Posible ataque de subida de ficheros!\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo 'Más información de depuración:';&lt;br /&gt;
print_r($_FILES);&lt;br /&gt;
&lt;br /&gt;
/*$_FILES['file']['name'] -- original name of the file on the client machine.&lt;br /&gt;
$_FILES['file']['type'] -- mime type of the file, provided by the browser&lt;br /&gt;
$_FILES['file']['size'] -- size (in bytes) of the uploaded file&lt;br /&gt;
$_FILES['file']['tmp_name'] -- temporary filename of the uploaded file, stored on the server&lt;br /&gt;
$_FILES['file']['error'] -- returns an error code, useful for debugging.&lt;br /&gt;
*/&lt;br /&gt;
print &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
 &amp;lt;title&amp;gt; SUBIR FICHEROS &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;!-- El tipo de codificación de datos, enctype, DEBE especificarse como sigue --&amp;gt;&lt;br /&gt;
&amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; action=&amp;quot;index.php&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- MAX_FILE_SIZE debe preceder al campo de entrada del fichero --&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;MAX_FILE_SIZE&amp;quot; value=&amp;quot;30000&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;!-- El nombre del elemento de entrada determina el nombre en el array $_FILES --&amp;gt;&lt;br /&gt;
    Enviar este fichero: &amp;lt;input name=&amp;quot;fichero_usuario&amp;quot; type=&amp;quot;file&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Enviar fichero&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI:'''&lt;br /&gt;
&lt;br /&gt;
Es desitja desenvolupar un formulari on pugui ficar el nom d'usuari i a més pujar un fitxer. Deurà haver una pàgina que mostre tots el fitxers d'eixe Usuari i el nombre d'arxius.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PDF ==&lt;br /&gt;
Podem també generar pdf's a FPDF http://www.fpdf.org/ , però es deurà baixar la llibreria primer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require('fpdf.php');&lt;br /&gt;
&lt;br /&gt;
class PDF extends FPDF&lt;br /&gt;
{&lt;br /&gt;
// Page header&lt;br /&gt;
function Header()&lt;br /&gt;
{&lt;br /&gt;
    // Logo&lt;br /&gt;
    $this-&amp;gt;Image('logo.png',10,6,30);&lt;br /&gt;
    // Arial bold 15&lt;br /&gt;
    $this-&amp;gt;SetFont('Arial','B',15);&lt;br /&gt;
    // Move to the right&lt;br /&gt;
    $this-&amp;gt;Cell(80);&lt;br /&gt;
    // Title&lt;br /&gt;
    $this-&amp;gt;Cell(30,10,'Title',1,0,'C');&lt;br /&gt;
    // Line break&lt;br /&gt;
    $this-&amp;gt;Ln(20);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Page footer&lt;br /&gt;
function Footer()&lt;br /&gt;
{&lt;br /&gt;
    // Position at 1.5 cm from bottom&lt;br /&gt;
    $this-&amp;gt;SetY(-15);&lt;br /&gt;
    // Arial italic 8&lt;br /&gt;
    $this-&amp;gt;SetFont('Arial','I',8);&lt;br /&gt;
    // Page number&lt;br /&gt;
    $this-&amp;gt;Cell(0,10,'Page '.$this-&amp;gt;PageNo().'/{nb}',0,0,'C');&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Instanciation of inherited class&lt;br /&gt;
$pdf = new PDF();&lt;br /&gt;
$pdf-&amp;gt;AliasNbPages();&lt;br /&gt;
$pdf-&amp;gt;AddPage();&lt;br /&gt;
$pdf-&amp;gt;SetFont('Times','',12);&lt;br /&gt;
for($i=1;$i&amp;lt;=40;$i++)&lt;br /&gt;
    $pdf-&amp;gt;Cell(0,10,'Printing line number '.$i,0,1);&lt;br /&gt;
$pdf-&amp;gt;Output();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= QR =&lt;br /&gt;
&lt;br /&gt;
També podem crear codis QR al nostre servidor, hi han moltes libreries tanta en PHP com en JS.&lt;br /&gt;
https://sourceforge.net/projects/phpqrcode/&lt;br /&gt;
&lt;br /&gt;
Es deurà baixar la llibreria i ficar la carpeta &amp;quot;phpqrcode&amp;quot; dins del nostre servidor, a més de introduir el següent codi. &lt;br /&gt;
//'''NOTA''': deureu donar-li permisos d'escriptura a la carpeta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
   // la llibreria s'ha descomprimit dins d'una carpeta anomenada &amp;quot;phpqrcode&amp;quot;&lt;br /&gt;
   include('phpqrcode/qrlib.php');&lt;br /&gt;
   &lt;br /&gt;
   QRcode::png('http://wikiserver.infomerce.es', 'imatgeqr.png');&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
   &amp;lt;img src=&amp;quot;imatgeqr.png&amp;quot; /&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Exercici- Inventario'''&lt;br /&gt;
&lt;br /&gt;
Queremos crear un registro o inventario de los ordenadores, por ellos, queremos generar códigos QR que serán pegatinas para poner en cada uno de los ordenadores de las diferentes aulas, por ello crearemos un formulario donde introduciremos el aula y el ordenador, deben almacenarse en un variable de sesión (ya que no sabemos todavía conectarnos a BD) y cuando cliquemos mostrar deben de aparecer todas los códigos QR del aula.&lt;br /&gt;
También se desea guardarlo en pdf (mirar librerias) con el título y el aula y el codigo QR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CONECTAR CON LDAP o ACTIVE DIRECTORY ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LDAP &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
      //Asigno variables para accesar al servidor LDAP&lt;br /&gt;
   private $conectar;&lt;br /&gt;
   private $host;&lt;br /&gt;
   private $user;&lt;br /&gt;
   private $pswd;&lt;br /&gt;
   private $dn;&lt;br /&gt;
   private $OU;&lt;br /&gt;
   private $DC;&lt;br /&gt;
   private $DC1;&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   public function __construct($user,$password,$ou,$dc,$dc1)&lt;br /&gt;
   {&lt;br /&gt;
    $this-&amp;gt;host= &amp;quot;172.16.208.174&amp;quot;;&lt;br /&gt;
    $this-&amp;gt;user = $user;&lt;br /&gt;
    $this-&amp;gt;pswd = $password;&lt;br /&gt;
    $this-&amp;gt;OU = $ou;&lt;br /&gt;
    $this-&amp;gt;DC = $dc;&lt;br /&gt;
    $this-&amp;gt;DC1 = $dc1;&lt;br /&gt;
    $this-&amp;gt;dn = &amp;quot;OU=&amp;quot;.$ou.&amp;quot;,DC=&amp;quot;.$dc.&amp;quot;,DC=&amp;quot;.$dc1.&amp;quot;&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public function conexion()&lt;br /&gt;
   {&lt;br /&gt;
       $this-&amp;gt;conectar = ldap_connect($this-&amp;gt;host) or die(&amp;quot;Imposible Conectar&amp;quot;);&lt;br /&gt;
     // Especifico la versión del protocolo LDAP&lt;br /&gt;
    ldap_set_option($this-&amp;gt;conectar, LDAP_OPT_PROTOCOL_VERSION, 3)    or die (&amp;quot;Imposible asignar el Protocolo LDAP&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   public function credenciales(){&lt;br /&gt;
   // Valido las credenciales para accesar al servidor LDAP&lt;br /&gt;
    $bd = ldap_bind($this-&amp;gt;conectar, $this-&amp;gt;user, $this-&amp;gt;pswd)    or die (&amp;quot;Imposible Validar en el Servidor LDAP&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    // Especifico los parámetros que quiero que me regrese la consulta&lt;br /&gt;
    $attrs = array(&amp;quot;displayname&amp;quot;,&amp;quot;mail&amp;quot;,&amp;quot;samaccountname&amp;quot;,&amp;quot;telephonenumber&amp;quot;,&amp;quot;givenname&amp;quot;);&lt;br /&gt;
     &lt;br /&gt;
    // Creo el filtro para la busqueda&lt;br /&gt;
    $filter = &amp;quot;(samaccountname=&amp;quot;.$this-&amp;gt;user.&amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    $search = ldap_search($this-&amp;gt;conectar, $this-&amp;gt;dn, $filter, $attrs)    or die (&amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    $entries = ldap_get_entries($this-&amp;gt;conectar, $search);&lt;br /&gt;
&lt;br /&gt;
    return $entries;&lt;br /&gt;
&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CONFIGURACIÓ PHPSTORM =&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:captura1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:captura2.png]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:captura3.png]]&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=15730</id>
		<title>M7 - Desenvolupament web en entorn servidor</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=15730"/>
				<updated>2021-06-09T18:11:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* UF3:  Tècniques d’accés a dades (30h) (NF1-10 / NF2- 20) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== UF1 : Desenvolupament web en entorn servidor (26h) ==&lt;br /&gt;
=== [[NF1 - Llenguatge PHP ]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Llenguatge PHP (35h)]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF2 - Llenguatge JSP (h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF2:  Generació dinàmica de pagines web (36h) (NF1-13h / NF2- 23h) ==&lt;br /&gt;
&lt;br /&gt;
=== [[NF1 - Model Vista Controlador]] ===&lt;br /&gt;
&amp;lt;!--=== [[NF2 - Framework PHP ]] === --&amp;gt;&lt;br /&gt;
&amp;lt;!--=== [[NF2 - Framework PHP Symfony 3 ]] ===--&amp;gt;&lt;br /&gt;
=== [[NF2 - Framework Laravel ]] ===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Model Vista Controlador (10h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP (15h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP Symfony 3 (20h)]] ===&lt;br /&gt;
=== [[NF3 - Framework JSP (15h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF3:  Tècniques d’accés a dades (30h) (NF1-10 / NF2- 20) ==&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;NF1 -Tècniques d’accés a dades (30h)&amp;lt;/span&amp;gt; ===&lt;br /&gt;
[[A1- Accés a BD amb PHP (10h)]]&lt;br /&gt;
&amp;lt;!--[[A2- Framework de capes per a DDBB (20h)]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (30h) (NF1-15h / NF2-15h) ==&lt;br /&gt;
=== [[Serveis Web i Mashups a PHP]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Web Services]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Web Services - SOAP - API]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF1 - Web Services (30h)]] === &lt;br /&gt;
&lt;br /&gt;
=== [[Symfony 4]] ===&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=15729</id>
		<title>M7 - Desenvolupament web en entorn servidor</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M7_-_Desenvolupament_web_en_entorn_servidor&amp;diff=15729"/>
				<updated>2021-06-09T18:11:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* UF3:  Tècniques d’accés a dades (30h) (NF1-10 / NF2- 20) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== UF1 : Desenvolupament web en entorn servidor (26h) ==&lt;br /&gt;
=== [[NF1 - Llenguatge PHP ]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Llenguatge PHP (35h)]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF2 - Llenguatge JSP (h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF2:  Generació dinàmica de pagines web (36h) (NF1-13h / NF2- 23h) ==&lt;br /&gt;
&lt;br /&gt;
=== [[NF1 - Model Vista Controlador]] ===&lt;br /&gt;
&amp;lt;!--=== [[NF2 - Framework PHP ]] === --&amp;gt;&lt;br /&gt;
&amp;lt;!--=== [[NF2 - Framework PHP Symfony 3 ]] ===--&amp;gt;&lt;br /&gt;
=== [[NF2 - Framework Laravel ]] ===&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Model Vista Controlador (10h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP (15h)]] ===&lt;br /&gt;
=== [[NF2 - Framework PHP Symfony 3 (20h)]] ===&lt;br /&gt;
=== [[NF3 - Framework JSP (15h)]] ===--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF3:  Tècniques d’accés a dades (30h) (NF1-10 / NF2- 20) ==&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;NF1 -Tècniques d’accés a dades (30h)&amp;lt;/span&amp;gt; ===&lt;br /&gt;
[[A1- Accés a BD amb PHP (10h)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[A2- Framework de capes per a DDBB (20h)]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UF4: Serveis web. Pàgines dinàmiques interactives. Webs Híbrids (30h) (NF1-15h / NF2-15h) ==&lt;br /&gt;
=== [[Serveis Web i Mashups a PHP]] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== [[NF1 - Web Services]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Web Services - SOAP - API]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[NF1 - Web Services (30h)]] === &lt;br /&gt;
&lt;br /&gt;
=== [[Symfony 4]] ===&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15712</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15712"/>
				<updated>2021-05-14T15:40:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_chat]]&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF3_-_XML_i_JSON&amp;diff=15679</id>
		<title>NF3 - XML i JSON</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF3_-_XML_i_JSON&amp;diff=15679"/>
				<updated>2021-05-04T15:28:04Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Traduïr un XML a JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= JSON =&lt;br /&gt;
JSON (JavaScript Object Notation) és un format d'intercanvi de dades lleuger. És fàcil per als éssers humans a llegir i escriure. És fàcil per a les màquines per analitzar i generar. Es basa en un subconjunt del llenguatge de programació JavaScript, estàndard ECMA-262 3rd Edition -. Desembre 1999 JSON és un format de text que és completament independent del llenguatge però utilitza convencions que són familiars per als programadors de la C-família de llenguatges, incloent C , C + +, C #, Java, JavaScript, Perl, Python, i molts altres. Aquestes propietats fan de JSON un llenguatge ideal-l'intercanvi de dades.&lt;br /&gt;
JSON es basa en dues estructures: &lt;br /&gt;
&lt;br /&gt;
*Una col·lecció de parells nom / valor. En diversos idiomes, això es realitza com un objecte, fitxa, estructura, diccionari, taula hash, llista amb clau, o una matriu associativa. &lt;br /&gt;
*Una llista ordenada de valors. En la majoria dels idiomes, això es realitza en forma de matriu, vector, llista o seqüència. &lt;br /&gt;
Es tracta d'estructures de dades universals. Pràcticament tots els llenguatges de programació moderns els donen suport d'una manera o altra. Té sentit que un format de dades que és intercanviable amb els llenguatges de programació també es basarà en aquestes estructures.&lt;br /&gt;
&lt;br /&gt;
Com que utilitza la sintaxi de JSON amb JavaScript sense necessitat de programari addicional que es necessita per treballar amb JSON en JavaScript. &lt;br /&gt;
&lt;br /&gt;
Exemples de Json&lt;br /&gt;
&lt;br /&gt;
El principi bàsic és amb parells atribut-valor, aquests han d'estar tancats entre claus {,} que és el que defineixen l'inici i la fi de l'objecte.&lt;br /&gt;
&lt;br /&gt;
== Parell Nom/Valor ==&lt;br /&gt;
Generador JSON https://www.json-generator.com/&lt;br /&gt;
&lt;br /&gt;
Les dades en format JSON està escrit en forma de parells nom / valor. &lt;br /&gt;
&lt;br /&gt;
Un parell de nom / valor consisteix en un nom de camp (entre cometes), seguit de dos punts, seguit d'un valor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;firstName&amp;quot; : &amp;quot;John&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això és fàcil d'entendre, i és igual a la instrucció de JavaScript:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firstName = &amp;quot;John&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Valors Json:&lt;br /&gt;
&lt;br /&gt;
*Un nombre (sencer o punt flotant) &lt;br /&gt;
*Una cadena (entre cometes) &lt;br /&gt;
*Booleà (cert o fals) &lt;br /&gt;
*Un conjunt (entre claudàtors) &lt;br /&gt;
*Un objecte (entre claus) &lt;br /&gt;
*nul&lt;br /&gt;
&lt;br /&gt;
==JSON Objects==&lt;br /&gt;
Objectes JSON s'escriuen entre claus, &lt;br /&gt;
&lt;br /&gt;
Els objectes poden contenir diversos parells de noms / valors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;firstName&amp;quot;: &amp;quot;John&amp;quot;,&lt;br /&gt;
  &amp;quot;lastName&amp;quot;: &amp;quot;Doe&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Això també és fàcil d'entendre, i és igual a les sentències de JavaScript:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
firstName = &amp;quot;John&amp;quot;;&lt;br /&gt;
lastName = &amp;quot;Doe&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==JSON Array==&lt;br /&gt;
Arrays JSON s'escriuen entre claudàtors. &lt;br /&gt;
&lt;br /&gt;
Una matriu pot contenir diversos objectes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;profes&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Canela&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Salinas&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En l'exemple anterior, l'objecte &amp;quot;empleats&amp;quot; és una matriu que conté tres objectes. Cada objecte és un registre d'una persona (amb un nom i un cognom).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var profes=[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;firstName&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    &amp;quot;lastName&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;firstName&amp;quot;: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    &amp;quot;lastName&amp;quot;: &amp;quot;Canela&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;firstName&amp;quot;: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    &amp;quot;lastName&amp;quot;: &amp;quot;Salinas&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
profes[0].firstName + &amp;quot; &amp;quot; + profes[0].lastName;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
-------------------&lt;br /&gt;
'''EXEMPLES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
//Ejemplo de JSON para un objeto tipo Persona&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;nombre&amp;quot;:&amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
&amp;quot;edad&amp;quot;:30,&lt;br /&gt;
&amp;quot;nacionalidad&amp;quot;:&amp;quot;Española&amp;quot;,&lt;br /&gt;
&amp;quot;altura&amp;quot;:&amp;quot;182 cm&amp;quot;,&lt;br /&gt;
&amp;quot;peso&amp;quot;:75&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Json amb booleans, nombre, cadenes i un objecte direcció&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;nombre&amp;quot;:&amp;quot;Fulano Probencio&amp;quot;,&lt;br /&gt;
&amp;quot;edad&amp;quot;:27,&lt;br /&gt;
&amp;quot;nacionalidad&amp;quot;:&amp;quot;Chileno&amp;quot;,&lt;br /&gt;
&amp;quot;altura&amp;quot;:&amp;quot;172 cm&amp;quot;,&lt;br /&gt;
&amp;quot;peso&amp;quot;:75,&lt;br /&gt;
&amp;quot;pasatiempos&amp;quot;:[&amp;quot;Polo&amp;quot;,&amp;quot;Cricket&amp;quot;,&amp;quot;Ski&amp;quot;,&amp;quot;Drafting&amp;quot;,&amp;quot;Gaming&amp;quot;],&lt;br /&gt;
&amp;quot;soltero&amp;quot;:true,&lt;br /&gt;
&amp;quot;direccion&amp;quot;:{&lt;br /&gt;
    &amp;quot;calle&amp;quot;:&amp;quot;Ave. Siempre Viva&amp;quot;,&lt;br /&gt;
    &amp;quot;numero&amp;quot;:&amp;quot;123&amp;quot;,&lt;br /&gt;
    &amp;quot;pais&amp;quot;:&amp;quot;México&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un array de objectes persona.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;personas&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;nombre&amp;quot;: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
            &amp;quot;edad&amp;quot;: 30,&lt;br /&gt;
            &amp;quot;nacionalidad&amp;quot;: &amp;quot;Española&amp;quot;,&lt;br /&gt;
            &amp;quot;altura&amp;quot;: &amp;quot;182 cm&amp;quot;,&lt;br /&gt;
            &amp;quot;peso&amp;quot;: 75,&lt;br /&gt;
            &amp;quot;pasatiempos&amp;quot;: [&lt;br /&gt;
                &amp;quot;Polo&amp;quot;,&lt;br /&gt;
                &amp;quot;Cricket&amp;quot;,&lt;br /&gt;
                &amp;quot;Ski&amp;quot;,&lt;br /&gt;
                &amp;quot;Drafting&amp;quot;,&lt;br /&gt;
                &amp;quot;Gaming&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;soltero&amp;quot;: true,&lt;br /&gt;
            &amp;quot;direccion&amp;quot;: {&lt;br /&gt;
                &amp;quot;calle&amp;quot;: &amp;quot;Ave. Siempre Viva&amp;quot;,&lt;br /&gt;
                &amp;quot;numero&amp;quot;: &amp;quot;123&amp;quot;,&lt;br /&gt;
                &amp;quot;pais&amp;quot;: &amp;quot;España&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;nombre&amp;quot;: &amp;quot;Ramón&amp;quot;,&lt;br /&gt;
            &amp;quot;edad&amp;quot;: 22,&lt;br /&gt;
            &amp;quot;nacionalidad&amp;quot;: &amp;quot;Catalana&amp;quot;,&lt;br /&gt;
            &amp;quot;altura&amp;quot;: &amp;quot;178 cm&amp;quot;,&lt;br /&gt;
            &amp;quot;peso&amp;quot;: 72,&lt;br /&gt;
            &amp;quot;pasatiempos&amp;quot;: [&lt;br /&gt;
                &amp;quot;Pintar&amp;quot;,&lt;br /&gt;
                &amp;quot;Programar&amp;quot;,&lt;br /&gt;
                &amp;quot;Scuba Diving&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;soltero&amp;quot;: true,&lt;br /&gt;
            &amp;quot;direccion&amp;quot;: {&lt;br /&gt;
                &amp;quot;calle&amp;quot;: &amp;quot;Ave. Siempre Viva&amp;quot;,&lt;br /&gt;
                &amp;quot;numero&amp;quot;: &amp;quot;123&amp;quot;,&lt;br /&gt;
                &amp;quot;pais&amp;quot;: &amp;quot;Catalana&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;nombre&amp;quot;: &amp;quot;Amiga Pepita&amp;quot;,&lt;br /&gt;
            &amp;quot;edad&amp;quot;: 25,&lt;br /&gt;
            &amp;quot;nacionalidad&amp;quot;: &amp;quot;Cubana&amp;quot;,&lt;br /&gt;
            &amp;quot;altura&amp;quot;: &amp;quot;167 cm&amp;quot;,&lt;br /&gt;
            &amp;quot;peso&amp;quot;: 55,&lt;br /&gt;
            &amp;quot;pasatiempos&amp;quot;: [&lt;br /&gt;
                &amp;quot;Natación&amp;quot;,&lt;br /&gt;
                &amp;quot;Alpinismo&amp;quot;,&lt;br /&gt;
                &amp;quot;Cinéfila&amp;quot;,&lt;br /&gt;
                &amp;quot;Socializar&amp;quot;,&lt;br /&gt;
                &amp;quot;Gaming&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;soltero&amp;quot;: true,&lt;br /&gt;
            &amp;quot;direccion&amp;quot;: {&lt;br /&gt;
                &amp;quot;calle&amp;quot;: &amp;quot;Cerro del Estudiante&amp;quot;,&lt;br /&gt;
                &amp;quot;numero&amp;quot;: &amp;quot;456&amp;quot;,&lt;br /&gt;
                &amp;quot;pais&amp;quot;: &amp;quot;Argentina&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
-----------------------------------------------------------&lt;br /&gt;
Exemple 1 :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;employees&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Canela&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Salinas&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple 2 :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
var JSONObject={&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;John Johnson&amp;quot;,&lt;br /&gt;
  &amp;quot;street&amp;quot;: &amp;quot;Oslo West 555&amp;quot;,&lt;br /&gt;
  &amp;quot;age&amp;quot;: 33,&lt;br /&gt;
  &amp;quot;phone&amp;quot;: &amp;quot;555 1234567&amp;quot;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
document.getElementById(&amp;quot;jname&amp;quot;).innerHTML=JSONObject.name;&lt;br /&gt;
document.getElementById(&amp;quot;jage&amp;quot;).innerHTML=JSONObject.age;&lt;br /&gt;
document.getElementById(&amp;quot;jstreet&amp;quot;).innerHTML=JSONObject.street;&lt;br /&gt;
document.getElementById(&amp;quot;jphone&amp;quot;).innerHTML=JSONObject.phone;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Validadors de json'''&lt;br /&gt;
&lt;br /&gt;
http://jsonviewer.stack.hu/&lt;br /&gt;
&lt;br /&gt;
http://jsonlint.com/&lt;br /&gt;
&lt;br /&gt;
==La conversió d'un text JSON a un objecte JavaScript==&lt;br /&gt;
&lt;br /&gt;
'''NO RECOMENDADO'''&lt;br /&gt;
&lt;br /&gt;
http://www.etnassoft.com/2011/01/05/javascript-eval-uso-y-alternativas/&lt;br /&gt;
&lt;br /&gt;
Crear una cadena de JavaScript que conté la sintaxi de JSON:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var txt = '{ &amp;quot;employees&amp;quot; : [' +&lt;br /&gt;
'{ &amp;quot;firstName&amp;quot;:&amp;quot;John&amp;quot; , &amp;quot;lastName&amp;quot;:&amp;quot;Doe&amp;quot; },' +&lt;br /&gt;
'{ &amp;quot;firstName&amp;quot;:&amp;quot;Anna&amp;quot; , &amp;quot;lastName&amp;quot;:&amp;quot;Smith&amp;quot; },' +&lt;br /&gt;
'{ &amp;quot;firstName&amp;quot;:&amp;quot;Peter&amp;quot; , &amp;quot;lastName&amp;quot;:&amp;quot;Jones&amp;quot; } ]}';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La sintaxi JSON és un subconjunt de la sintaxi de JavaScript, la funció eval () de JavaScript es pot utilitzar per convertir un text JSON en un objecte de JavaScript. &lt;br /&gt;
&lt;br /&gt;
La funció eval () utilitza el compilador de JavaScript que analitzar el text JSON i produeix un objecte de JavaScript. El text ha de ser embolicat amb parèntesi per evitar un error de sintaxi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var obj = eval (&amp;quot;(&amp;quot; + txt + &amp;quot;)&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
First Name: &amp;lt;span id=&amp;quot;fname&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
Last Name: &amp;lt;span id=&amp;quot;lname&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;fname&amp;quot;).innerHTML = obj.employees[1].firstName;&lt;br /&gt;
document.getElementById(&amp;quot;lname&amp;quot;).innerHTML = obj.employees[1].lastName; &lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
És més segur utilitzar un analitzador JSON per a convertir un text JSON en un objecte de JavaScript. Un analitzador JSON reconeixerà només text JSON i no compilar scripts. &lt;br /&gt;
&lt;br /&gt;
En els navegadors que donen suport JSON natiu, analitzadors JSON són també més ràpid. &lt;br /&gt;
&lt;br /&gt;
Suport JSON nadiu està inclòs en tots els principals navegadors i en l'últim estàndard ECMAScript (JavaScript).&lt;br /&gt;
&lt;br /&gt;
== JAVASCRIPT &amp;amp; JSON ==&lt;br /&gt;
&lt;br /&gt;
=== Analitzar text JSON i convertir-lo en un objecte (JAVASCRIPT)===&lt;br /&gt;
*Es pot fer amb la llibreria nativa de JSON per javascript (Javascript)&lt;br /&gt;
*la llibreria tracta una cadena de text i el transforma com a objecte JSON&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var myObject = JSON.parse('{ &amp;quot;name&amp;quot;: &amp;quot;John&amp;quot; }');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://www.w3schools.com/js/js_json_parse.asp&lt;br /&gt;
&lt;br /&gt;
=== Donat un objecte JSON converti-lo en Text ===&lt;br /&gt;
&lt;br /&gt;
* Transforma tot el contingut de un objecte Json a string&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var myJSONText = JSON.stringify(myObject);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Més informació a https://www.w3schools.com/js/js_json_stringify.asp&lt;br /&gt;
&lt;br /&gt;
== PHP &amp;amp; JSON ==&lt;br /&gt;
A PHP s'utilitzen dos funcions per manipular JSON: json_encode i json_decode. A la següent Web trobareu com utilitzar-les: http://www.php.net/manual/es/function.json-decode.php&lt;br /&gt;
&lt;br /&gt;
'''LLegir i escriure  Fitxer desde PHP '''&lt;br /&gt;
&lt;br /&gt;
Si volem llegir un fitxer .json haurem d'utilitzar la instrucció &amp;quot;file_get_contents&amp;quot;. Les dades que obtinguis d'aquesta funció, els hauràs de guardar en una variable qualsevol&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$ json = file_get_contents (&amp;quot;./datos.json&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Guarda información dentro de un fichero, en este caso un JSON&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$json_string1 = {&amp;quot;posicionX&amp;quot;:250,&amp;quot;posicionY&amp;quot;:100}&lt;br /&gt;
file_put_contents('./datos.json', $json_string1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Crear un JSON desde PHP (json_encode)'''&lt;br /&gt;
&lt;br /&gt;
Creem un objecte Json a partir de un array en PHP&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$miArray = array(&amp;quot;manzana&amp;quot;=&amp;gt;&amp;quot;verde&amp;quot;, &amp;quot;uva&amp;quot;=&amp;gt;&amp;quot;Morada&amp;quot;, &amp;quot;fresa&amp;quot;=&amp;gt;&amp;quot;roja&amp;quot;);&lt;br /&gt;
print_r(json_encode($miArray));&lt;br /&gt;
&lt;br /&gt;
//resultat que mostrar  {&amp;quot;manzana&amp;quot;:&amp;quot;verde&amp;quot;,&amp;quot;uva&amp;quot;:&amp;quot;Morada&amp;quot;,&amp;quot;fresa&amp;quot;:&amp;quot;roja&amp;quot;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Crear un objeto en PHP con JSON (json_decode)'''&lt;br /&gt;
&lt;br /&gt;
Tenim un objecte Json y el transformen a un array de PHP&lt;br /&gt;
exemple 1 un json simple.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsonData = '{ &amp;quot;usuario&amp;quot;:&amp;quot;Julio&amp;quot;, &amp;quot;edad&amp;quot;:30, &amp;quot;comunidad&amp;quot;:&amp;quot;catalunya&amp;quot; }';&lt;br /&gt;
&lt;br /&gt;
$phpArray = json_decode($jsonData);&lt;br /&gt;
&lt;br /&gt;
//print_r($phpArray);&lt;br /&gt;
//stdClass Object ( [usuario] =&amp;gt; Julio [edad] =&amp;gt; 30 [comunidad] =&amp;gt; catalunya ) &lt;br /&gt;
&lt;br /&gt;
//en el cas de volver recorrer l'array mostraría la clau i el valor&lt;br /&gt;
foreach ($phpArray as $key =&amp;gt; $value) { &lt;br /&gt;
    echo &amp;quot;&amp;lt;p&amp;gt;$key | $value&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;php&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Altre exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$jsonData = '[{ &amp;quot;usuario&amp;quot;:&amp;quot;Julio&amp;quot;, &amp;quot;edad&amp;quot;:30, &amp;quot;comunidad&amp;quot;:&amp;quot;catalunya&amp;quot; },{ &amp;quot;usuario&amp;quot;:&amp;quot;pepe&amp;quot;, &amp;quot;edad&amp;quot;:28, &amp;quot;comunidad&amp;quot;:&amp;quot;valencia&amp;quot; },{ &amp;quot;usuario&amp;quot;:&amp;quot;pep&amp;quot;, &amp;quot;edad&amp;quot;:23, &amp;quot;comunidad&amp;quot;:&amp;quot;murcia&amp;quot; }]';&lt;br /&gt;
$phpArray = json_decode($jsonData);&lt;br /&gt;
&lt;br /&gt;
//print_r($phpArray);&lt;br /&gt;
/*Array ( [0] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; Julio [edad] =&amp;gt; 30 [comunidad] =&amp;gt; catalunya ) [1] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; pepe [edad] =&amp;gt; 28 [comunidad] =&amp;gt; valencia ) [2] =&amp;gt; stdClass Object ( [usuario] =&amp;gt; pep [edad] =&amp;gt; 23 [comunidad] =&amp;gt; murcia ) ) Julio 30 catalunya pepe 28 valencia pep 23 murcia */&lt;br /&gt;
&lt;br /&gt;
//recorrer un array i mostrar les dades.&lt;br /&gt;
foreach($phpArray as $obj){&lt;br /&gt;
        $id_usuario = $obj-&amp;gt;usuario;&lt;br /&gt;
        $edad = $obj-&amp;gt;edad;&lt;br /&gt;
        $comunidad = $obj-&amp;gt;comunidad;&lt;br /&gt;
        echo $id_usuario.&amp;quot; &amp;quot;.$edad.&amp;quot; &amp;quot;.$comunidad;&lt;br /&gt;
        echo &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//també podem accedir al contingut de la seguüent manera echo &amp;quot;$phparray[0]-&amp;gt;usuario&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== jQuery &amp;amp; JSON ==&lt;br /&gt;
=== Analitzar text JSON i convertir-lo en un objecte (JQUERY)===&lt;br /&gt;
* Es pot fer amb la funció Jquery.parse(): rep una cadena JSON ben formatada i retorna l'objecte JavaScript resultant. (JQuery)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var obj = jQuery.parseJSON( '{ &amp;quot;name&amp;quot;: &amp;quot;John&amp;quot; }' );&lt;br /&gt;
alert( obj.name === &amp;quot;John&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://api.jquery.com/jQuery.parseJSON/&lt;br /&gt;
&lt;br /&gt;
=== LLegir dades des de un fitxer JSON (JQUERY)===&lt;br /&gt;
Supossem que tenim un fitxer anonenat dades.json i el volem llegir amb Javascript.&lt;br /&gt;
Fitxer dades.json :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;users&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;Ray&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Villalobos&amp;quot;,&lt;br /&gt;
      &amp;quot;joined&amp;quot;: {&lt;br /&gt;
        &amp;quot;month&amp;quot;: &amp;quot;January&amp;quot;,&lt;br /&gt;
        &amp;quot;day&amp;quot;: 12,&lt;br /&gt;
        &amp;quot;year&amp;quot;: 2012&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;firstName&amp;quot;: &amp;quot;John&amp;quot;,&lt;br /&gt;
      &amp;quot;lastName&amp;quot;: &amp;quot;Jones&amp;quot;,&lt;br /&gt;
      &amp;quot;joined&amp;quot;: {&lt;br /&gt;
        &amp;quot;month&amp;quot;: &amp;quot;April&amp;quot;,&lt;br /&gt;
        &amp;quot;day&amp;quot;: 28,&lt;br /&gt;
        &amp;quot;year&amp;quot;: 2010&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S'utilitza la funcion getJSON de jQuery:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;jquery&amp;quot;&amp;gt;&lt;br /&gt;
$.getJSON('files/data.json', function(data) {&lt;br /&gt;
        var output=&amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
        for (var i=0;i&amp;lt;data.users.length;i++) {&lt;br /&gt;
            output+=&amp;quot;&amp;lt;li&amp;gt;&amp;quot; + data.users[i].firstName + &amp;quot; &amp;quot; + data.users[i].lastName + &amp;quot;--&amp;quot; + data.users[i].joined.month+&amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        output+=&amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
        document.getElementById(&amp;quot;placeholder&amp;quot;).innerHTML=output;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ens mostrará en pantalla&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
   * Ray Villalobos--January&lt;br /&gt;
   * John Jones--April&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enviar un objecte JSON amb $.ajax() (JQUERY) ===&lt;br /&gt;
Exemple 1:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
        url: hb_base_url + &amp;quot;consumer&amp;quot;,&lt;br /&gt;
        contentType: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;
        data: JSON.stringify({&lt;br /&gt;
            first_name: $(&amp;quot;#namec&amp;quot;).val(),&lt;br /&gt;
            last_name: $(&amp;quot;#surnamec&amp;quot;).val(),&lt;br /&gt;
            email: $(&amp;quot;#emailc&amp;quot;).val(),&lt;br /&gt;
            mobile: $(&amp;quot;#numberc&amp;quot;).val(),&lt;br /&gt;
            password: $(&amp;quot;#passwordc&amp;quot;).val()&lt;br /&gt;
        }),&lt;br /&gt;
        success: function(response) {&lt;br /&gt;
            console.log(response);&lt;br /&gt;
        },&lt;br /&gt;
        error: function(response) {&lt;br /&gt;
            console.log(response);&lt;br /&gt;
        }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemple 2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var obj = {};&lt;br /&gt;
&lt;br /&gt;
obj.first_name = $(&amp;quot;#namec&amp;quot;).val();&lt;br /&gt;
obj.last_name = $(&amp;quot;#surnamec&amp;quot;).val();&lt;br /&gt;
obj.email = $(&amp;quot;#emailc&amp;quot;).val();&lt;br /&gt;
obj.mobile = $(&amp;quot;#numberc&amp;quot;).val();&lt;br /&gt;
obj.password = $(&amp;quot;#passwordc&amp;quot;).val();&lt;br /&gt;
&lt;br /&gt;
$.ajax({&lt;br /&gt;
        type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
        url: hb_base_url + &amp;quot;consumer&amp;quot;,&lt;br /&gt;
        contentType: &amp;quot;application/json&amp;quot;,&lt;br /&gt;
        dataType: &amp;quot;json&amp;quot;,&lt;br /&gt;
        data: JSON.stringify(obj),&lt;br /&gt;
        success: function(response) {&lt;br /&gt;
            console.log(response);&lt;br /&gt;
        },&lt;br /&gt;
        error: function(response) {&lt;br /&gt;
            console.log(response);&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple 3:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    var parametros = {&lt;br /&gt;
                &amp;quot;valorCaja1&amp;quot; : valorCaja1,&lt;br /&gt;
                &amp;quot;valorCaja2&amp;quot; : valorCaja2&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        $.ajax({&lt;br /&gt;
                data:  parametros,&lt;br /&gt;
                url:   'ejemplo_ajax_proceso.php',&lt;br /&gt;
                type:  'post',&lt;br /&gt;
                beforeSend: function () {&lt;br /&gt;
                        $(&amp;quot;#resultado&amp;quot;).html(&amp;quot;Procesando, espere por favor...&amp;quot;);&lt;br /&gt;
                },&lt;br /&gt;
                success:  function (response) {&lt;br /&gt;
                        $(&amp;quot;#resultado&amp;quot;).html(response);&lt;br /&gt;
                }&lt;br /&gt;
        });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Traduïr un XML a JSON =&lt;br /&gt;
En el següent enllaç podem veure que els fitxers XML es poden traduir a sintaxi JSON. Tanmateix, quan els fitxers XML es compliquen, el seu equivalent JSON passa a ser bastant difícil de llegir i interpretar:&lt;br /&gt;
http://www.utilities-online.info/xmltojson/#.WjqMa2fWxMw&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== EXERCICIS ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
1.a)Es tracta de crear una aplicació que rep com paràmetre en un input una ciutat i després es realitza una consulta php a l'adreça &amp;quot;http://api.openweathermap.org/data/2.5/weather?q=&amp;quot; que haurà d'analitzar la informació dins del php i retornar html  &lt;br /&gt;
&lt;br /&gt;
(exemple echo &amp;quot;&amp;lt;b&amp;gt;Presión: &amp;lt;/b&amp;gt;&amp;quot;. $presion.&amp;quot;&amp;lt;br&amp;gt;&amp;quot; ;)&lt;br /&gt;
&lt;br /&gt;
*Exemple, d'utilització &lt;br /&gt;
&lt;br /&gt;
http://neftali.clubdelphi.com/hablando-del-tiempo-openweathermap-12/&lt;br /&gt;
&lt;br /&gt;
http://api.openweathermap.org/data/2.5/find?&amp;amp;q=Barcelona,es&amp;amp;lang=es&amp;amp;units=metric&amp;amp;APPID=278857e8dee51f914026df21d0d40c19&amp;quot;&lt;br /&gt;
*Para cargar, una página dentro del php &amp;quot;$html = file_get_contents(url)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
1.b) Es vol retornar el json del temps al client.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_temps]]&lt;br /&gt;
&lt;br /&gt;
2. Tenim un fitxer Json al servidor, volem carregar aquest fitxer i treballar amb la seua informació. &lt;br /&gt;
&lt;br /&gt;
http://www.cristalab.com/tutoriales/leer-json-con-javascript-y-php-c104372l/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Se desea hacer un cuadrado de 100 x 100 px que se vaya desplazando en función de las teclas que se presionen (arriba abajo derecha izquierda)....&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15678</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15678"/>
				<updated>2021-05-04T15:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15677</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15677"/>
				<updated>2021-05-04T15:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_chat]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15625</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15625"/>
				<updated>2021-04-27T15:38:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Formulari */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15624</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15624"/>
				<updated>2021-04-27T15:38:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Taula Multiplicar I */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15623</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15623"/>
				<updated>2021-04-27T15:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Taula Multiplicar II */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15622</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15622"/>
				<updated>2021-04-27T15:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Missatge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15621</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15621"/>
				<updated>2021-04-27T15:37:44Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Suma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15579</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15579"/>
				<updated>2021-04-22T09:09:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* CRUD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===GENERAR CRUD AUTOMÁTICAMENTE===&lt;br /&gt;
&lt;br /&gt;
https://github.com/awais-vteams/laravel-crud-generator&lt;br /&gt;
&lt;br /&gt;
https://github.com/appzcoder/crud-generator&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración. Hay que tener instalado el git y el ssh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
//git config --global user.email &amp;quot;correo@correo.com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15578</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15578"/>
				<updated>2021-04-22T09:09:00Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* CRUD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''GENERAR CRUD AUTOMÁTICAMENTE'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/awais-vteams/laravel-crud-generator&lt;br /&gt;
&lt;br /&gt;
https://github.com/appzcoder/crud-generator&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración. Hay que tener instalado el git y el ssh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
//git config --global user.email &amp;quot;correo@correo.com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15575</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15575"/>
				<updated>2021-04-21T17:59:15Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración. Hay que tener instalado el git y el ssh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
//git config --global user.email &amp;quot;correo@correo.com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15555</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15555"/>
				<updated>2021-04-21T13:59:39Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* DOCUMENTAR API SWAGGER */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/nusoap/client.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
  //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($cliente-&amp;gt;fault) { &lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
             echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            //echo 'Error:  ' . $cliente-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*************GET*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
/*************DELETE*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************PUT*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
/*************POST*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API SWAGGER ===&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete swagger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer require &amp;quot;darkaonline/l5-swagger:6.*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete para las anotaciones que va relacionado&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
publicamos la vista y configuración del paquete&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --provider &amp;quot;L5Swagger\L5SwaggerServiceProvider&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
podemos comprobar cómo han quedado las rutas y vemos que ha añadido &amp;quot;api/documentation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan route:list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
luego añadimos las anotaciones antes de cada función&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
@OA\Info&lt;br /&gt;
@OA\License&lt;br /&gt;
@OA\Tag&lt;br /&gt;
@OA\Server&lt;br /&gt;
@OA\SecurityScheme&lt;br /&gt;
@OA\RequestBody&lt;br /&gt;
@OA\Property&lt;br /&gt;
@OA\Get&lt;br /&gt;
@OA\Post&lt;br /&gt;
@OA\Put&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://zircote.github.io/swagger-php/Getting-started.html#write-annotations&lt;br /&gt;
&lt;br /&gt;
y generamos &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan l5-swagger:generate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15553</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15553"/>
				<updated>2021-04-20T16:16:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_chat]]&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15552</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15552"/>
				<updated>2021-04-20T15:48:07Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* DOCUMENTAR API SWAGGER */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/nusoap/client.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
  //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($cliente-&amp;gt;fault) { &lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
             echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            //echo 'Error:  ' . $cliente-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*************GET*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
/*************DELETE*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************PUT*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
/*************POST*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API SWAGGER ===&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete swagger&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer require &amp;quot;darkaonline/l5-swagger:6.*&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete para las anotaciones que va relacionado&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
publicamos la vista y configuración del paquete&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --provider &amp;quot;L5Swagger\L5SwaggerServiceProvider&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
podemos comprobar cómo han quedado las rutas y vemos que ha añadido &amp;quot;api/documentation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan route:list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
luego añadimos las anotaciones antes de cada función&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
@OA\Info&lt;br /&gt;
@OA\License&lt;br /&gt;
@OA\Tag&lt;br /&gt;
@OA\Server&lt;br /&gt;
@OA\SecurityScheme&lt;br /&gt;
@OA\RequestBody&lt;br /&gt;
@OA\Property&lt;br /&gt;
@OA\Get&lt;br /&gt;
@OA\Post&lt;br /&gt;
@OA\Put&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y generamos &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan l5-swagger:generate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15551</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15551"/>
				<updated>2021-04-20T15:25:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15550</id>
		<title>JQUERY - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY_-_AJAX&amp;diff=15550"/>
				<updated>2021-04-20T15:25:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Suma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Jquery i AJAX ==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/yzhdVgxJbrQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
jQuery soporta AJAX permetent abstraer les diferencies que poden existir entre els navegadors. Els mètodes que podem utilitzar son:&lt;br /&gt;
*$.get()&lt;br /&gt;
*$.getScript()&lt;br /&gt;
*$.getJSON()&lt;br /&gt;
*$.post()&lt;br /&gt;
*$.load()&lt;br /&gt;
Però tots ells estan basats en el mètode:&lt;br /&gt;
*$.ajax()&lt;br /&gt;
=== $.ajax() ===&lt;br /&gt;
El mètode $.ajax és configurat a través d'un objecte, el qual conté totes les instruccions que necessita jQuery per completar la petició. Aquest mètode és particularment útil a causa que ofereix la possibilitat d'especificar accions en cas que la petició hagi fallat o no. A més, en estar configurat a través d'un objecte, és possible definir les seves propietats de forma separada, fent que sigui més fàcil la reutilització del codi. Pot visitar http://api.jquery.com/jquery.ajax/ per consultar la documentació sobre les opcions disponibles en el mètode.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
        // la URL de la petició&lt;br /&gt;
        url : 'post.php',&lt;br /&gt;
    &lt;br /&gt;
        //informació a enviar&lt;br /&gt;
        // (també es posible utilitzar una cadena de dades)&lt;br /&gt;
        data : { id : 123 },&lt;br /&gt;
    &lt;br /&gt;
        // especificar si será una petició POST o GET&lt;br /&gt;
        type : 'GET',&lt;br /&gt;
    &lt;br /&gt;
        // el tipus d'informació que s'espera de resposta&lt;br /&gt;
        dataType : 'json',&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició es satisfactoria;&lt;br /&gt;
        // la resposta es pasada com argument a la funció&lt;br /&gt;
        success : function(json) {&lt;br /&gt;
            $('h1').text(json);&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar si la petició falla;&lt;br /&gt;
        // en pasen com arguments a la funció&lt;br /&gt;
        // l'objete jqXHR (extensió de XMLHttpRequest), un text amb l'estat&lt;br /&gt;
        // de la petició i un text amb la descripció del error que hagi donat el servidor&lt;br /&gt;
        error : function(jqXHR, status, error) {&lt;br /&gt;
            alert('hi ha un problema');&lt;br /&gt;
        },&lt;br /&gt;
    &lt;br /&gt;
        // codi a executar sense importar si la petició va fallar o no&lt;br /&gt;
        complete : function(jqXHR, status) {&lt;br /&gt;
            alert('Petición realizada');&lt;br /&gt;
        }&lt;br /&gt;
    }); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
El mètode $.ajax posseeix moltes '''opcions de configuració''', i és justament aquesta característica la que fa que sigui un mètode molt útil. Per a una llista completa de les opcions disponibles, pot consultar http://api.jquery.com/jquery.ajax/; a continuació es mostren les més comunes:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Opcions&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| async || Estableix si la petició serà asíncrona o no. De forma predeterminada el valor és true. Ha de tenir en compte que si l'opció s'estableix en false, la petició bloquejarà l'execució d'altres codis fins que aquesta petició hagi finalitzat.&lt;br /&gt;
|-&lt;br /&gt;
| jqXHR || es un objeto jqXHR que contiene todos los datos de la solicitud Ajax realizada, incluyendo la propiedad jqXHR.status que contiene, entre otros posibles, el código de estado HTTP de la respuesta.&lt;br /&gt;
|-&lt;br /&gt;
| textStatus || texto que describe el tipo de error, que puede ser, además de null, “abort”, “timeout”, “No Transport” o &amp;quot;parseerror&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| errorThrown || si hay un error HTTP, errorThrown contiene el texto de la cabecera HTTP de estado. Por ejemplo, para un error HTTP 404, errorThrown es “Not found”; para error un HTTP 500 es “Internal Server Error”.&lt;br /&gt;
|-&lt;br /&gt;
| beforeSend || una funció que s'ha d'executar abans de l'enviament de la consulta.Això permet modificar l'objecte XMLHttpRequest abans que s'enviï per especificar, per exemple, encapçalats HTTP personalitzats.&lt;br /&gt;
|-&lt;br /&gt;
| cache || Estableix si la petició serà guardada en la cache del navegador. De forma predeterminada és true para tots els dataType excepte para “script” i “jsonp”. Quan posseeix el valor false, s'agrega una cadena de caràcters anti-cache al final de la URL de la petició.&lt;br /&gt;
|-&lt;br /&gt;
| complete || Estableix una funció de devolució de trucada que s'executa quan la petició aquesta completa, encara que hagi fallat o no. La funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest) i un text especificant l'estatus de la mateixa petició (success, notmodified, error, timeout, abort, o parsererror).&lt;br /&gt;
|-&lt;br /&gt;
| context || Estableix l'abast en què la/les funcionis de devolució de trucada s'executessin (per exemple, defineix el significat de this dins de les funcions). De manera predeterminada this fa referència a l'objecte originalment passat al mètode $.ajax.&lt;br /&gt;
|-&lt;br /&gt;
| data  || Estableix la informació que s'enviarà al servidor. Aquesta pot ser tant un objecte com una cadena de dades (per exemple foo=bar&amp;amp;baz=bim.)&lt;br /&gt;
|-&lt;br /&gt;
| dataType || una cadena de caracteres que especifica el formato de los datos que se enviarán por el servidor (xml, html, json o script). Si no se especifica nada, jQuery usa el tipo MIME para determinar el formato adecuado: responseXML o ResponseText . Los tipos disponibles son:&lt;br /&gt;
*xml: devuelve un documento XML que podrá tratarse con jQuery.&lt;br /&gt;
*html: devuelve código Html en formato texto.&lt;br /&gt;
*script: evalúa la respuesta en JavaScript y la devuelve en formato texto.&lt;br /&gt;
*json: evalúa la respuesta en JSON y devuelve un objeto JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| error || Estableix una funció de devolució de trucada (CALLBACK) a executar si resulta algun error en la petició. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició (timeout, error, abort, o parsererror) i un text amb la descripció de l'error que hagi enviat el servidor (per exemple Not Found o Internal Server Error).&lt;br /&gt;
|-&lt;br /&gt;
|jsonp || Estableix el nom de la funció de devolució de trucada a enviar quan es realitza una petició JSONP. &lt;br /&gt;
|-&lt;br /&gt;
| succes || Estableix una funció a executar si la petició a estat satisfactòria. Aquesta funció rep com a arguments l'objecte jqXHR (en versions anteriors o iguals a jQuery 1.4, rep en el seu lloc l'objecte de la petició en cru XMLHTTPRequest), un text especificant l'estatus de la mateixa petició i la informació de la petició (convertida a objecte Javascript en el cas que dataType sigui JSON), l'estatus de la mateixa.&lt;br /&gt;
|-&lt;br /&gt;
|timeout || Estableix un temps en mil·lisegons per considerar a una petició com fallada&lt;br /&gt;
|-&lt;br /&gt;
| traditional || Si el seu valor és true, s'utilitza l'estil de serialización de dades utilitzat abans de jQuery 1.4. Per a més detalls pot visitar http://api.jquery.com/jquery.param/.&lt;br /&gt;
|-&lt;br /&gt;
|type || una cadena de caràcters que defineix el mètode HTTP que es va a utilitzar per la consulta (GET o POST). El valor per defecte és GET. Es poden usar altres mètodes d'enviament HTTP, com PUT o DELETE, però no estan suportats per tots els navegadors.&lt;br /&gt;
|-&lt;br /&gt;
|url || Estableix la URL on es realitza la petició. L'opció url és obligatòria per al mètode $.ajax;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dreceres ===&lt;br /&gt;
Addicionalment a la funció AJAX, jQuery proveeix altres funcions per a usos més específics i estalviar-nos escriure unes quantes línies de codi:&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_get $.get]'''&lt;br /&gt;
Realitza una petició GET a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.get(&amp;quot;./datos.php?name=julio&amp;amp;city=valencia&amp;quot;, function (data, status) {&lt;br /&gt;
                    alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; + status);&lt;br /&gt;
                });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_GET[&amp;quot;name&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;city&amp;quot;])){&lt;br /&gt;
    $nom = $_GET[&amp;quot;name&amp;quot;];&lt;br /&gt;
    $cit = $_GET[&amp;quot;city&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post $.post]'''&lt;br /&gt;
Realitza una petició POST a una URL proveïda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.post(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                        nom: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                        ciutat: &amp;quot;Valencia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    function (data, status) {&lt;br /&gt;
                        alert(&amp;quot;Data: &amp;quot; + data + &amp;quot;\nStatus: &amp;quot; +   status); //data muestra los datos recibidos y muestra el estado &lt;br /&gt;
                    });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//dades.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
if(isset($_POST[&amp;quot;nom&amp;quot;]) &amp;amp;&amp;amp; isset($_POST[&amp;quot;ciutat&amp;quot;])){&lt;br /&gt;
    $nom = $_POST[&amp;quot;nom&amp;quot;];&lt;br /&gt;
    $cit = $_POST[&amp;quot;ciutat&amp;quot;];&lt;br /&gt;
    echo $nom .  $cit;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;ERROR&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getScript'''&lt;br /&gt;
Afegeix un script a la pàgina.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getScript(&amp;quot;demo_ajax_script.js&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//una altra forma&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
$.getScript('/static/js/myScript.js', function() {&lt;br /&gt;
        functionFromMyScript();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''$.getJSON'''&lt;br /&gt;
&lt;br /&gt;
Realitza una petició GET a una URL proveïda i espera que una dada JSON ''sigui retornat''.&lt;br /&gt;
&lt;br /&gt;
            '''$.getJSON([url], [parámetres], [funció que rep les dades])'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes han de tenir els següents arguments, en ordre:&lt;br /&gt;
&lt;br /&gt;
*''url''&lt;br /&gt;
&lt;br /&gt;
La URL on es realitzarà la petició. El seu valor és obligatori.&lt;br /&gt;
&lt;br /&gt;
*''parámetres''&lt;br /&gt;
&lt;br /&gt;
La informació que s'enviarà al servidor. El seu valor és opcional i pot ser tant un objecte com una cadena de dades (com foo=bar&amp;amp;baz=bim).&lt;br /&gt;
&lt;br /&gt;
Nota: Aquesta opció no és correcte per al mètode $.getScript.&lt;br /&gt;
&lt;br /&gt;
*''success callback''&lt;br /&gt;
&lt;br /&gt;
Una funció opcional que s'executa en cas que petició hagi estat satisfactòria. Aquesta funció rep com a arguments la informació de la petició i l'objecte en brut d'aquesta petició.&lt;br /&gt;
&lt;br /&gt;
*''data type''&lt;br /&gt;
&lt;br /&gt;
El tipus de dada que s'espera rebre des del servidor. El seu valor és opcional.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
Aquesta opció és solament aplicable per a mètodes en què no està especificat el tipus de dada en el nom del mateix mètode.&lt;br /&gt;
Exemples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function () {&lt;br /&gt;
                $.getJSON(&amp;quot;datos.php&amp;quot;, {&lt;br /&gt;
                    &amp;quot;nombre&amp;quot;: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
                    &amp;quot;apellido&amp;quot;: &amp;quot;Noguera&amp;quot;&lt;br /&gt;
                })&lt;br /&gt;
                .done(function (data, textStatus, jqXHR) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;La solicitud se ha completado correctamente.&amp;quot;);&lt;br /&gt;
                        console.log(data);  //devuelve objeto del servidor&lt;br /&gt;
                        console.log(textStatus);    //devuelve 'success'&lt;br /&gt;
                        console.log(jqXHR);   //objeto AJAX&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .fail(function (jqXHR, textStatus, errorThrown) {&lt;br /&gt;
                    if (console &amp;amp;&amp;amp; console.log) {&lt;br /&gt;
                        console.log(&amp;quot;ha fallado&amp;quot; + textStatus);&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source &amp;gt;&lt;br /&gt;
&lt;br /&gt;
//datos.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$jsondata = array();&lt;br /&gt;
&lt;br /&gt;
if( isset($_GET['nombre']) ) {&lt;br /&gt;
&lt;br /&gt;
    if( $_GET['nombre'] == 'julio' ) {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = true;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido es correcto.';&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        $jsondata['success'] = false;&lt;br /&gt;
        $jsondata['message'] = 'Hola! El valor recibido no es correcto.';&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Aunque el content-type no sea un problema en la mayoría de casos, es recomendable especificarlo&lt;br /&gt;
    header('Content-type: application/json; charset=utf-8');&lt;br /&gt;
    echo json_encode($jsondata);&lt;br /&gt;
    exit();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_load $.load()] ===&lt;br /&gt;
El mètode $(selector).load() és l'únic que es pot cridar des d'una selecció. Aquest mètode obté el codi HTML d'una URL i als elements seleccionats els modifica amb la informació obtinguda. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;ejemplo.html #p1&amp;quot;);      //carga la web e inserta su contenido dentro de #div1&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#div1&amp;quot;).load(&amp;quot;demo_test.txt&amp;quot;, function(){&lt;br /&gt;
           alert(&amp;quot;External content loaded successfully!&amp;quot;);&lt;br /&gt;
         });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events AJAX [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstart ajaxStart] [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxstop ajaxStop]===&lt;br /&gt;
Sovint, voldrà executar una funció quan una petició hagi començat o acabat, com per exemple, mostrar o ocultar un indicador. En lloc de definir aquestes funcions dins de cada petició, jQuery proveeix la possibilitat de vincular esdeveniments Ajax a elements seleccionats. Per a una llista completa d'esdeveniments Ajax, pot consultar http://docs.jquery.com/ajax_events.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStart'''(): Assigna una funció que s'ha d'executar ''quan comença'' una consulta AJAX.&lt;br /&gt;
&lt;br /&gt;
'''AjaxStop'''(): Assigna una funció que s'executarà ''cada vegada que acaba'' una consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document)&lt;br /&gt;
        .ajaxStart(function() { $('#loading_indicator').show(); })&lt;br /&gt;
        .ajaxStop(function() { $('#loading_indicator').hide(); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podeu obtenir imatges per mostrar com a indicadors a: http://www.ajaxload.info/&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== FOTOS ===&lt;br /&gt;
&lt;br /&gt;
Tenemos 100 álbumes con unas 5000 fotografias que hemos subido a internet, se debe mostrar el total de fotografias y de albumes. Debe existir unos botones de desplazamiento para poder recorrer las fotos atrás &amp;lt; y adelante &amp;gt; mostrando su descripción e imágenes. Además de existir un breve buscador por título.&lt;br /&gt;
http://jsonplaceholder.typicode.com/photos&lt;br /&gt;
&lt;br /&gt;
=== Suma ===&lt;br /&gt;
Es tracta de crear un parell d'input dels quals s'introduiran valors numèrics que seran tractats en el servidor i tornarà la suma d'ells. Mentre es processa la informació haurà d'aparèixer un missatge de &amp;quot;processant ...&amp;quot; o pots crear la teva &lt;br /&gt;
[https://blog.reaccionestudio.com/8-generadores-de-iconos-cargando-para-ajax/ imatge de carrega]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[exercici ajax post]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Missatge ===&lt;br /&gt;
&lt;br /&gt;
Mostra un missatge d'alerta per indicar que el JavaScript s'ha carregat des del servidor.&lt;br /&gt;
:[[exercici missatge alerta]]&lt;br /&gt;
&lt;br /&gt;
=== Fitxer ===&lt;br /&gt;
&lt;br /&gt;
Volem cargar un fitxer txt a la nostra pàgina per tant el deurem afegir al nostre hosting per a evitar problemes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$('body').load( &amp;quot;http://hosting.infomerce.es/~jnoguera/jajax/merce.txt&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar I===&lt;br /&gt;
&lt;br /&gt;
Seleccionarem un número del 1 al 10, i el servidor ens calcularà la taula de multiplicar corresponent. Utilitzarem el mètode $.post() per passar la informació de quina taula de multiplicar volem veure.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_multiplicar]]&lt;br /&gt;
&lt;br /&gt;
===Taula Multiplicar II===&lt;br /&gt;
&lt;br /&gt;
En aquest cas també farem un sleep(1) en el fitxer php, i pintarem la imatge ajax_wait.gif mentre no estigui completa la petició.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_mulitiplicar1]]&lt;br /&gt;
&lt;br /&gt;
=== Formulari ===&lt;br /&gt;
En una consulta d'un dentista es vol registrar un nou client, es crearà un formulari amb nom, telèfon i un radi button que marcarà tard o demà. Aquestes dades s'enviaran al servidor i el servidor els tornarà en format JSON per mostrar-los en pantalla dues maneres. (JSON i tots els seus noms).&lt;br /&gt;
&lt;br /&gt;
:[[solució formulari ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Chat ===&lt;br /&gt;
Es vol crear un chat amb JQuery. El contingut del chat es guardarà en un fitxer al servidor php. Aquest fitxer es modificarà cada vegada que algú enviï informació. Els clients (navegadors) indicaran l'última línia del fitxer que han rebut per tal d'actualitzar els seus missatges&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pilota ===&lt;br /&gt;
*a) Es vol moure una pilota per la pantalla. Aquesta pilota es mou en tots els navegadors alhora. Per fer-ho, el servidor php té la posició de la pilota a la pantalla i els navegadors, mitjançant jquery, la mostren. &lt;br /&gt;
*b) La pilota no ha de parar de moure's, però la seva direcció la decideix el client mitjançant les tecles (up, down, left, rigth).&lt;br /&gt;
&lt;br /&gt;
'''Podeu trobar al moodle la solució d'aquest exercici'''&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15543</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15543"/>
				<updated>2021-04-19T18:37:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_chat]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15539</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15539"/>
				<updated>2021-04-19T17:05:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* ENVIAR MENSAJE AL CLIENTE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_chat]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15538</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15538"/>
				<updated>2021-04-19T13:50:24Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io-client/dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:[[sol_websockets_chat]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15488</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15488"/>
				<updated>2021-04-13T11:03:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* DOCUMENTAR API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/nusoap/client.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
  //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($cliente-&amp;gt;fault) { &lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
             echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            //echo 'Error:  ' . $cliente-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*************GET*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
/*************DELETE*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************PUT*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
/*************POST*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API SWAGGER ===&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete swagger&lt;br /&gt;
&lt;br /&gt;
composer require &amp;quot;darkaonline/l5-swagger:6.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Instalamos el paquete para las anotaciones que va relacionado&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
publicamos la vista y configuración del paquete&lt;br /&gt;
&lt;br /&gt;
php artisan vendor:publish --provider &amp;quot;L5Swagger\L5SwaggerServiceProvider&amp;quot;&lt;br /&gt;
&lt;br /&gt;
podemos comprobar cómo han quedado las rutas y vemos que ha añadido &amp;quot;api/documentation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
php artisan route:list&lt;br /&gt;
&lt;br /&gt;
luego añadimos las anotaciones antes de cada función&lt;br /&gt;
&lt;br /&gt;
@OA\Info&lt;br /&gt;
@OA\License&lt;br /&gt;
@OA\Tag&lt;br /&gt;
@OA\Server&lt;br /&gt;
@OA\SecurityScheme&lt;br /&gt;
@OA\RequestBody&lt;br /&gt;
@OA\Property&lt;br /&gt;
@OA\Get&lt;br /&gt;
@OA\Post&lt;br /&gt;
@OA\Put&lt;br /&gt;
&lt;br /&gt;
y generamos &lt;br /&gt;
&lt;br /&gt;
php artisan l5-swagger:generate&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15487</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15487"/>
				<updated>2021-04-13T09:02:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/nusoap/client.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
  //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($cliente-&amp;gt;fault) { &lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
             echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            //echo 'Error:  ' . $cliente-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*************GET*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
/*************DELETE*************/&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*************PUT*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
/*************POST*************/&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15486</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15486"/>
				<updated>2021-04-13T09:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Pràctica Web Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/nusoap/client.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
  //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($cliente-&amp;gt;fault) { &lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
             echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            //echo 'Error:  ' . $cliente-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15485</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15485"/>
				<updated>2021-04-13T08:54:43Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$error = $cliente-&amp;gt;getError();&lt;br /&gt;
&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Error &amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);   //respuesta&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //respuesta en JSON&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15484</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15484"/>
				<updated>2021-04-13T08:52:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$error = $cliente-&amp;gt;getError();&lt;br /&gt;
&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Error &amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
print_r($respuesta);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15483</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15483"/>
				<updated>2021-04-13T08:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$error = $cliente-&amp;gt;getError();&lt;br /&gt;
&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Error &amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
 print_r($response);&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$respuesta = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
&lt;br /&gt;
print_r($respuesta);  //{&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Updated Successfully.&amp;quot;}&lt;br /&gt;
$response_json=json_decode($respuesta, true);&lt;br /&gt;
print_r($response_json);  //Array ( [status] =&amp;gt; 1 [status_message] =&amp;gt; Product Updated Successfully. ) &lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15482</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15482"/>
				<updated>2021-04-13T08:42:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$error = $cliente-&amp;gt;getError();&lt;br /&gt;
&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Error &amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
 print_r($response);&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
print_r($response_json);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // recibimos la respuesta y la guardamos en una variable $ch&lt;br /&gt;
&lt;br /&gt;
$respuesta= curl_exec($ch);  //ejecutamos la sesión cUrl&lt;br /&gt;
curl_close($ch); // cerramos la sesión cURL&lt;br /&gt;
print_r($response_json);  //mostramos datos {&amp;quot;status&amp;quot;:1,&amp;quot;status_message&amp;quot;:&amp;quot;Product Added Successfully.&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15481</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15481"/>
				<updated>2021-04-13T08:27:20Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Pràctica Web Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
$getProd = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
$getInfo = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$error = $cliente-&amp;gt;getError();&lt;br /&gt;
&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Error &amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    echo $getProd;&lt;br /&gt;
    echo $getInfo;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
 print_r($response);&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
print_r($response_json);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
// cerramos la sesión cURL&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
print_r($response_json);  //mostramos datos&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15478</id>
		<title>NF1 - WEBSOCKETS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_WEBSOCKETS&amp;diff=15478"/>
				<updated>2021-04-12T17:47:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* RECIBIR MENSAJE EL CLIENTE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==WEBSOCKETS==&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:''' https://youtu.be/B1C_xNehrk8&lt;br /&gt;
&lt;br /&gt;
'''Introducción'''&lt;br /&gt;
&lt;br /&gt;
Los websockets son una tecnología que permite una comunicación bidireccional entre cliente y servidor sobre un ''único socket TCP''. En cierta manera es un buen sustituto de AJAX como tecnología para obtener datos del servidor, ya que no tenemos que pedirlos, ''el servidor nos los enviará cuando haya nuevos''.&lt;br /&gt;
Podemos utilizar diferentes bibliotecas para utilizar esta tecnología con [https://developer.mozilla.org/es/docs/WebSockets-840092-dup/Writing_WebSocket_client_applications#Disponibilidad_de_WebSockets websocket] (ws) más básica y la que vamos a trabajar que es algo más completa [https://socket.io sockets.io].&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:websockets.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
[[Fitxer:ajaxvswebsocket.png|600px]]&lt;br /&gt;
-------------------&lt;br /&gt;
-------------------&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:ajaxvswebsocket1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/10112178/differences-between-socket-io-and-websockets/38558531#38558531&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet&lt;br /&gt;
&lt;br /&gt;
Si queremos montar nuestro servidor en windows primero debemos instalar Nodejs que es el servidor que vamos a instalar, nos creamos una carpeta y hacemos la instalación del framework Express y nuestra biblioteca socket.io dentro de esa ruta, por ejemplo, C:\Users\pc\websocket2.&lt;br /&gt;
&lt;br /&gt;
Empezamos creando un paquete de Node con &amp;quot;npm init -y&amp;quot; para generar un package.json con las opciones por defecto ( luego instalamos express y socket.io)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ npm init -y&lt;br /&gt;
$ npm install --save express&lt;br /&gt;
$ npm install --save socket.io&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
después abrimos consola de windows, accedemos a la carpeta y añadimos el server.js y index.html&lt;br /&gt;
&lt;br /&gt;
==RECIBIR MENSAJE EL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
nos creamos un archivo dentro de la carpeta websocket llamado 'server.js' que será nuestro código en el servidor e introducimos:&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&lt;br /&gt;
por parte del cliente tendremos que introducir el siguiente código&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io/client-dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensajes', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;nodejs&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var mensajes= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! ¿Cómo estáis?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Muy bien! ¿y tú?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
  console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensajes', mensajes);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cuando ya tengamos nuestro fichero 'server.js' en terminal escribimos 'node server.js'&lt;br /&gt;
&lt;br /&gt;
==ENVIAR MENSAJE AL CLIENTE==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;./node_modules/socket.io-client/dist/socket.io.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- debe ser la ruta en la cual está instalado nuestra biblioteca socket.io--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
//conectamos el cliente con el servidor de websockets que tenemos en http://localhost:8080 &lt;br /&gt;
// y escuchamos el evento mensajes y obteniendo el array en data.&lt;br /&gt;
var socket = io.connect('http://localhost:8080', { 'forceNew': true });&lt;br /&gt;
// var socket = io.connect('http://localhost');&lt;br /&gt;
&lt;br /&gt;
socket.on('mensa', function(data) {&lt;br /&gt;
        document.write(&amp;quot;Bienvenidos.digo&amp;quot;);&lt;br /&gt;
  console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var MensajeCliente= [{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Estoy en el cliente&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;yo también lo estoy&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    alumno: &amp;quot;alumno1&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Perfecto!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
socket.emit('mensajes', MensajeCliente);  //envía al servidor el JSON 'MensajeCliente' y escuchará en el evento 'mensajes'&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;Hello world&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''server.js'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var express = require('express');&lt;br /&gt;
var app = express();&lt;br /&gt;
var path = require('path');&lt;br /&gt;
var server = require('http').Server(app);&lt;br /&gt;
var io = require('socket.io')(server);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app.use(express.static(path.join(__dirname, '/'))); //Para el servicio de archivos estáticos como, por ejemplo, imágenes, archivos CSS y archivos JavaScript,&lt;br /&gt;
&lt;br /&gt;
server.listen(8080, function() {   ////Pondremos el servidor a escuchar en localhost con el puerto 8080&lt;br /&gt;
  console.log('Servidor corriendo en http://localhost:8080');&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// array de mensajes&lt;br /&gt;
var MensajeServidor= [{&lt;br /&gt;
    profesor: &amp;quot;Julio&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Hola! estoy en el servidor&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Albert&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;¿Qué haces por ahí?&amp;quot;&lt;br /&gt;
},{&lt;br /&gt;
    profesor: &amp;quot;Alex&amp;quot;,&lt;br /&gt;
    texto: &amp;quot;Dando una vuelta me imagino!&amp;quot;&lt;br /&gt;
}];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//servidor de websockets, que lo tenemos en la variable io, esté atento a que se realice una conexión. &lt;br /&gt;
//Eso lo logramos con io.on() y pasándole el mensaje connection, también tenemos el método en el cual enviaremos el array de objetos mensaje con el evento 'mensajes'&lt;br /&gt;
&lt;br /&gt;
io.on('connection', function(socket) {&lt;br /&gt;
        console.log('Un cliente se ha conectado');&lt;br /&gt;
        socket.emit('mensa', MensajeServidor);  //envia al cliente el array Mensajeservidor al cliente que escuchará con el evento 'mensa'&lt;br /&gt;
        socket.on('mensajes', function(data) {  //está escuchando del cliente si le ha enviado algo mediante el evento 'mensajes'&lt;br /&gt;
        console.log(data);  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://manuais.iessanclemente.net/index.php/Node.js_y_Websockets#Servidor_web_b.C3.A1sico_con_node.js_y_express&lt;br /&gt;
&lt;br /&gt;
http://micaminomaster.com.co/herramientas-desarrollo/nodejs-projecto-esqueleto-mvc-crud/&lt;br /&gt;
&lt;br /&gt;
==EJERCICIOS==&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el servidor un JSON con la fecha actual cada segundo al cliente &amp;quot;new Date().toJSON()&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_reloj]]&lt;br /&gt;
&lt;br /&gt;
*Se desea enviar desde el cliente un número al servidor que será el tiempo X que hará ejecutar un función mediante setInterval que genera números aleatorios, deberá mostrarlo por consola en el servidor y mostrarlo al cliente.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_random]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Mostrará por pantalla el número de personas que están conectadas en ese momento y en caso de desconectarse deberá actualizarse la información.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_clientes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se desea realizar un chat en el cual diferentes clientes se conectan al servidor y van viendo el historial de mensajes en pantalla.El cliente deberá tener dos inputs para introducir información, uno para el nombre y otro para el texto.&lt;br /&gt;
&lt;br /&gt;
:[[sol_websockets_chat]]&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15472</id>
		<title>Serveis Web i Mashups a PHP</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=Serveis_Web_i_Mashups_a_PHP&amp;diff=15472"/>
				<updated>2021-04-11T17:33:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* API RESTFUL LARAVEL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- =Què són els Serveis Web?=&lt;br /&gt;
Els '''serveis web són aplicacions client i servidor''' que es comuniquen sobre (WWW) Protocol de transferència d'hipertext de la World Wide Web (HTTP). Segons el descrit pel World Wide Web Consortium (W3C), serveis web '''proporcionen un mitjà estàndard d'interoperabilitat entre aplicacions de programari que s'executen en una varietat de plataformes i marcs'''. &lt;br /&gt;
Els serveis web es caracteritzen per la seva gran interoperabilitat i extensibilitat, així com les seves descripcions processable per màquina, gràcies a la utilització de XML. Els serveis web es poden combinar d'una manera precisa per aconseguir operacions complexes.&lt;br /&gt;
&lt;br /&gt;
=Tipus de Serveis Web=&lt;br /&gt;
En el pla conceptual, un servei és un component de programari que es proporciona de la xarxa. &lt;br /&gt;
&lt;br /&gt;
A nivell tècnic, els serveis web es poden implementar de diverses maneres. Els dos tipus de serveis web analitzats en aquesta secció es poden distingir com a '''Big Web Services''' i '''serveis web RESTful'''.&lt;br /&gt;
&lt;br /&gt;
'''Big Web Services'''&lt;br /&gt;
En Java EE 6, '''JAX-WS '''proporciona la funcionalitat de '''Big Web Services'''. Serveis web Grans utilitzen missatges '''XML''' que segueixen el protocol d'accés a objectes estàndard ('''SOAP'''), un llenguatge XML que defineix una arquitectura de missatges i formats de missatges. Aquests sistemes sovint contenen una descripció llegible per les màquines de les operacions que ofereix el servei, escrit en la Web Services Description Language (WSDL), un llenguatge XML per a definir sintàcticament interfícies.&lt;br /&gt;
&lt;br /&gt;
El format del missatge SOAP i WSDL llenguatge de definició d'interfície han guanyat l'adopció generalitzada. Moltes de les eines de desenvolupament, com NetBeans IDE, poden reduir la complexitat del desenvolupament d'aplicacions de serveis web.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:soap-message.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Serveis Web REST'''&lt;br /&gt;
En Java EE 6, '''JAX-RS''' proporciona la funcionalitat per a la Transferència d'estat representacional ​​(REST Web Services). REST és molt adequat per a escenaris bàsics. Serveis web RESTful sovint estan millor integrats amb HTTP que els  serveis basats en SOAP ja que no requereixen de missatges XML o definicions servei API WSDL.&lt;br /&gt;
&lt;br /&gt;
Projecte Jersey és la implementació de referència de l'especificació JAX-RS. Jersei implementa suport per a les anotacions definides en l'especificació JAX-RS, el que facilita als desenvolupadors crear serveis web RESTful amb Java i la màquina virtual de Java (JVM).&lt;br /&gt;
&lt;br /&gt;
== SOAP Web Services ==&lt;br /&gt;
Simple Object Access Protocol (SOAP)és un protocol estàndard per l'intercanvi de missatges XML. La comunicació entre el client i el servei succeeix utilitzant missatges XML.&lt;br /&gt;
&lt;br /&gt;
'''Què és el WSDL?'''&lt;br /&gt;
&lt;br /&gt;
WSDL: Web Service Description Language. És un arxiu XML que descriu els detalls tècnics de com s'implementa un servei web, més específicament la URI, port, nom dels mètodes, els paràmetres i els tipus de dades. Llegint el WSDL poden veure:&lt;br /&gt;
*Ports / EndPoint - URL del servei web&lt;br /&gt;
*Format del missatge d'entrada&lt;br /&gt;
*Format del missatge de sortida&lt;br /&gt;
*Protocol de seguretat que s'ha de seguir&lt;br /&gt;
*El protocol de servei web utilitzat&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
Existeixen dues maneres per accedir a un servei web:&lt;br /&gt;
*'''El proveïdor de serveis web coneix al client''':El proveïdor de serveis web proporcionarà el '''WSDL'' al client i el client podrà accedir als serveis web.&lt;br /&gt;
*'''El proveïdor de serveis registri la WSDL com a UDDI'''. UUID (Universal Description, Discover and Integration). Els WSDL es poden convertir a un UDDI i així, poden estar disponibles mitjançant un directori de serveis per a la seva utilització.&lt;br /&gt;
=== SOAP Message ===&lt;br /&gt;
SOAP està basat en XML i, per això, està considerat llegible per alguns éssers humans, però està basat en un esquema XSD específic que se li ha d'afegir. Veiem un petit missatge SOAP treient tota la informació i agafant només les etiquetes que fan que sigui un missatge SOAP:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Header&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/soap:Header&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
  &amp;lt;soap:Fault&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
  &amp;lt;/soap:Fault&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sembla només un altre arxiu XML però, el que fa que sigui un missatge SOAP és l'element ''root'' anomenat ''Envelope'' que té l'espai de noms soap a http://www.w3.org/2001/12/soap-envelope. L'atribut '''soap:encodingStyle''' determina el tipus de dades que s'utilitza en el fitxer per que SOAP no té una codificació per defecte.&lt;br /&gt;
&lt;br /&gt;
L'element '''soap:Envelope''' és obligatori però l'elemenmt següent '''soap:Header''' és opcional i normalment conté informació rellevant a l'autenticació i la sessió. El protocol SOAP no ofereix autenticació però ofereix als desenvolupadors aquesta etiqueta per a incloure-ho.&lt;br /&gt;
&lt;br /&gt;
El següent element es tracta de '''soap:Body''' que és obligatori. Conté el missatge RPC (Remote Procedure Call) on s'inclou els mètodes i si és un missatge de resposta, també el valor retornat pel mètode. L'etiqueta '''soap:Fault''' és opcional. Si està present al missatge conté els erros i el missatges dels errors.&lt;br /&gt;
&lt;br /&gt;
Donem un cop d'ull a un missatge SOAP de petició:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPrice&amp;gt;&lt;br /&gt;
   &amp;lt;m:StockName&amp;gt;IBM&amp;lt;/m:StockName&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPrice&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El missatge anterior és una petició per obtenir el preu d'estoc d'una empresa en concret. Dintre de l'etiqueta '''soap:Body''' veuràs l'element ''GetStockPrice'' que No correspon a SOAP, si no, que aquest element fa referència a un mètode particular de l'aplicació de servidor que es cridarà  al rebre aquest missatge. L'element ''StockName'' també és específic de l'aplicació servidora i correspon a un paràmetre de la funció anterior.&lt;br /&gt;
&lt;br /&gt;
El missatge de resposta és molt semblant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;soap:Envelope&lt;br /&gt;
 xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;
 soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;soap:Body xmlns:m=&amp;quot;http://www.yourwebroot.com/stock&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
   &amp;lt;m:Price&amp;gt;183.08&amp;lt;/m:Price&amp;gt;&lt;br /&gt;
  &amp;lt;/m:GetStockPriceResponse&amp;gt;&lt;br /&gt;
 &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;
&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dintre de l'element '''soap:Body''' veuràs l'element ''GetStockPriceRespomse'' que conté l'element ''Price'' amb la dada de resposta. Ambdós elements son específics de l'aplicació de servidor.&lt;br /&gt;
&lt;br /&gt;
==Client Java Swing d'un servei Web ==&lt;br /&gt;
Es farà una implementació d'un servei web client utilitzant JAVA SWING. Segueix aquests passos:&lt;br /&gt;
*Crea un nou projecte de tipus Java Application.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Crea un formulari SWING per afegir els camps elements necessaris (buttons, labels, text fields, etc)&lt;br /&gt;
[[Fitxer:wsclient-java2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java3.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada tinguis el formulari, afegeix la funcionalitat de web-service client&lt;br /&gt;
[[Fitxer:wsclient-java4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Omple el camp wsdl a l'hora de configurar el client. Deixa en blanc el camp package:&lt;br /&gt;
[[Fitxer:wsclient-java5.png|500px]]&lt;br /&gt;
&lt;br /&gt;
*Una vegada generat, ja es pot utilitzar el client del WS des del formulari Swing. Per tal d'utilitzar-lo, genera el codi necessari insertant-lo des del netbeans:&lt;br /&gt;
[[Fitxer:wsclient-java6.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java7.png|500px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java8.png|300px]]&lt;br /&gt;
&lt;br /&gt;
*Podem veure el codi generat. Él nom de la funció generada correspon al nom del servei web:&lt;br /&gt;
[[Fitxer:wsclient-java9.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Ja podem utilitzar la crida al servei web associant-la al click d'un botó. El resultat de la execució del servei web es mostrarà en un Dialog.&lt;br /&gt;
[[Fitxer:wsclient-java10.png|700px]]&lt;br /&gt;
&lt;br /&gt;
*Resultat de l'execució:&lt;br /&gt;
[[Fitxer:wsclient-java11.png|300px]]&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-java12.png|300px]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=BeY1bQzMeAk&lt;br /&gt;
&lt;br /&gt;
===Accedir a un servei Web des de un client php ===&lt;br /&gt;
Per accedir a un servei web, és molt fàcil, només s'ha de donar el WSDL a la classe '''SoapClient''' de PHP.&lt;br /&gt;
L'objecte generat conté tots els serveis webs que estan implementat en el WSDL.&lt;br /&gt;
Per passar els paràmetres, es fa servir un Array associatiu on la clau és el nom del paràmetre configurat en el WS i el valor és el que es vol enviar al servei web.&lt;br /&gt;
Exemple: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$client = new SoapClient(&amp;quot;http://192.168.56.1:8084/webServiceProject/Hola?wsdl&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;hello(array(&amp;quot;name&amp;quot;=&amp;gt;&amp;quot;alex&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
echo $result-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per accedir al resultat del WebService, hem de veure en el WSDL el nom del camp corresponent al resultat del WS i així podrem accedir al valor.&lt;br /&gt;
&lt;br /&gt;
Es pot crear un formulari amb php i en el controlador, fer la crida al servei Web corresponent.&lt;br /&gt;
&lt;br /&gt;
Resultat execució codi anterior (Es recorda que es necessari una màquina virtual amb php + apache2):&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:wsclient-php1.png|500px]]&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP server ===&lt;br /&gt;
És molt senzill crear un servei web utilitzant la llibreria NuSOAP de PHP. Pots descarregar-la des d'aquest [https://github.com/pwnlabs/nusoap | enllaç]. Baixa't-ho i descomprimeix-lo en el directori principal de l'aplicació. Per utilitzar-ho només has d'incloure la llibreria '''nusoap.php''' en el codi de l'aplicació.&lt;br /&gt;
&lt;br /&gt;
Veiem un exemple d'utilització de la llibreria '''nusoap''' per crear un servei web. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
            return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;);&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''. Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
=== NuSOAP Client ===&lt;br /&gt;
&lt;br /&gt;
Crearem una pàgina php que utilitzarà el servei web anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$error = $client-&amp;gt;getError();&lt;br /&gt;
if ($error) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$result = $client-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;books&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if ($client-&amp;gt;fault) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    print_r($result);&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Books&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        echo $result;&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
=== Creació d'un arxiu WSDL ===&lt;br /&gt;
&lt;br /&gt;
Escriure un fitxer WSDL a mà pot ser de bojos. Una utilitat molt interessant de '''nusoap''' és que pot crear un fitxer WSDL automàticament. Veurem un exemple modificant una mica l'exemple anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function getProd($category) {&lt;br /&gt;
    if ($category == &amp;quot;books&amp;quot;) {&lt;br /&gt;
        return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
            &amp;quot;The WordPress Anthology&amp;quot;,&lt;br /&gt;
            &amp;quot;PHP Master: Write Cutting Edge Code&amp;quot;,&lt;br /&gt;
            &amp;quot;Build Your Own Website the Right Way&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        return &amp;quot;No products listed under that category&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$server = new soap_server();&lt;br /&gt;
$server-&amp;gt;configureWSDL(&amp;quot;productlist&amp;quot;, &amp;quot;urn:productlist&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;register(&amp;quot;getProd&amp;quot;,&lt;br /&gt;
    array(&amp;quot;category&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
    &amp;quot;urn:productlist&amp;quot;,&lt;br /&gt;
    &amp;quot;urn:productlist#getProd&amp;quot;,&lt;br /&gt;
    &amp;quot;rpc&amp;quot;,&lt;br /&gt;
    &amp;quot;encoded&amp;quot;,&lt;br /&gt;
    &amp;quot;Get a listing of products by category&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
&lt;br /&gt;
/*if ( !isset( $HTTP_RAW_POST_DATA ) )&lt;br /&gt;
 $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );&lt;br /&gt;
$server-&amp;gt;service($HTTP_RAW_POST_DATA);*/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
El segon canvi afegeix informació addicional al mètode '''register'''. Veiem-ho:&lt;br /&gt;
* '''getProd:''' correspon al nom de la funció&lt;br /&gt;
* '''array(&amp;quot;category&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon a la descripció dels paràmetres que necessita la funció '''getProd''', veieu que cada paràmetre té associat un tipus de dades.&lt;br /&gt;
* '''array(&amp;quot;return&amp;quot;=&amp;gt;&amp;quot;xsd:string&amp;quot;)''' correspon al valor de retorn de la funció ''getProd''. S'ha d'especificar el tipus de dades a retornar.&lt;br /&gt;
* '''urn:productlist''' defineix l'espai de noms&lt;br /&gt;
* '''urn:productlist#getProd''' defineix l'acció SOAP&lt;br /&gt;
* '''rpc''' defineix el tipus de crida. Aquesta pot ser ''rpc'' o ''document''&lt;br /&gt;
* '''encoded''' definexi el valor de l'atribut ''use''. Pot ser ''encoded'' o ''literal''&lt;br /&gt;
* L'últim paràmetre és un string de documentació que descriu el mètode ''getProd''.&lt;br /&gt;
&lt;br /&gt;
Per veure el fitxer wsdl només hem d'afegir a la url '''?wsdl''' al final. Exemple: http://yourwebroot/productlist.php?wsdl&lt;br /&gt;
Una vegada vegis el WSDL ja es pots copiar en un fitxer i depositar-lo en el directori web.&lt;br /&gt;
&lt;br /&gt;
Al tenir el WSDL generat en un fitxer en el servidor web podem aprofitar-lo per crear un client soap que el llegeixi. Per fer-ho només s'ha de canviar aquesta línia del client soap:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;http://localhost/nusoap/productlist.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
per aquesta altre:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$client = new nusoap_client(&amp;quot;products.wsdl&amp;quot;, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Veieu que ara es crea el client SOAP utilitzant el fitxer '''products.wsdl''' que es troba en el mateix directory del servidor que l'aplicació client. El següent paràmetre és un booleà que indica que accepti aquest fitxer WSDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=Pràctica Web Services =&lt;br /&gt;
&lt;br /&gt;
*'''VideoTutorial SOAP:'''  https://youtu.be/LIbP_pbwGZo&lt;br /&gt;
&lt;br /&gt;
'''API:'''  (siglas de ‘Application Programming Interface’) es un conjunto de reglas (código) y &lt;br /&gt;
especificaciones que las aplicaciones pueden seguir para comunicarse entre ellas.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es SOAP?'''&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP o mejor conocimos simplemente como ''Web Services''.&lt;br /&gt;
&lt;br /&gt;
*Son servicios que basan su comunicación bajo el protocolo ''SOAP'' (Simple Object Access Protocol) &lt;br /&gt;
según la Wiki &amp;quot;protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Los servicios SOAP funcionan por lo general por el ''protocolo HTTP'', aunque también FTP, POP3, TCP...&lt;br /&gt;
&lt;br /&gt;
'''WSDL''' (Web Services Description Language) es un protocolo basado en XML que describe los accesos al Web Service. Podríamos decir que es el manual de operación del mismo.&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*Protocolo mucho más robusto, tiene un tipiado mucho más fuerte (XSD,DTD)&lt;br /&gt;
&lt;br /&gt;
*Permite agregar ''metadatos'' mediante los atributos (cosa que ''JSON no tien''e).&lt;br /&gt;
&lt;br /&gt;
*Permite definir ''espacios de nombre'', evitando la ambigüedad. &lt;br /&gt;
&lt;br /&gt;
'''INCONVENIENTES:'''&lt;br /&gt;
&lt;br /&gt;
*SOAP es un formato ''más pesado'', tanto en tamaño como en procesamiento, pues los XML tiene que ser parseado a un árbol DOM resolver espacios de nombre (namespaces) antes de poder empezar a procesar el documento. &lt;br /&gt;
&lt;br /&gt;
*Los XML además tienen métodos de ''validación muy potentes'' y ampliamente utilizados, a diferencia de JSON.&lt;br /&gt;
&lt;br /&gt;
'''¿Qué es REST?'''&lt;br /&gt;
&lt;br /&gt;
Hay que diferenciar dos conceptos:&lt;br /&gt;
&lt;br /&gt;
'''REST''' (Representational State Transfer) es una arquitectura que se ejecuta sobre HTTP.&lt;br /&gt;
&lt;br /&gt;
'''RESTful''' hace referencia a un servicio web que implementa la arquitectura REST.&lt;br /&gt;
&lt;br /&gt;
REST es una tecnología ''mucho más flexible'' que transporta datos por medio del ''protocolo HTTP''.&lt;br /&gt;
&lt;br /&gt;
Este permite utilizar los diversos métodos que proporciona HTTP para comunicarse, como lo son GET, POST, PUT, DELETE, PATCH y a la vez, utiliza los códigos de respuesta nativos de HTTP (404,200,204,409).&lt;br /&gt;
&lt;br /&gt;
'''VENTAJAS:'''&lt;br /&gt;
&lt;br /&gt;
*REST es tan flexible que permite transmitir prácticamente cualquier tipo de datos: ''JSON principalmente'', XML,  Binarios (imágenes, documentos), Text, etc.&lt;br /&gt;
&lt;br /&gt;
*JSON es ''interpretado de forma natural por JavaScript'', lo que ha hecho que frameworks como Angular, React y VUE se aprovechen al máximo, &lt;br /&gt;
pues pueden enviar peticiones directas al servidor por medio de AJAX y obtener los datos de una forma nativa.&lt;br /&gt;
&lt;br /&gt;
*JSON son considerablemente ''más livianos en peso'' y mucho más rápido en su procesamiento&lt;br /&gt;
&lt;br /&gt;
'''Diferencias entre SOAP y API'''&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''Descargar NUSOAP''' &lt;br /&gt;
 &lt;br /&gt;
https://github.com/pwnlabs/nusoap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO SERVER.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
   &lt;br /&gt;
   function getInfo() {&lt;br /&gt;
      &lt;br /&gt;
       return &amp;quot;Info de los libros&amp;quot;;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    function getProd($categoria) {&lt;br /&gt;
        if ($categoria == &amp;quot;libros&amp;quot;) {&lt;br /&gt;
            return join(&amp;quot;,&amp;quot;, array(&lt;br /&gt;
                &amp;quot;El señor de los anillos&amp;quot;,&lt;br /&gt;
                &amp;quot;Los límites de la Fundación&amp;quot;,&lt;br /&gt;
                &amp;quot;The Rails Way&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            return &amp;quot;No hay productos de esta categoria&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $server = new soap_server();&lt;br /&gt;
    $server-&amp;gt;configureWSDL(&amp;quot;producto&amp;quot;, &amp;quot;urn:producto&amp;quot;);&lt;br /&gt;
       &lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getProd&amp;quot;,             //nombre función&lt;br /&gt;
        array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),  //parametro de entrada&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),     //parametro de salida&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,                      //namespace&lt;br /&gt;
        &amp;quot;urn:producto#getProd&amp;quot;,              //accion SOAP&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,                               //estilo&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da una lista de productos de cada categoría&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    $server-&amp;gt;register(&amp;quot;getInfo&amp;quot;,&lt;br /&gt;
        array(&amp;quot;&amp;quot;),&lt;br /&gt;
        array(&amp;quot;return&amp;quot; =&amp;gt; &amp;quot;xsd:string&amp;quot;),&lt;br /&gt;
        &amp;quot;urn:producto&amp;quot;,&lt;br /&gt;
        &amp;quot;urn:producto#getInfo&amp;quot;,&lt;br /&gt;
        &amp;quot;rpc&amp;quot;,&lt;br /&gt;
        &amp;quot;encoded&amp;quot;,&lt;br /&gt;
        &amp;quot;Nos da Info &amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      if(!isset($HTTP_RAW_POST_DATA)){   ///Datos POST sin tratar , En general, se debería utilizar php://input en lugar de $HTTP_RAW_POST_DATA.&lt;br /&gt;
&lt;br /&gt;
    $HTTP_RAW_POST_DATA = file_get_contents(&amp;quot;php://input&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 $server-&amp;gt;service($HTTP_RAW_POST_DATA);&lt;br /&gt;
   &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Primer s'inclou el fitxer '''nusoap.php'' per poder accedir a la llibreria NuSOAP. &lt;br /&gt;
&lt;br /&gt;
Després es defineix la funció '''getProd()''' i s'instancia un objecte de la classe ''soap_server''.&lt;br /&gt;
&lt;br /&gt;
Immediatament després s'utilitza el mètode '''register'' per afegir la funció ''getProd'' al servidor sopa i poder accedir a ella des de un client. És a dir, convertim la funció ''getProd'' en un servei web.&lt;br /&gt;
&lt;br /&gt;
Segurament, en un escenari real, la funció ''getProd'' hauria de cercar en una Base de Dades la informació que s'ha d'enviar a l'usuari. Ara mateix, no volem complicar el codi en coses externes a SOAP.&lt;br /&gt;
&lt;br /&gt;
Es poden registrar funcions addicionals en el servidor per per donar més funcionalitats a l'aplicació. El procés seria idèntic del descrit anteriorment.&lt;br /&gt;
&lt;br /&gt;
Bàsicament és el mateix codi amb quatre canvis. El primer canvi que s'ha afegit és la crida a la funció '''configureWSDL()'''. &lt;br /&gt;
&lt;br /&gt;
Aquest mètode prepara al servidor per a que pugui generar un fitxer WSDL dels nostres serveis registrats. El primer paràmetre d'aquesta funció, és el nom del servei i el segon correspon a l'espai de noms del servei.&lt;br /&gt;
&lt;br /&gt;
'''FICHERO CLIENTE.PHP'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once &amp;quot;./nusoap/lib/nusoap.php&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php&amp;quot;);&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;http://localhost/webservice/server.php?wsdl&amp;quot;, 'wsdl');&lt;br /&gt;
//$cliente = new nusoap_client(&amp;quot;./server.php?wsdl&amp;quot;, true);&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
    $error = $cliente-&amp;gt;getError();&lt;br /&gt;
    if ($error) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Constructor error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    $result = $cliente-&amp;gt;call(&amp;quot;getProd&amp;quot;, array(&amp;quot;categoria&amp;quot; =&amp;gt; &amp;quot;libros&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
    $result1 = $cliente-&amp;gt;call(&amp;quot;getInfo&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
    if ($cliente-&amp;gt;fault) {&lt;br /&gt;
        echo &amp;quot;&amp;lt;h2&amp;gt;Fault&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
        print_r($result);&lt;br /&gt;
        echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        $error = $cliente-&amp;gt;getError();&lt;br /&gt;
        if ($error) {&lt;br /&gt;
            echo &amp;quot;&amp;lt;h2&amp;gt;Error&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot; . $error . &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            echo &amp;quot;&amp;lt;h2&amp;gt;Libros&amp;lt;/h2&amp;gt;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
            echo $result;&lt;br /&gt;
            echo $result1;&lt;br /&gt;
            echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com va passar en el servidor, primer s'ha d'incloure la llibreria ''nusoap.php'' amb la directiva ''required_once''. &lt;br /&gt;
&lt;br /&gt;
Seguidament, es crea un nova instància d'un client soap amb la classe: '''nusoap_client'''. &lt;br /&gt;
&lt;br /&gt;
El constructor necessita la localització del servidor soap al que s'ha de connectar. És a dir, del fitxer on es troba la creació del soap_server amb les funcions registrades. &lt;br /&gt;
&lt;br /&gt;
La funció '''getError''' comprova si el client SOAP s'ha creat correctament i si no ha estat així, mostra un missatge d'error.&lt;br /&gt;
&lt;br /&gt;
El mètode '''call()''' genera i envia un missatge SOAP de tipus petició (Request) a la funció o el mètode definit com a primer paràmetre. El segon paràmetre de la funció ''call()'' és un array associatiu del paràmetres que necessita el mètode servidor. &lt;br /&gt;
&lt;br /&gt;
La propietat '''fault''' i el mètode '''getError()''' son utilitzat per comprovar i mostrar cualsevol error produït en la comunicació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP desde servidor externo (Obtener Ip)'''&lt;br /&gt;
https://ws.cdyne.com/ip2geo/ip2geo.asmx&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   require_once &amp;quot;./nusoap.php&amp;quot;;&lt;br /&gt;
    $url = &amp;quot;http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl&amp;quot;;&lt;br /&gt;
    try {&lt;br /&gt;
     $client = new SoapClient($url, 'wsdl' );&lt;br /&gt;
     $param=array('ipAddress'=&amp;gt;&amp;quot;210.45.151.101&amp;quot;, 'licenseKey' =&amp;gt; &amp;quot;0&amp;quot;);&lt;br /&gt;
     $result = $client-&amp;gt;call('ResolveIP', $param);&lt;br /&gt;
     print_r($result);&lt;br /&gt;
    } catch ( SoapFault $e ) {&lt;br /&gt;
     echo $e-&amp;gt;getMessage();&lt;br /&gt;
    }&lt;br /&gt;
    echo PHP_EOL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
'''Ejemplo de consumir un Web Service SOAP de la universidad de Alicante desde el cliente.'''&lt;br /&gt;
&lt;br /&gt;
La dirección que expone este Web Services es la siguiente:  https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl, como puedes ver al final muestra un archivo WSDL,  que es donde expone las interfaces que van a ser consumidas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    header('Content-Type: text/html; charset=ISO-8859-1'); &lt;br /&gt;
    require_once('lib/nusoap.php');&lt;br /&gt;
    //Parámetros&lt;br /&gt;
    $slengua = &amp;quot;C&amp;quot;;&lt;br /&gt;
    $scurso = &amp;quot;2011-12&amp;quot;;&lt;br /&gt;
    $scoddep = &amp;quot;B142&amp;quot;;&lt;br /&gt;
    $scodest = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //url del webservice&lt;br /&gt;
    $wsdl=&amp;quot;https://cvnet.cpd.ua.es/servicioweb/publicos/pub_gestdocente.asmx?wsdl&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    //instanciando un nuevo objeto cliente para consumir el webservice&lt;br /&gt;
    $client=new nusoap_client($wsdl,'wsdl');&lt;br /&gt;
    //pasando los parámetros a un array&lt;br /&gt;
    $param=array('plengua'=&amp;gt;$slengua, 'pcurso' =&amp;gt; $scurso, 'pcoddep' =&amp;gt; $scoddep, 'pcodest' =&amp;gt; $scodest);&lt;br /&gt;
    //llamando al método y pasándole el array con los parámetros&lt;br /&gt;
    $resultado = $client-&amp;gt;call('wsasidepto', $param);&lt;br /&gt;
   &lt;br /&gt;
    //si ocurre algún error al consumir el Web Service&lt;br /&gt;
    if ($client-&amp;gt;fault) { // si&lt;br /&gt;
        $error = $client-&amp;gt;getError();&lt;br /&gt;
    if ($error) { // Hubo algun error&lt;br /&gt;
            //echo 'Error:' . $error;&lt;br /&gt;
            //echo 'Error2:' . $error-&amp;gt;faultactor;&lt;br /&gt;
            //echo 'Error3:' . $error-&amp;gt;faultdetail;faultstring&lt;br /&gt;
            echo 'Error:  ' . $client-&amp;gt;faultstring;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        die();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;;&lt;br /&gt;
    //print_r($resultado);&lt;br /&gt;
	$result=$resultado['wsasideptoResult']['ClaseAsiDepto'];&lt;br /&gt;
	&lt;br /&gt;
	for($i=0;$i&amp;lt;=count($result);$i++){&lt;br /&gt;
		echo $result[$i]['codasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['enlaceasi'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['codest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo $result[$i]['nomest'].&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
		echo &amp;quot;&amp;lt;br&amp;gt;&amp;quot;.&amp;quot;&amp;lt;br&amp;gt;&amp;quot;;		&lt;br /&gt;
	}	&lt;br /&gt;
    echo &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''FICHERO TXT EN EL SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;TXT&amp;quot;&amp;gt;&lt;br /&gt;
melon,&lt;br /&gt;
melocoton,&lt;br /&gt;
banana,&lt;br /&gt;
frambuesa&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RECUPERA FICHERO MOSTRANDO DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$curl = curl_init(&amp;quot;http://localhost/frutas.txt&amp;quot;);   //Inicia una nueva sesión cURL&lt;br /&gt;
&lt;br /&gt;
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);   //Define opciones para nuestra sesion cURL,  si se quiere que el contenido que devuelve la página se almacene en una variable, se puede utilizar la opción CURLOPT_RETURNTRANSFER&lt;br /&gt;
&lt;br /&gt;
$respuesta = curl_exec($curl);   //Ejecuta la sesión cURL que se le pasa como parámetro.&lt;br /&gt;
 &lt;br /&gt;
$info = curl_getinfo($curl);   //Obtiene información de la última transferencia&lt;br /&gt;
&lt;br /&gt;
echo $respuesta;&lt;br /&gt;
echo $info;&lt;br /&gt;
&lt;br /&gt;
if($info['http_code'] == 200){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	$datos = explode (&amp;quot;,&amp;quot;, $respuesta);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;h1&amp;gt;Frutas en mi tienda&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach ($datos as $key =&amp;gt; $value) {&lt;br /&gt;
		echo $key.&amp;quot;-&amp;gt;&amp;quot;.$value . &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*  //ejemplo cargar una web en el php&lt;br /&gt;
       $cliente = curl_init();&lt;br /&gt;
	curl_setopt($cliente, CURLOPT_URL, &amp;quot;https://www.google.com/search?q=lamerce&amp;quot;);&lt;br /&gt;
	curl_exec($cliente);&lt;br /&gt;
	curl_close($cliente);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercici Web Service SOAP ==&lt;br /&gt;
*Crea un servei web que permeti Sumar, Restar, Multiplicar i Dividir.&lt;br /&gt;
*Busca un servei web a internet que utilitzi SOAP. site: wsdl&lt;br /&gt;
*Crea un servei web que façi dos consultes a una base de dades que tingui informació.&lt;br /&gt;
*Crea una aplicació client en PHP que també utilitzi aquest servei amb wsdl.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL PHP =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/aC0gCDylAxk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
-Para recuperar datos de una API, pueden usarse dos formas con '''curl''' o '''file_gets_contents()'''&lt;br /&gt;
&lt;br /&gt;
'''Tenemos dos opciones, ¿Cúal es mejor?'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''file_get_contents()'''&lt;br /&gt;
&lt;br /&gt;
* Es un simple destornillador. Ideal para ''simples solicitudes GET'' donde el encabezado, método de solicitud HTTP, tiempo de espera, cookies, redirecciones y otras cosas más complejas no importan.&lt;br /&gt;
&lt;br /&gt;
* También se pueden ''usar para peticiones POS''T, pero habría que crear un contexto para ello (Ver esta contribución en el Manual de PHP).&lt;br /&gt;
&lt;br /&gt;
* Es ''menos seguro que cURL'' y por eso viene desactivado por defecto en muchos entornos PHP.&lt;br /&gt;
&lt;br /&gt;
'''cURL'''&lt;br /&gt;
&lt;br /&gt;
* Es mucho ''más potente'' y para usos más avanzados.&lt;br /&gt;
&lt;br /&gt;
* cURL es probablemente ''la librería de HTTP'' más ampliamente utilizada en el mundo de la programación. Originalmente fue ''codificado utilizando lenguaje C'', y luego fue portado a muchos otros lenguajes.&lt;br /&gt;
&lt;br /&gt;
* cURL puede manejar manipulaciones ''HTTP complicadas de manera elegante'', como solicitudes HTTP asíncronas, informes de progreso, etc.&lt;br /&gt;
&lt;br /&gt;
* El único problema de cURL es que requiere algún tiempo, varias horas al menos, para familiarizarse con sus funciones y estilo de codificación. Al ser una librería tan usada, la ''documentación y ejemplos'' de código en la red son ''abundantes''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cuál es más rápido?'''&lt;br /&gt;
&lt;br /&gt;
* Todas las pruebas que he leído hasta ahora indican que ''cURL es más rápido''.&lt;br /&gt;
&lt;br /&gt;
* El siguiente gráfico es el producto de una prueba entre diferentes métodos, publicada por Philip Norton en Quickest Way To Download A Web Page With PHP&lt;br /&gt;
&lt;br /&gt;
https://es.stackoverflow.com/questions/81565/diferencias-entre-file-get-contents-y-curl&lt;br /&gt;
&lt;br /&gt;
Antes hay que asegurarse que '''curl está instalado en nuestro server apache.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get install curl-php&lt;br /&gt;
&lt;br /&gt;
sudo service apache2 restart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Instalar POSTMAN para hacer las pruebas'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wget https://dl.pstmn.io/download/latest/linux64 -O postman.tar.gz&lt;br /&gt;
sudo tar -xzf postman.tar.gz -C /opt&lt;br /&gt;
rm postman.tar.gz&lt;br /&gt;
sudo ln -s /opt/Postman/Postman /usr/bin/postman&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  // La base de datos se llama blog, la tabla &amp;quot;posts&amp;quot; y sus atributos (title, status, content, user_id)&lt;br /&gt;
	$connection=mysqli_connect('localhost','root','','blog1');&lt;br /&gt;
&lt;br /&gt;
	$request_method=$_SERVER[&amp;quot;REQUEST_METHOD&amp;quot;];&lt;br /&gt;
	switch($request_method)&lt;br /&gt;
	{&lt;br /&gt;
		case 'GET':&lt;br /&gt;
			// Retrive Products&lt;br /&gt;
			if(!empty($_GET[&amp;quot;id&amp;quot;]))&lt;br /&gt;
			{&lt;br /&gt;
				$id=intval($_GET[&amp;quot;id&amp;quot;]);  //transforma en número entero&lt;br /&gt;
				get_products($id);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				get_products();&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'POST':&lt;br /&gt;
		    insert_product();&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'PUT':&lt;br /&gt;
			// Update Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			update_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case 'DELETE':&lt;br /&gt;
			// Delete Product&lt;br /&gt;
			$id=intval($_GET[&amp;quot;id&amp;quot;]);&lt;br /&gt;
			delete_product($id);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		default:&lt;br /&gt;
			// Invalid Request Method&lt;br /&gt;
			header(&amp;quot;HTTP/1.0 405 Method Not Allowed&amp;quot;);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function insert_product()&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$title=$_REQUEST[&amp;quot;title&amp;quot;];&lt;br /&gt;
		$status=$_REQUEST[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$_REQUEST[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$_REQUEST[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		&lt;br /&gt;
		$query = &amp;quot;INSERT INTO posts (title, status, content, user_id) VALUES ('$title', '$status', '$content', '$user_id')&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Added Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Addition Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function get_products($id=0)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		global $connection;&lt;br /&gt;
		$query=&amp;quot;SELECT * FROM posts&amp;quot;;&lt;br /&gt;
		if($id!= 0)&lt;br /&gt;
		{&lt;br /&gt;
			$query.=&amp;quot; WHERE id=&amp;quot;.$id.&amp;quot; LIMIT 1&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$response=array();&lt;br /&gt;
		$result=mysqli_query($connection, $query);&lt;br /&gt;
		while($row=mysqli_fetch_array($result))&lt;br /&gt;
		{&lt;br /&gt;
			$response[]=$row;&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function delete_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		global $connection;&lt;br /&gt;
		&lt;br /&gt;
		$query=&amp;quot;DELETE FROM posts WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deleted Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Deletion Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function update_product($id)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		//(title, status, content, user_id)&lt;br /&gt;
		global $connection;&lt;br /&gt;
		parse_str(file_get_contents(&amp;quot;php://input&amp;quot;),$post_vars);  //php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, por tanto $post_vars recibirá todos los datos(título, status,content,user_id).&lt;br /&gt;
        &lt;br /&gt;
		$title=$post_vars[&amp;quot;title&amp;quot;];	&lt;br /&gt;
		$status=$post_vars[&amp;quot;status&amp;quot;];&lt;br /&gt;
		$content=$post_vars[&amp;quot;content&amp;quot;];&lt;br /&gt;
		$user_id=$post_vars[&amp;quot;user_id&amp;quot;];&lt;br /&gt;
		$query=&amp;quot;UPDATE posts SET title='{$title}', status='{$status}', content='{$content}', user_id='{$user_id}' WHERE id=&amp;quot;.$id;&lt;br /&gt;
		if(mysqli_query($connection, $query))&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 1,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updated Successfully.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$response=array(&lt;br /&gt;
				'status' =&amp;gt; 0,&lt;br /&gt;
				'status_message' =&amp;gt;'Product Updation Failed.'&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		header('Content-Type: application/json');&lt;br /&gt;
		echo json_encode($response);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close database connection&lt;br /&gt;
	mysqli_close($connection);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLIENTE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// GET &lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=1';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_HTTPGET, true);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
 print_r($response);&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=2';&lt;br /&gt;
$ch = curl_init($url);  //// abrimos la sesión cURL&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  // definimos la URL a la que hacemos la petición&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
curl_close($ch);  // recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
print_r($response);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//PUT&lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Nuevo',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;enviado&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,		&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php?id=3';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &amp;quot;PUT&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
print_r($response_json);&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
&lt;br /&gt;
//POST &lt;br /&gt;
$data=array(&lt;br /&gt;
		'title' =&amp;gt;'Television',&lt;br /&gt;
		'status' =&amp;gt; &amp;quot;1000&amp;quot;,&lt;br /&gt;
		'content' =&amp;gt; &amp;quot;10&amp;quot;,&lt;br /&gt;
		'user_id' =&amp;gt;'2'&lt;br /&gt;
);&lt;br /&gt;
$url = 'http://localhost/api/server.php';&lt;br /&gt;
$ch = curl_init($url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_POST, true); // indicamos el tipo de petición: POST&lt;br /&gt;
// definimos cada uno de los parámetros&lt;br /&gt;
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //curl_setopt($ch, CURLOPT_POSTFIELDS, &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot;);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// recibimos la respuesta y la guardamos en una variable&lt;br /&gt;
&lt;br /&gt;
$response_json = curl_exec($ch);&lt;br /&gt;
// cerramos la sesión cURL&lt;br /&gt;
curl_close($ch);&lt;br /&gt;
print_r($response_json);  //mostramos datos&lt;br /&gt;
$response=json_decode($response_json, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
También se pueden hacer llamadas al servidor mediante el terminal..&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//POST&lt;br /&gt;
curl -d &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=5&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
curl --data &amp;quot;title=value1&amp;amp;status=value2&amp;amp;content=value3&amp;amp;user_id=value4&amp;quot; http://localhost/api1/server.php&lt;br /&gt;
&lt;br /&gt;
//DELETE&lt;br /&gt;
curl -X &amp;quot;DELETE&amp;quot; http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
//GET&lt;br /&gt;
 curl --data &amp;quot;title=value1&amp;amp;si -H &amp;quot;Accept: application/json&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -X GET http://localhost/api1/server.php?id=1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EXERCICIS'''&lt;br /&gt;
&lt;br /&gt;
*Familiarizarse con cURL y crear una API con una base de datos y probar el funcionamiento de POSTMAN&lt;br /&gt;
*Encontrar como hacer un GET por consola del cURL, también probar cómo ejecutar en el terminal del servidor estos comandos.&lt;br /&gt;
&lt;br /&gt;
https://www.apptha.com/blog/how-to-build-a-rest-api-using-php/&lt;br /&gt;
&lt;br /&gt;
https://www.tmb.cat/es/sobre-tmb/herramientas-para-desarrolladores/datos-tiempo-real&lt;br /&gt;
&lt;br /&gt;
https://github.com/public-apis/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
= API RESTFUL LARAVEL =&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-qefsJtOrHo&lt;br /&gt;
&lt;br /&gt;
'''Interfaz Rutas API''' &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
https://github.com/mpociot/documentarian&lt;br /&gt;
&lt;br /&gt;
1. Crearemos la migración '''tareas''', que se encuentra en ''database/migrations''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_tareas_table --create=&amp;quot;tareas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('name',20);&lt;br /&gt;
            $table-&amp;gt;string('description',50);&lt;br /&gt;
            $table-&amp;gt;string('content',100);&lt;br /&gt;
            &lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Creamos el modelo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Tarea'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $fillable = ['name', 'description', 'content'];&lt;br /&gt;
    public $timestamps = false;  //indicamos que no queremos usar update_at y create_at en la base de datos.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Creamos el controlador TareasController&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller TareasController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use App\Tarea;  //añadimos el modelo&lt;br /&gt;
&lt;br /&gt;
class TareasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::all();&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función nos devolvera todas las tareas que tenemos en nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function store(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = new Tarea();&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
        //Esta función guardará las tareas que enviaremos&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea almacenada con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
    }&lt;br /&gt;
    public function show(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función devolverá los datos de una tarea que hayamos seleccionado para cargar el formulario con sus datos&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function update(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::findOrFail($request-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;name = $request-&amp;gt;name;&lt;br /&gt;
        $task-&amp;gt;description = $request-&amp;gt;description;&lt;br /&gt;
        $task-&amp;gt;content = $request-&amp;gt;content;&lt;br /&gt;
&lt;br /&gt;
        $task-&amp;gt;save();&lt;br /&gt;
       &lt;br /&gt;
        return $task;&lt;br /&gt;
        //Esta función actualizará la tarea que hayamos seleccionado&lt;br /&gt;
       &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
     public function destroy(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        $task = Tarea::destroy($request-&amp;gt;id);  //task tienen el id que se ha borrado&lt;br /&gt;
&lt;br /&gt;
        return response()-&amp;gt;json([&lt;br /&gt;
            &amp;quot;message&amp;quot; =&amp;gt; &amp;quot;Tarea con id =&amp;quot; . $task . &amp;quot; ha sido borrado con éxito&amp;quot;&lt;br /&gt;
        ], 201);&lt;br /&gt;
        //Esta función obtendra el id de la tarea que hayamos seleccionado y la borrará de nuestra BD&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4.Para la creación de las rutas lo añadimos en ''routes-&amp;gt;api'', en vez de routes-&amp;gt;web&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/tareas', 'TareasController@index');&lt;br /&gt;
&lt;br /&gt;
Route::put('/tareas/actualizar/{id}', 'TareasController@update');&lt;br /&gt;
&lt;br /&gt;
Route::post('/tareas/guardar', 'TareasController@store');&lt;br /&gt;
&lt;br /&gt;
Route::delete('/tareas/borrar/{id}', 'TareasController@destroy');&lt;br /&gt;
&lt;br /&gt;
Route::get('/tareas/buscar/{id}', 'TareasController@show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para listar las rutas:&lt;br /&gt;
'''&lt;br /&gt;
php artisan route:list -v'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora vamos hacer pruebas desde '''POSTMAN'''&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE:''' fijaos que la ruta es .../public/api/...&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' -&amp;gt; index&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:get.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''POST''' -&amp;gt; create&lt;br /&gt;
&lt;br /&gt;
Aspecto interesantes del post:&lt;br /&gt;
&lt;br /&gt;
*'''x-www-form-urlencoded''' Si desea enviar texto simple / datos ASCII, este es el valor predeterminado. Esta codificación es la misma que la utilizada en los parámetros de URL. Solo necesita ingresar los pares clave/valor y Postman codificará las claves y los valores correctamente&lt;br /&gt;
&lt;br /&gt;
*'''form-data:''' Pero si tiene que enviar texto no ASCII o datos binarios grandes, los datos del formulario son para eso.&lt;br /&gt;
&lt;br /&gt;
*'''Raw''' si desea enviar texto sin formato o JSON o cualquier otro tipo de cadena. Como su nombre indica, Postman envía sus datos de cadena sin procesar tal como están sin modificaciones. El tipo de datos que está enviando se puede configurar utilizando el encabezado de tipo de contenido del menú desplegable.&lt;br /&gt;
&lt;br /&gt;
*'''Binario''' se puede usar cuando desea adjuntar datos no textuales a la solicitud, por ejemplo: un archivo de video / audio, imágenes o cualquier otro archivo de datos binarios.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:post.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''GET''' para obtener con id específico -&amp;gt; show&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:show.png ||500px |center]]&lt;br /&gt;
&lt;br /&gt;
Para '''PUT''' -&amp;gt; update&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:put.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para '''DELETE''' -&amp;gt; delete&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:delete.png |500px |center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.nigmacode.com/laravel/Crear-API-REST-con-Laravel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DOCUMENTAR API ===&lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-documentar-una-api-en-laravel-usando-swagger/&lt;br /&gt;
&lt;br /&gt;
composer require zircote/swagger-php&lt;br /&gt;
&lt;br /&gt;
=API RESTFUL LARAVEL - PASSPORT TOKEN=&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL:'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/IemVQrcFrB0&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/9F85AGNmFZ0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Creamos proyecto&lt;br /&gt;
&lt;br /&gt;
'''composer create-project --prefer-dist laravel/laravel blog'''&lt;br /&gt;
&lt;br /&gt;
2. Descargamos paquete Passport&lt;br /&gt;
&lt;br /&gt;
'''composer require laravel/passport'''&lt;br /&gt;
&lt;br /&gt;
3. Luego en '''config/app.php''' añadimos el servido de Provider&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*Añadimos providers*/&lt;br /&gt;
&lt;br /&gt;
'providers' =&amp;gt;[&lt;br /&gt;
&lt;br /&gt;
Laravel\Passport\PassportServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Después de añadir el provider, generamos la migración '''php artisan migrate'''&lt;br /&gt;
&lt;br /&gt;
5. A continuación, tenemos que instalar &amp;quot;passport&amp;quot; en el proyecto y esto generará los Tokens&lt;br /&gt;
'''php artisan passport:install'''&lt;br /&gt;
&lt;br /&gt;
6. Añadimos HasApiTokens en ruta '''app/User.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App;&lt;br /&gt;
use Laravel\Passport\HasApiTokens;  /*añadimos Clase HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Notifications\Notifiable;&lt;br /&gt;
use Illuminate\Foundation\Auth\User as Authenticatable;&lt;br /&gt;
&lt;br /&gt;
class User extends Authenticatable&lt;br /&gt;
{&lt;br /&gt;
  use HasApiTokens, Notifiable;   /*añadimos HasApiTokens*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* The attributes that are mass assignable.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $fillable = [&lt;br /&gt;
'name', 'email', 'password',&lt;br /&gt;
];/**&lt;br /&gt;
* The attributes that should be hidden for arrays.&lt;br /&gt;
*&lt;br /&gt;
* @var array&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
protected $hidden = [&lt;br /&gt;
'password', 'remember_token',&lt;br /&gt;
];}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Añadimos linea '''Passport::routes();''' en ruta '''app/Providers/AuthServiceProvider.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
namespace App\Providers;&lt;br /&gt;
&lt;br /&gt;
use Laravel\Passport\Passport;  /*Añadimos Clase Passport*/&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\Gate; &lt;br /&gt;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;&lt;br /&gt;
&lt;br /&gt;
class AuthServiceProvider extends ServiceProvider &lt;br /&gt;
{ &lt;br /&gt;
    /** &lt;br /&gt;
     * The policy mappings for the application. &lt;br /&gt;
     * &lt;br /&gt;
     * @var array &lt;br /&gt;
     */ &lt;br /&gt;
    protected $policies = [ &lt;br /&gt;
        'App\Model' =&amp;gt; 'App\Policies\ModelPolicy', &lt;br /&gt;
    ];&lt;br /&gt;
&lt;br /&gt;
    /** &lt;br /&gt;
     * Register any authentication / authorization services. &lt;br /&gt;
     * &lt;br /&gt;
     * @return void &lt;br /&gt;
     */ &lt;br /&gt;
    public function boot() &lt;br /&gt;
    { &lt;br /&gt;
        $this-&amp;gt;registerPolicies(); &lt;br /&gt;
        Passport::routes();    /*añadimos esta linea*/&lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Añadimos que también nos vamos autentificar en la API en '''config/auth.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
return ['guards' =&amp;gt; [ &lt;br /&gt;
        'web' =&amp;gt; [ &lt;br /&gt;
            'driver' =&amp;gt; 'session', &lt;br /&gt;
            'provider' =&amp;gt; 'users', &lt;br /&gt;
        ], &lt;br /&gt;
        'api' =&amp;gt; [   /*añadimos linea api*/&lt;br /&gt;
            'driver' =&amp;gt; 'passport', &lt;br /&gt;
            'provider' =&amp;gt; 'users',  &lt;br /&gt;
        ], &lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Añadimos rutas en '''Routes-&amp;gt;api.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
Route::post('login', 'API\UserController@login');&lt;br /&gt;
Route::post('register', 'API\UserController@register');&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'auth:api'], function () {&lt;br /&gt;
    Route::get('details', 'API\UserController@details');&lt;br /&gt;
    Route::get('logout', 'API\UserController@logout');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. Añadimos nuestras funciones en el controlador dentro de la carpeta API&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller API\UserController'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers\API;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use App\Http\Controllers\Controller;&lt;br /&gt;
use App\User;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
use Validator;&lt;br /&gt;
&lt;br /&gt;
class UserController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public $successStatus = 200;&lt;br /&gt;
    /** &lt;br /&gt;
     * login api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function login()&lt;br /&gt;
    {&lt;br /&gt;
        if (Auth::attempt(['email' =&amp;gt; request('email'), 'password' =&amp;gt; request('password')])) {&lt;br /&gt;
            $user = Auth::user();&lt;br /&gt;
            $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
        } else {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * Register api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function register(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $validator = Validator::make($request-&amp;gt;all(), [&lt;br /&gt;
            'name' =&amp;gt; 'required',&lt;br /&gt;
            'email' =&amp;gt; 'required|email',&lt;br /&gt;
            'password' =&amp;gt; 'required',&lt;br /&gt;
            'c_password' =&amp;gt; 'required|same:password',&lt;br /&gt;
        ]);&lt;br /&gt;
        if ($validator-&amp;gt;fails()) {&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; $validator-&amp;gt;errors()], 401);&lt;br /&gt;
        }&lt;br /&gt;
        $input = $request-&amp;gt;all();&lt;br /&gt;
        $input['password'] = bcrypt($input['password']);&lt;br /&gt;
        $user = User::create($input);&lt;br /&gt;
        $success['token'] =  $user-&amp;gt;createToken('MyApp')-&amp;gt;accessToken;&lt;br /&gt;
        $success['name'] =  $user-&amp;gt;name;&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $success], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
    /** &lt;br /&gt;
     * details api &lt;br /&gt;
     * &lt;br /&gt;
     * @return \Illuminate\Http\Response &lt;br /&gt;
     */&lt;br /&gt;
    public function details()&lt;br /&gt;
    {&lt;br /&gt;
        $user = Auth::user();&lt;br /&gt;
        return response()-&amp;gt;json(['success' =&amp;gt; $user], $this-&amp;gt;successStatus);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    public function logout(Request $request)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        $isUser = $request-&amp;gt;user()-&amp;gt;token()-&amp;gt;revoke();&lt;br /&gt;
        if($isUser){&lt;br /&gt;
            $success['message'] = &amp;quot;Successfully logged out.&amp;quot;;&lt;br /&gt;
            return response()-&amp;gt;json(['success' =&amp;gt; $isUser], $this-&amp;gt;successStatus);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return response()-&amp;gt;json(['error' =&amp;gt; 'Unauthorised'], 401);&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Pruebas Postman.&lt;br /&gt;
&lt;br /&gt;
'''REGISTER'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:registrer.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/register  -&amp;gt; método POST&lt;br /&gt;
name&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
c_password&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGIN'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:login.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/login -&amp;gt; método POST&lt;br /&gt;
email&lt;br /&gt;
password&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DETAILS'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:details.png | 850px | center]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/details-&amp;gt; método GET&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:logout.png | 850px | center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
localhost/api/public/api/logout-&amp;gt; método GET&lt;br /&gt;
'accept' =&amp;gt; 'application/json',&lt;br /&gt;
'Content-Type' =&amp;gt; 'application/x-www-form-urlencoded'&lt;br /&gt;
'Authorization' =&amp;gt; 'Bearer '.$NuestroToken,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/47745884/laravel-passport-vs-jwt-vs-oauth2-vs-auth0&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
=Webgrafia=&lt;br /&gt;
*http://wiki.netbeans.org/IniciandoseRESTful&lt;br /&gt;
&lt;br /&gt;
*NetBeans soap: https://netbeans.org/kb/docs/websvc/jax-ws.html&lt;br /&gt;
*JAX-WS http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html&lt;br /&gt;
*JAX-RS http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html&lt;br /&gt;
*http://www.java2blog.com/2013/03/soap-web-service-tutorial.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://frikibloggeo.blogspot.com/2017/01/crear-un-web-service-api-rest-con-php-y.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= XML =&lt;br /&gt;
En aquest apartat es veurà com utilitzar XML per guardar dades des de un servidor PHP.&lt;br /&gt;
Exemple de XML:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
Fitxer aules.xml:&lt;br /&gt;
&amp;lt;aules&amp;gt;   &lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;205&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.205.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;filtra&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
    &amp;lt;aula&amp;gt;&lt;br /&gt;
        &amp;lt;nom&amp;gt;206&amp;lt;/nom&amp;gt;&lt;br /&gt;
        &amp;lt;subxarxa&amp;gt;172.16.206.0&amp;lt;/subxarxa&amp;gt;&lt;br /&gt;
        &amp;lt;mascara&amp;gt;24&amp;lt;/mascara&amp;gt;&lt;br /&gt;
        &amp;lt;estatinicial&amp;gt;denega&amp;lt;/estatinicial&amp;gt;&lt;br /&gt;
        &amp;lt;estatactual&amp;gt;denega&amp;lt;/estatactual&amp;gt;&lt;br /&gt;
    &amp;lt;/aula&amp;gt;&lt;br /&gt;
&amp;lt;/aules&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Per representar aquest fitxer com a un arbre i poder-lo recòrrer s'utilitza la llibreria DOMDocument de PHP.&lt;br /&gt;
&lt;br /&gt;
== Creació del Arbre XML ==&lt;br /&gt;
Per crear una representació del fitxer anterior, primer s'ha de crear l'objecte DOMDocument i a continuació llegir el fitxer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$file = &amp;quot;files/aules.xml&amp;quot;;&lt;br /&gt;
$xmldom = new DOMDocument();&lt;br /&gt;
$xmldom-&amp;gt;load($file);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obtenir un element del arbre ==&lt;br /&gt;
Es pot utilitzar la funció ''getElementsByTagName''. Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recòrrer tots els elemens ==&lt;br /&gt;
Podem recòrrer tots els element amb un foreach:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
foreach ($aules as $aula) {&lt;br /&gt;
    $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $net = $aula-&amp;gt;getElementsByTagName(&amp;quot;subxarxa&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
    $mask = $aula-&amp;gt;getElementsByTagName(&amp;quot;mascara&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Afegir un nou element ==&lt;br /&gt;
Per afegir un nou elment s'ha de crear un node nou i afegir tos els fills que es necessiti per crear el XML correcte.&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$auladom = $xmldom-&amp;gt;createElement(&amp;quot;aula&amp;quot;);&lt;br /&gt;
//creamos el nodo NOM con su valor $classroomname&lt;br /&gt;
$aulanomdom = $xmldom-&amp;gt;createElement(&amp;quot;nom&amp;quot;);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($classroomName));&lt;br /&gt;
$aulanomdom-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanomdom);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo NETWORK con su valor $network&lt;br /&gt;
$aulanetwork = $xmldom-&amp;gt;createElement(XARXA_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($network));&lt;br /&gt;
$aulanetwork-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulanetwork);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo MASK con su valor $mask&lt;br /&gt;
$aulamask = $xmldom-&amp;gt;createElement(MASK_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($mask));&lt;br /&gt;
$aulamask-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulamask);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo initial status con su valor $initialstatus&lt;br /&gt;
$aulastatus = $xmldom-&amp;gt;createElement(INIT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulastatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulastatus);&lt;br /&gt;
&lt;br /&gt;
//creamos el nodo current status con su valor $initialstatus&lt;br /&gt;
$aulacurrentstatus = $xmldom-&amp;gt;createElement(CURRENT_AULA_XML);&lt;br /&gt;
$domnode = $xmldom-&amp;gt;createTextNode(strtolower($initialstatus));&lt;br /&gt;
$aulacurrentstatus-&amp;gt;appendChild($domnode);&lt;br /&gt;
$auladom-&amp;gt;appendChild($aulacurrentstatus);&lt;br /&gt;
&lt;br /&gt;
//afegim el node aula a la llista de nodes&lt;br /&gt;
$root = $xmldom-&amp;gt;documentElement;&lt;br /&gt;
$root-&amp;gt;appendChild($auladom);&lt;br /&gt;
&lt;br /&gt;
//guardem        &lt;br /&gt;
$xmldom-&amp;gt;save($filename);  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Esborrar un element ==&lt;br /&gt;
Per esborrar un element, primer s'ha de cercar, després dir-li al pare que ens volem eliminar. Però també hem d'esborrar els fills!.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//funció que esborra un node i els seus fills&lt;br /&gt;
    function deleteNode($node) {&lt;br /&gt;
        deleteChildren($node);&lt;br /&gt;
        $parent = $node-&amp;gt;parentNode;&lt;br /&gt;
        $oldnode = $parent-&amp;gt;removeChild($node);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//funció que esborra els fills d'un node&lt;br /&gt;
    function deleteChildren($node) {&lt;br /&gt;
        while (isset($node-&amp;gt;firstChild)) {&lt;br /&gt;
            deleteChildren($node-&amp;gt;firstChild);&lt;br /&gt;
            $node-&amp;gt;removeChild($node-&amp;gt;firstChild);&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
    &lt;br /&gt;
//funció que cerca al XML un node amb el nom=$classroomname    &lt;br /&gt;
    function delete($classroomName){&lt;br /&gt;
         $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
          foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                deleteNode($aula);&lt;br /&gt;
                $xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
== Modificar un valor ==&lt;br /&gt;
Per modificar un valor, primer es cerca i després es mira quin dels atributs es vol modificar:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function setNewClassroomAttr($classroomName, $attr, $value)&lt;br /&gt;
    {&lt;br /&gt;
        $aules = $xmldom-&amp;gt;getElementsByTagName(&amp;quot;aula&amp;quot;);&lt;br /&gt;
        foreach ($aules as $aula) {&lt;br /&gt;
            $name = $aula-&amp;gt;getElementsByTagName(&amp;quot;nom&amp;quot;)-&amp;gt;item(0)-&amp;gt;nodeValue;&lt;br /&gt;
            if (strcmp(strtolower($name), strtolower($classroomName)) == 0){&lt;br /&gt;
                $aula-&amp;gt;getElementsByTagName($attr)-&amp;gt;item(0)-&amp;gt;nodeValue = strtolower($value);&lt;br /&gt;
                $this-&amp;gt;xmldom-&amp;gt;save($this-&amp;gt;filename);   &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Finalment, s'ha de guardar el dom resultant al fitxer per mantenir correctament els canvis. Es fa amb la funció ''save''.&lt;br /&gt;
&lt;br /&gt;
Podeu trobar més informació a http://www.php.net/manual/en/class.domdocument.php&lt;br /&gt;
&lt;br /&gt;
=Mashups=&lt;br /&gt;
&lt;br /&gt;
Una remescla, també coneguda pel terme anglès '''mashup''', és una aplicació web híbrida que utilitza contingut d'altres aplicacions web per a crear un nou contingut complet, consumint serveis directament sempre a través del protocol http.&lt;br /&gt;
&lt;br /&gt;
El contingut d'un mashup normalment prové de llocs web de tercers a través d'una interfície pública o utilitzant una API. Altres mètodes que constitueixen l'origen de les seves dades inclouen: sindicació web (RSS o Atom), screen scraping, etc.&lt;br /&gt;
&lt;br /&gt;
Els mashup estan revolucionant el desenvolupament web de la mateixa manera que els weblogs han revolucionat la publicació en línia. Permeten que qualsevol combini, de forma innovadora, dades que existeixen en diferents pàgines web. Requereixen pocs coneixements tècnics, les API existents són senzilles i potents i els mashup són relativament fàcils de dissenyar. Els creadors de mashups són generalment gent innovadora que vol combinar de formes noves i creatives dades disponibles públicament.&lt;br /&gt;
&lt;br /&gt;
==API de Google Maps==&lt;br /&gt;
A continuació trobareu un llistat amb les funcions més interesant de la API de Googlem maps que podeu utilitzar per realitzar mashups.&lt;br /&gt;
&lt;br /&gt;
Primer heu d'afegir la llibreria de google Maps:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Després heu de un contenidor per al mapa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada teniu el contenidor heu de crear el mapa. Per crea-lo necessiteu informar a l'API de google maps unes quantes propietats:&lt;br /&gt;
* '''center''': Indica on ha de centrar el mapa. S'ha de donar les coordenades de latitud i longitud.&lt;br /&gt;
* '''zoom''': Indica el nivel de ZOOM del mapa. Zomm = 0   mostra la terra sencera.&lt;br /&gt;
* '''mapTypeId''': Indica el tipus de Mapa a mostrar. Existeixen els següents tipus de mapa: ROADMAP, SATELLITE, HYBRID, TERRAIN.&lt;br /&gt;
&lt;br /&gt;
Exemple de les propietats:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
var mapProp = {&lt;br /&gt;
  center:new google.maps.LatLng(51.508742, -0.120850),&lt;br /&gt;
  zoom: 7,&lt;br /&gt;
  mapTypeId: google.maps.MapTypeId.ROADMAP&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha definit les propietats ja es pot crear el mapa i un listener:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;), mapProp);&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de mapa centrat a londres:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;http://maps.googleapis.com/maps/api/js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function initialize() {&lt;br /&gt;
  var mapProp = {&lt;br /&gt;
    center:new google.maps.LatLng(51.508742,-0.120850),&lt;br /&gt;
    zoom:5,&lt;br /&gt;
    mapTypeId:google.maps.MapTypeId.ROADMAP&lt;br /&gt;
  };&lt;br /&gt;
  var map=new google.maps.Map(document.getElementById(&amp;quot;googleMap&amp;quot;),mapProp);&lt;br /&gt;
}&lt;br /&gt;
google.maps.event.addDomListener(window, 'load', initialize);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;googleMap&amp;quot; style=&amp;quot;width:500px;height:380px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bé, ja tenim creat el mapa. Potser ens interessa afegir alguna marca dintre del mapa. Aquestes marques s'anomenen '''overlays''' i poden ser de diferents tipus:&lt;br /&gt;
* '''Marker''' - Localitzacions úniques del mapa. Poden tenir icones personalitzats.&lt;br /&gt;
* '''Polyline''' - Series de línies rectes en el mapa&lt;br /&gt;
* '''Polygon''' - Series de línies rectes en el mapa pero la forma resultant ha d'estar tancada.&lt;br /&gt;
* '''Circle and Rectangle'''&lt;br /&gt;
* '''Info Windows''' - Mostra contingut dintre de popups.&lt;br /&gt;
* '''marques personalitzades'''&lt;br /&gt;
https://www.w3schools.com/graphics/google_maps_intro.asp&lt;br /&gt;
&lt;br /&gt;
Exemples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    animation: google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;width:100%;height:500px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function myMap() {&lt;br /&gt;
  var mapCanvas = document.getElementById(&amp;quot;map&amp;quot;);&lt;br /&gt;
  var myCenter = new google.maps.LatLng(51.508742,-0.120850); &lt;br /&gt;
  var mapOptions = {center: myCenter, zoom: 5};&lt;br /&gt;
  var map = new google.maps.Map(mapCanvas,mapOptions);&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: myCenter,&lt;br /&gt;
    icon: &amp;quot;pinkball.png&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
  marker.setMap(map);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maps.googleapis.com/maps/api/js?key=AIzaSyBu-916DdpKAjTmJNIgngS6HL_kDIKU0aU&amp;amp;callback=myMap&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//basic:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//Amb animació:&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  animation:google.maps.Animation.BOUNCE&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
//amb una icona&lt;br /&gt;
var marker=new google.maps.Marker({&lt;br /&gt;
  position:myCenter,&lt;br /&gt;
  icon:'pinkball.png'&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
marker.setMap(map);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//amb un poligon&lt;br /&gt;
var myTrip = [stavanger,amsterdam,london,stavanger];&lt;br /&gt;
var flightPath = new google.maps.Polygon({&lt;br /&gt;
  path:myTrip,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb un cercle&lt;br /&gt;
var myCity = new google.maps.Circle({&lt;br /&gt;
  center:amsterdam,&lt;br /&gt;
  radius:20000,&lt;br /&gt;
  strokeColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  strokeOpacity:0.8,&lt;br /&gt;
  strokeWeight:2,&lt;br /&gt;
  fillColor:&amp;quot;#0000FF&amp;quot;,&lt;br /&gt;
  fillOpacity:0.4&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//amb una finestra d'informacio&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
infowindow.open(map,marker);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
També podem afegir un listener a un marker per, per exemple, obrir un infowindow quan es faci click en ell:&lt;br /&gt;
&amp;lt;source lnag=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
  content:&amp;quot;Hello World!&amp;quot;&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
google.maps.event.addListener(marker, 'click', function() {&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple de posicionament d'un marker on l'usuari fa click i a més a més afegeix un infowindow:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
google.maps.event.addListener(map, 'click', function(event) {&lt;br /&gt;
  placeMarker(event.latLng);&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
function placeMarker(location) {&lt;br /&gt;
  var marker = new google.maps.Marker({&lt;br /&gt;
    position: location,&lt;br /&gt;
    map: map,&lt;br /&gt;
  });&lt;br /&gt;
  var infowindow = new google.maps.InfoWindow({&lt;br /&gt;
    content: 'Latitude: ' + location.lat() +&lt;br /&gt;
    '&amp;lt;br&amp;gt;Longitude: ' + location.lng()&lt;br /&gt;
  });&lt;br /&gt;
  infowindow.open(map,marker);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podeu trobar la referència complerta de la API de google maps [http://www.w3schools.com/googleapi/google_maps_ref.asp | aqui].&lt;br /&gt;
&lt;br /&gt;
APIS&lt;br /&gt;
https://github.com/toddmotto/public-apis/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
== Com trobar les coordenades d'una ciutat ==&lt;br /&gt;
Podeu utilitzar l'API de google per trobar les coordenades d'una ciutat. Pots fer-ho de dues maneres:&lt;br /&gt;
Exemple1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$address = 'india';&lt;br /&gt;
$details_url = &amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=&amp;quot;.$address.&amp;quot;&amp;amp;sensor=falsecurl_init();&lt;br /&gt;
curl_setopt($ch, CURLOPT_URL, $details_url);&lt;br /&gt;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
$response = json_decode(curl_exec($ch), true);&lt;br /&gt;
&lt;br /&gt;
// If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST&lt;br /&gt;
if ($response['status'] != 'OK') {&lt;br /&gt;
	return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//print_r($response);&lt;br /&gt;
//print_r($response['results'][0]['geometry']['location']);&lt;br /&gt;
&lt;br /&gt;
$latLng = $response['results'][0]['geometry']['location'];&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng['lat'];&lt;br /&gt;
$lng = $latLng['lng'];	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple2:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$geocode_stats = file_get_contents(&amp;quot;http://maps.googleapis.com/maps/api/geocode/json?address=india&amp;amp;sensor=false&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$output_deals = json_decode($geocode_stats);&lt;br /&gt;
&lt;br /&gt;
$latLng = $output_deals-&amp;gt;results[0]-&amp;gt;geometry-&amp;gt;location;&lt;br /&gt;
&lt;br /&gt;
$lat = $latLng-&amp;gt;lat;&lt;br /&gt;
$lng = $latLng-&amp;gt;lng;	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15470</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15470"/>
				<updated>2021-04-08T16:52:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración. Hay que tener instalado el git y el ssh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15469</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15469"/>
				<updated>2021-04-08T16:35:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15468</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15468"/>
				<updated>2021-04-08T16:35:01Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
cd proyecto&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15467</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15467"/>
				<updated>2021-04-08T16:34:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer create-project laravel/laravel --prefer-dist laravel-exey&lt;br /&gt;
&lt;br /&gt;
cd laravel-exey&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15466</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15466"/>
				<updated>2021-04-08T16:30:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* PRODUCCIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit, lo malo que tiene dos días de duración.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer create-project laravel/laravel --prefer-dist laravel-exey&lt;br /&gt;
&lt;br /&gt;
cd laravel-exey&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15465</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15465"/>
				<updated>2021-04-08T16:29:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJERCICIO 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;br /&gt;
&lt;br /&gt;
===PRODUCCIÓN===&lt;br /&gt;
&lt;br /&gt;
Vamos a subir un proyecto de Laravel en un servidor hosting concretamente fortrabbit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
php artisan cache:clear //Limpiar el caché de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan route:clear //Limpiar las rutas de la Aplicación.&lt;br /&gt;
&lt;br /&gt;
php artisan config:clear //Limpiar las configuraciones de la Aplicación&lt;br /&gt;
&lt;br /&gt;
php artisan view:clear  //Limpiar las vistas de la Aplicación&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En nuestro fichero archivo .env de nuestra aplicación, cambiaremos las valores de:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
APP_ENV = production&lt;br /&gt;
APP_DEBUG = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Después de eso nos disponemos a subir el proyecto &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
composer create-project laravel/laravel --prefer-dist laravel-exey&lt;br /&gt;
&lt;br /&gt;
cd laravel-exey&lt;br /&gt;
&lt;br /&gt;
git init&lt;br /&gt;
&lt;br /&gt;
git add -A&lt;br /&gt;
&lt;br /&gt;
git commit -m 'Initial'&lt;br /&gt;
&lt;br /&gt;
git remote add fortrabbit laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com:laravel-exey.git  //hay que buscar en la configuración de la página y cambiar el comando git&lt;br /&gt;
&lt;br /&gt;
git push -u fortrabbit master&lt;br /&gt;
&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a exportar la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ssh laravel-exey.cej3ggri1ze7ej4q@deploy.eu2.frbit.com   //hay que buscar en la configuración de la página y cambiar el comando con el mysql&lt;br /&gt;
&lt;br /&gt;
php artisan migrate --force&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15445</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15445"/>
				<updated>2021-04-06T15:27:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
  &amp;lt;!--:[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15442</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15442"/>
				<updated>2021-04-06T13:49:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
&amp;lt;!--:[[solució exercici1-Ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
&amp;lt;!-- :[[solució exercici espera]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 &amp;lt;!--:[[solució exercici2-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 &amp;lt;!--:[[solució exercici3-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;!--:[[solució exercici-nom]]--&amp;gt;&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
 :[[solució exercici4-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
&amp;lt;!--:[[solució exercici6-ajax]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15408</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15408"/>
				<updated>2021-03-24T17:58:04Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* CREAR MODELOS ELOQUENT desde la BASE DATOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15407</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15407"/>
				<updated>2021-03-24T17:57:53Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* CREAR MODELOS ELOQUENT desde la BASE DATOS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Publicas el fichero de configuración:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan vendor:publish --tag=reliese-models&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15382</id>
		<title>NF2 - Framework Laravel</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF2_-_Framework_Laravel&amp;diff=15382"/>
				<updated>2021-03-22T19:42:02Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* AUTENTIFICACIÓN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ESTRUCTURA DIRECTORIOS'''&lt;br /&gt;
&lt;br /&gt;
===COMANDOS INDISPENSABLES LARAVEL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*CREAR PROYECTOS*/&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto&lt;br /&gt;
&lt;br /&gt;
composer create-project --prefer-dist laravel/laravel proyecto &amp;quot;6.0&amp;quot;  //especificamos la versión&lt;br /&gt;
&lt;br /&gt;
composer require facade/ignition   //instalar nueva página errores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*CONTROLADORES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:controller PeliculasController //añadir CONTROLADOR vacio&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Trainer -m  //crea el modelo Trainer y además hace la migracion&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Task -mcr  //modelo migracion controlador&lt;br /&gt;
&lt;br /&gt;
/*MODELO*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:model Categoria &lt;br /&gt;
&lt;br /&gt;
/*MIGRACIONES*/&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;  //creamos la migración (la tabla en la base de datos es en plural y el modelo en singular)&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration anadir_telefono_tabla_cate --table=&amp;quot;categorias&amp;quot; //editar tabla (podemos crear otra migración con otro atributo)&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:rollback  //deshacer la última migración ejecutada y registrada en la base de datos.&lt;br /&gt;
&lt;br /&gt;
php artisan migrate:fresh  //borra la base de datos y la carga de nuevo.&lt;br /&gt;
&lt;br /&gt;
/*RUTAS*/&lt;br /&gt;
&lt;br /&gt;
php artisan routes //genera todas las rutas get,put,post de un crud... Route::resource()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v    ////Para listar las rutas, en terminal &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Estructura Laravel 6===&lt;br /&gt;
&lt;br /&gt;
:[[Estructura Laravel]]&lt;br /&gt;
&lt;br /&gt;
===RUTAS BÁSICAS===&lt;br /&gt;
&lt;br /&gt;
Dentro de Routers -&amp;gt; Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('mundo', function () {&lt;br /&gt;
    return 'Hello World';&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le pasamos a la ruta un identificador que tendrá un valor por defecto y esa ruta tendrá un nombre&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//dentro de la misma vista, asignamos valor por defecto&lt;br /&gt;
Route::get('/show/{id?}',function($id=&amp;quot;122&amp;quot;){&lt;br /&gt;
&lt;br /&gt;
    return $id;&lt;br /&gt;
    &lt;br /&gt;
    })-&amp;gt;name('show');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra forma de ruta y utilizando un pattern númerico (sólo pueden introducir números)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/par-o-impar-{numero}',function($numero){    // no hace falta usar '/'&lt;br /&gt;
&lt;br /&gt;
return $numero;&lt;br /&gt;
&lt;br /&gt;
//return redirect()-&amp;gt;to('/show/3');  -&amp;gt; te redirije a la ruta que le indicas &lt;br /&gt;
//return redirect()-&amp;gt;route('show')  -&amp;gt; te redirije a la ruta que tiene el nombre asignado en el name.&lt;br /&gt;
//return redirect()-&amp;gt;route('show',['id' =&amp;gt; '222'])  -&amp;gt; en caso de pasarle algun parámetro&lt;br /&gt;
} )-&amp;gt;where(['number' =&amp;gt; '[\d]+']);    // de esta forma añadimos una expresion regular para que solo puedan introducir numeros&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Restricciones con Expresiones Regulares'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('user/{name}', function ($name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('name', '[A-Za-z]+');   //nomes poden passar lletres miníscules o Majúscules como mínim una volta &lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}', function ($id) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where('id', '[0-9]+');   //com a mínim, a soles podem passar com a mínim un nombre.&lt;br /&gt;
&lt;br /&gt;
Route::get('user/{id}/{name}', function ($id, $name) {&lt;br /&gt;
    //&lt;br /&gt;
})-&amp;gt;where(['id' =&amp;gt; '[0-9]+', 'name' =&amp;gt; '[a-z]+']);   //le pasamos un array en caso de más de un elemento.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ruta en función del ROLE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 // en el navegador puedes poner /admin/modificar-usuario  o  /admin/insertar-usuario&lt;br /&gt;
Route::group(['prefix'=&amp;gt;'admin'],function(){ &lt;br /&gt;
    &lt;br /&gt;
    Route::get('modificar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;modifica usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Route::get('insertar-usuario',function(){&lt;br /&gt;
&lt;br /&gt;
    return &amp;quot;insertar usuario&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ruta que nos lleva directamente a una vista e incluso pasarle un argumento.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/welcome', 'welcome');  //en el caso que sólo queramos enviar a una vista sin pasar por el controlador&lt;br /&gt;
&lt;br /&gt;
Route::view('/welcome', 'welcome', ['name' =&amp;gt; 'Taylor']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificamos que podemos usar GET y POST para una ruta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP múltiples&lt;br /&gt;
Route::match(['get', 'post'], '/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//verbos HTTP cualquiera&lt;br /&gt;
Route::any('/', function () {&lt;br /&gt;
    //&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos un controlador vacio, App-&amp;gt;http-&amp;gt;Controller-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:controller MoviesController --plain&lt;br /&gt;
&lt;br /&gt;
//en route&lt;br /&gt;
Route::get('/ejemplo', 'PeliculasController@index');&lt;br /&gt;
&lt;br /&gt;
//en controlador&lt;br /&gt;
public function index(){&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;hola Julio&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/dbushell/Nestable&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@cvallejo/los-mejores-30-tips-de-laravel-d0c96a1c900e&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/tips-por-temas/laravel/&lt;br /&gt;
&lt;br /&gt;
https://pablomonteserin.com/curso/laravel/&lt;br /&gt;
&lt;br /&gt;
===VISTA===&lt;br /&gt;
Podemos aprovechar herencia en las vistas, por ello, vamos a crear.&lt;br /&gt;
&lt;br /&gt;
También podemos crear una carpeta que contiene vistas &amp;quot;menú&amp;quot; y dentro las páginas, para acceder a ellos, habría que poner &amp;quot;menu.pagina&amp;quot; &lt;br /&gt;
&lt;br /&gt;
'''Vista Padre LAYOUT.blade.php'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&lt;br /&gt;
        @yield('titulo')&lt;br /&gt;
    &amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#home&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#news&amp;quot;&amp;gt;News&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#contact&amp;quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#about&amp;quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@yield('contenido')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vista Layout Hija hija.blade.php'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layout')&lt;br /&gt;
&lt;br /&gt;
@section('titulo','Página Heredada')&lt;br /&gt;
&lt;br /&gt;
@section('contenido')&lt;br /&gt;
    &amp;lt;h1&amp;gt;Página Hija&amp;lt;/h1&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SESIONES===&lt;br /&gt;
https://laravel.com/docs/6.x/session&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*diferentes formas de crear variables de sesión en el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;put(['Julio'=&amp;gt;'Administrador']); //crea variable sesión con clave Julio y valor Administrador&lt;br /&gt;
&lt;br /&gt;
session(['nombre'=&amp;gt;'Julio']); //otra forma de crear variables sesión&lt;br /&gt;
&lt;br /&gt;
$nombre= session('nombre')  &lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;forget('Juan'); //Borra Juan&lt;br /&gt;
&lt;br /&gt;
$request-&amp;gt;session()-&amp;gt;flush(); //borra todo&lt;br /&gt;
&lt;br /&gt;
return $request-&amp;gt;session()-&amp;gt;all();  //muestra todas las variables de sesión &lt;br /&gt;
dd(session()-&amp;gt;all()) //muestra todas las variables de sesión&lt;br /&gt;
&lt;br /&gt;
/*mostrar variables sesión en blade VISTA*/&lt;br /&gt;
&lt;br /&gt;
{{session('julio')}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MENSAJES FLASH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//cuando en una página queremos enviar un mensaje flahs podemos poner&lt;br /&gt;
&lt;br /&gt;
return back()-&amp;gt;with('status','hemos recibido el mensaje'); //guardamos un mensaje flash&lt;br /&gt;
&lt;br /&gt;
//luego en la misma pagina (back) ponemos una condicion en blade si hay mensaje de sesion muestra sino formulario.&lt;br /&gt;
 @if(session('status'))&lt;br /&gt;
{{session('status')}}&lt;br /&gt;
@else&lt;br /&gt;
 formulario&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
//como vamos a repetir este codigo en muchos lados, podemos ponerlo en un fichero partial (resources-views-partial) y luego en el codigo lo sustituimos por @include en el editar.blade.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ALERT SWEET===&lt;br /&gt;
https://sweetalert.js.org/guides/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ponerlo debajo del DOM en la vista&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
@if (session('success'))&lt;br /&gt;
swal(&amp;quot;Buen Trabajo!&amp;quot;, &amp;quot;{{ session('success') }}&amp;quot;, &amp;quot;success&amp;quot;);&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//en el controlador &lt;br /&gt;
return back()-&amp;gt;with('success','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOASTR===&lt;br /&gt;
&lt;br /&gt;
En la página siguiente podemos hacer las modificaciones del script como más nos guste y sustituirlo en vez &amp;quot;toastr.info(....);&amp;quot;&lt;br /&gt;
&lt;br /&gt;
https://codeseven.github.io/toastr/demo.html&lt;br /&gt;
&lt;br /&gt;
https://github.com/CodeSeven/toastr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
&amp;lt;!--Añadir librerias BOOTSTRAP--&amp;gt;&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Añadir librerias TOASTR--&amp;gt;&lt;br /&gt;
  &amp;lt;link href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/css/toastr.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    @if(Session::has('info'))&lt;br /&gt;
        toastr.info(&amp;quot;{{ session('info') }}&amp;quot;);&lt;br /&gt;
    @endif&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
return back()-&amp;gt;with('info','Hemos recibido el mensaje');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BASES DE DATOS - ORM===&lt;br /&gt;
&lt;br /&gt;
Para crear una base de datos empezaremos con una tabla, es recomendable primero crear la migracion que corresponde con la tabla en la base de datos &amp;quot;articulos&amp;quot; y a continuación crearemos el modelo que corresponde con la entidad &amp;quot;Articulo&amp;quot;. Es preferible crearlo en ese orden, también hay que tener cuidado a la hora de crear la migración en plural y la entidad en singular.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Tabla articulos&lt;br /&gt;
 Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
          });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''IMPORTANTE -  TIPOS DE COLUMNAS'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/migrations#creating-columns&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Articulo'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Articulo&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';  //hacemos referencia a la tabla artículos&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];   //fillable para proteger los campos que desea que permitan la actualización a la hora de insertar en la base de datos por asignación masiva&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SEEDER (SEMILLAS)===&lt;br /&gt;
&lt;br /&gt;
'''SEEDER normal'''&lt;br /&gt;
&lt;br /&gt;
1. Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
2. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//y en la clase NombreSeeder:&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Illuminate\Support\Facades\Hash;&lt;br /&gt;
use Illuminate\Support\Str;&lt;br /&gt;
&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
  for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
        DB::table('projects')-&amp;gt;insert([&lt;br /&gt;
            'title' =&amp;gt; Str::random(10),&lt;br /&gt;
            'description' =&amp;gt; Str::random(10).'@gmail.com',&lt;br /&gt;
            'created_at' =&amp;gt; date('Y-m-d'),&lt;br /&gt;
            'updated_at' =&amp;gt; date('Y-m-d')        ]);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/seeding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''CLASE FAKER'''&lt;br /&gt;
&lt;br /&gt;
Para utilizar la clase FAKER, viene a ser igual que la Seeder que trae por defecto Laravel. Página oficial https://github.com/fzaninotto/Faker#formatters&lt;br /&gt;
&lt;br /&gt;
1. Instalamos la libreria en terminal '''composer require fzaninotto/faker'''&lt;br /&gt;
&lt;br /&gt;
2.  Ejecutamos en terminal '''php artisan make:seeder NombreSeeder'''&lt;br /&gt;
&lt;br /&gt;
3. podemos ver que dentro de '''database-&amp;gt;seeds''' se genera la nueva semilla e introducimos los siguientes datos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//si queremos utilizar la clase FAKER&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Database\Seeder;&lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
use Faker\Factory as Faker;&lt;br /&gt;
&lt;br /&gt;
class ContactosSeeder extends Seeder&lt;br /&gt;
{&lt;br /&gt;
  public function run(){&lt;br /&gt;
    // puntero para recorrer Faker&lt;br /&gt;
    $handle = Faker::create();&lt;br /&gt;
&lt;br /&gt;
    for ($i=0; $i&amp;lt;10; $i++) {&lt;br /&gt;
      DB::table('contactos')-&amp;gt;insert([&lt;br /&gt;
        'nombre' =&amp;gt; $handle-&amp;gt;firstName,&lt;br /&gt;
        'apellidos' =&amp;gt; $handle-&amp;gt;lastName,&lt;br /&gt;
        'created_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null),&lt;br /&gt;
        'updated_at' =&amp;gt; $handle-&amp;gt;dateTime($max = 'now', $timezone = null)&lt;br /&gt;
      ]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. luego en la clase '''DataBaseSeeder''' (otro fichero que ya está creado) activamos dentro de la clase '''$this-&amp;gt;call(NombreSeeder::class);'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
.....&lt;br /&gt;
  public function run()&lt;br /&gt;
    {&lt;br /&gt;
       $this-&amp;gt;call(NombreSeeder::class);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Para generar los datos insertarmos en terminal  '''php artisan db:seed'''&lt;br /&gt;
&lt;br /&gt;
===CONSTRUCTOR DE CONSULTAS (Query Builder)===&lt;br /&gt;
Cuando estamos usando conexiones múltiple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//añadimos &lt;br /&gt;
use Illuminate\Support\Facades\DB;&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
//obtenemos todos los usuarios&lt;br /&gt;
$users = DB::table('users')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
foreach ($users as $user)&lt;br /&gt;
{&lt;br /&gt;
    echo $user-&amp;gt;name;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Más ejemplos de consultas&lt;br /&gt;
$user = DB::table('users')-&amp;gt;first();&lt;br /&gt;
&lt;br /&gt;
$user = DB::table('users')-&amp;gt;where('name', 'julio')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('edad', '&amp;gt;', 100)-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('estado', '&amp;lt;&amp;gt;', 'active')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$users = DB::table('users')-&amp;gt;where('name', 'like', 'J%')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
//insertar&lt;br /&gt;
DB::table('Articulos')-&amp;gt;insert(&lt;br /&gt;
        ['titulo'=&amp;gt;&amp;quot;pepe&amp;quot;,'descripcion'=&amp;gt;&amp;quot;nuevadescripcion&amp;quot;]&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
//update&lt;br /&gt;
&lt;br /&gt;
DB::table('datos')&lt;br /&gt;
              -&amp;gt;where('id', 1)&lt;br /&gt;
              -&amp;gt;update(['nombre' =&amp;gt; 'Estefania']);&lt;br /&gt;
&lt;br /&gt;
//delete&lt;br /&gt;
DB::table('datos')-&amp;gt;delete();&lt;br /&gt;
DB::table('datos')-&amp;gt;where('votes', '&amp;gt;', 100)-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/queries&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS SQL NATIVAS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//seleccionar&lt;br /&gt;
$results = DB::select('select * from users where id = :id', ['id' =&amp;gt; 1]);&lt;br /&gt;
&lt;br /&gt;
//insertar en la Base users&lt;br /&gt;
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);&lt;br /&gt;
&lt;br /&gt;
//borrar&lt;br /&gt;
$deleted = DB::delete('delete from users');&lt;br /&gt;
&lt;br /&gt;
//Ejecutando una instrucción general que no devuelve ningún valor&lt;br /&gt;
DB::statement('drop table users');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/database.html#ejecutando-consultas-sql-nativas&lt;br /&gt;
&lt;br /&gt;
===ELOQUENT===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$escritores=Escritor::all();  //$escritores=Escritor::get();&lt;br /&gt;
&lt;br /&gt;
$escritoresOrdenados=Escritor::orderBy('nombre','DESC')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::findOrFail(1);&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::where('edad', '&amp;gt;', 100)-&amp;gt;firstOrFail();&lt;br /&gt;
&lt;br /&gt;
$escritor= App\Escritor::whereEdad(100)-&amp;gt;get();  //es más eficiente especificar las columnas Escritor::select('id','name')-&amp;gt;whereEdad(100)-&amp;gt;get()&lt;br /&gt;
&lt;br /&gt;
$EscritoresUlti=Escritor::latest('created_at')-&amp;gt;get();   //muestra los últimos que se han añadido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//insertar&lt;br /&gt;
        $escritor = new Escritor();  &lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Julio';    &lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
//actualizar&lt;br /&gt;
        $escritor = Escritor::find(1);  //$escritor = App/Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;nombre = 'Pepe';     //$request-&amp;gt;name;&lt;br /&gt;
        $escritor-&amp;gt;save();&lt;br /&gt;
//borrar&lt;br /&gt;
        $escritor= App\Escritor::find(1);&lt;br /&gt;
        $escritor-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''all()''' devuelve todos los elementos de una tabla.&lt;br /&gt;
&lt;br /&gt;
*'''find($id)''' coge una id y devuelve un sólo modelo. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''findOrFail($id)''' toma una idy devuelve un sólo modelo. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''first()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, devuelve '''null'''.&lt;br /&gt;
&lt;br /&gt;
*'''firstOrFail()''' devuelve el primer registro encontrado en la base de datos. Si no existe un modelo coincidente, arroja un error1 404.&lt;br /&gt;
&lt;br /&gt;
*'''get()''' devuelve una colección de modelos que coinciden con la consulta.&lt;br /&gt;
&lt;br /&gt;
*'''findOrCreate()''' en el caso que no existe en la BD, lo crea.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dato=Escritor::firstOrCreate(['nombre'=&amp;gt;'Estefania','edad'=&amp;gt;'32']);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate&lt;br /&gt;
&lt;br /&gt;
*'''toArray()''' convierte el modelo / colección en una matriz PHP simple.&lt;br /&gt;
&lt;br /&gt;
*'''Pluck()''' en caso de obtener una colección y filtrar la parte que nos interesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$users = User::all(); // Devuelve una colección de usuarios, por ejemplo, ['name' =&amp;gt; 'John', 'age' =&amp;gt; 55],['name' =&amp;gt; 'Melissa', 'age' =&amp;gt; 18],['name' =&amp;gt; 'Bob', 'age' =&amp;gt; 43]&lt;br /&gt;
$usernames = $users-&amp;gt;pluck('name'); // tenemos una colección de ['John', 'Melissa', 'Bob', 'Sara']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''¿Cúal forma es mejor o más óptima? ¿SQL NATIVE o QUERY BUILDER o ELOQUENT?'''&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-es-mejor-eloquent-query-builder-o-sql/&lt;br /&gt;
&lt;br /&gt;
===PAGINAR===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*en CONTROLADOR de index*/&lt;br /&gt;
        $datos=Dato::latest()-&amp;gt;paginate(3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*en la VISTA debajo de forelse */&lt;br /&gt;
//en el momento que insertamos datos dentro de la tabla y queremos mostrar los datos de forma más humana.&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
  @forelse ($datos as $item)&lt;br /&gt;
              &amp;lt;li&amp;gt;  {{$item-&amp;gt;title}}  {{$item-&amp;gt;created_at-&amp;gt;diffForHumans() }} &amp;lt;/li&amp;gt;  &lt;br /&gt;
            @empty&lt;br /&gt;
                &amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
            @endforelse&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{$datos-&amp;gt;links()}}  //DEBAJO DEL FORELSE&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CRUD===&lt;br /&gt;
&lt;br /&gt;
Creas la tabla&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_blogs_table --create=blogs'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Luego en la migración creas los campos para la base de datos&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Schema::create('blogs', function (Blueprint $table) {&lt;br /&gt;
$table-&amp;gt;bigIncrements('id');&lt;br /&gt;
$table-&amp;gt;string('blog_title');&lt;br /&gt;
$table-&amp;gt;text('blog_content');&lt;br /&gt;
$table-&amp;gt;timestamps();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para generar las rutas podemos hacer dos cosas:&lt;br /&gt;
&lt;br /&gt;
'''1)Generarlas automáticamente con el nombre de las rutas en inglés.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generas las rutas insertando el fichero Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route::resource('blogs','blogController');&lt;br /&gt;
&lt;br /&gt;
//Para listar las rutas, en terminal &lt;br /&gt;
&lt;br /&gt;
php artisan route:list -v&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Creamos Controlador'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:controller blogController --resource'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1.index()&lt;br /&gt;
&lt;br /&gt;
2.create()&lt;br /&gt;
&lt;br /&gt;
3.store()&lt;br /&gt;
&lt;br /&gt;
4.show()&lt;br /&gt;
&lt;br /&gt;
5.edit()&lt;br /&gt;
&lt;br /&gt;
6.update()&lt;br /&gt;
&lt;br /&gt;
7.destroy()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.expertsphp.com/laravel-6-crud-create-read-update-delete-generator-for-beginners-with-example/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''2) Diseñar nuestras rutas y controlador en castellano uno a uno'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Diseñamos nuestras rutas en Web&lt;br /&gt;
Route::get('/index', 'DatosController@index')-&amp;gt;name('index');&lt;br /&gt;
Route::post('/almacenar', 'DatosController@almacenar')-&amp;gt;name('almacenar');&lt;br /&gt;
Route::get('/editar/{id}', 'DatosController@editar')-&amp;gt;name('editar');&lt;br /&gt;
Route::patch('/actualizar/{id}', 'DatosController@actualizar')-&amp;gt;name('actualizar');&lt;br /&gt;
Route::delete('/borrar/{id}', 'DatosController@borrar')-&amp;gt;name('borrar');&lt;br /&gt;
Route::view('/insertar','insertar')-&amp;gt;name('insertar');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Diseñamos la migración y el modelo, en caso de necesitarlo&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_datos_table --create=datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//creamos la migracion que es la tabla en la base de datos &amp;quot;datos&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Schema::create('datos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;bigIncrements('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;text('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//creamos el modelo &amp;quot;Dato&amp;quot; que es la Entidad que vamos a trabajar y dentro ponemos los datos que queremos proteger.&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Dato'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $table= 'datos';&lt;br /&gt;
protected $fillable = ['nombre', 'descripcion']; //¿Qué atributos deberías incluir en dicho array?&lt;br /&gt;
&lt;br /&gt;
//Aquellos que consideres sensibles y que no deberían modificarse o asignarse en cierta forma, el más típico es el id, el cual normalmente no se modifica ni se asigna de forma manual.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INDEX-MOSTRAR DATOS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**********en el CONTROLADOR**********/&lt;br /&gt;
 public function index(){&lt;br /&gt;
&lt;br /&gt;
    $datos=Dato::all();&lt;br /&gt;
&lt;br /&gt;
    return view('index',['datos'=&amp;gt;$datos]);  //view('index',compact('datos');&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
/***********en la VISTA***********/&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; &lt;br /&gt;
{{$item-&amp;gt;nombre}} {{$item-&amp;gt;descripcion}} &lt;br /&gt;
     &amp;lt;a href=&amp;quot;{{ route('editar', $item-&amp;gt;id)}}&amp;quot; &amp;gt;Edit&amp;lt;/a&amp;gt; &amp;lt;!--añadimos también EDITAR--&amp;gt;&lt;br /&gt;
     &amp;lt;form action=&amp;quot;{{ route('borrar', $item-&amp;gt;id)}}&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt; &amp;lt;!--añadimos también BORRAR--&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        @method('DELETE')&lt;br /&gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;borrar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''INSERTAR -STORE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR***********/&lt;br /&gt;
 public function almacenar(Request $request){&lt;br /&gt;
&lt;br /&gt;
//LA MEJOR FORMA DE INSERTAR DATOS ya que se hace la comprobación de los campos obligatorios para que no hagan inyeccion y luego inserta.&lt;br /&gt;
    $datos=request()-&amp;gt;validate([&lt;br /&gt;
        'nombre'=&amp;gt;'required|max:25', &lt;br /&gt;
        'descripcion'=&amp;gt;'required']&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    Dato::create($datos);&lt;br /&gt;
&lt;br /&gt;
    return redirect()-&amp;gt;route('index');&lt;br /&gt;
 //return back(); //te redirecciona a la misma página&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********En la VISTA***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())  //esto muestra todos los errores seguidos&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot;&amp;gt; &lt;br /&gt;
/* action=&amp;quot;{{ action('RelacionController@almacenar') }}&amp;quot;  //con esto vamos directamente al controlador desde la vista */&lt;br /&gt;
   &lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{old('nombre')}}&amp;quot;/&amp;gt;  &amp;lt;!--ponemos old porque en el caso que carguemos el formulario y diera error habría que volver a introducir todos los campos, así recuerda o guarda los campos que están bien--&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('name', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &amp;lt;!-- así especificamos los errores debajo--&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;label for=&amp;quot;price&amp;quot;&amp;gt;Descripcion:&amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{old('descripcion')}}&amp;quot;/&amp;gt;&lt;br /&gt;
     {!! $errors-&amp;gt;first('descripcion', '&amp;lt;small&amp;gt;:message&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;' )!!}  &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Crear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''EDITAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/***********EN EL CONTROLADOR***********/&lt;br /&gt;
&lt;br /&gt;
public function editar($id){&lt;br /&gt;
&lt;br /&gt;
    $dato = Dato::findOrFail($id);  //como no está el dato si nos equivocamos de id nos muestra la página de error 404, podemos crear uno personalizado en la view-&amp;gt;errors-&amp;gt;404.blade.php , creamos carpeta &amp;quot;errors&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    return view('editar', compact('dato'));&lt;br /&gt;
   } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/***********EN LA VISTA para EDITAR***********/&lt;br /&gt;
&lt;br /&gt;
@if ($errors-&amp;gt;any())&lt;br /&gt;
        &amp;lt;div class=&amp;quot;alert alert-danger&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;strong&amp;gt;Whoops!&amp;lt;/strong&amp;gt; There were some problems with your input.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
                    &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
                @endforeach&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    @endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('actualizar', $dato) }}&amp;quot;&amp;gt;  //No es necesario especificar el Id ya que la nueva versión laravel ya busca dentro del Objeto&lt;br /&gt;
          &amp;lt;div &amp;gt; &lt;br /&gt;
              @method('PATCH')&lt;br /&gt;
              @csrf&lt;br /&gt;
              &lt;br /&gt;
              &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;nombre:&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;nombre&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;nombre }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div &amp;gt;&lt;br /&gt;
              &amp;lt;label for=&amp;quot;descripcion&amp;quot;&amp;gt;descripcion&amp;lt;/label&amp;gt;&lt;br /&gt;
              &amp;lt;input type=&amp;quot;text&amp;quot;  name=&amp;quot;descripcion&amp;quot; value=&amp;quot;{{ $dato-&amp;gt;descripcion }}&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
          &amp;lt;button type=&amp;quot;submit&amp;quot; &amp;gt;Actualizar&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;/form&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********En el CONTROLADOR para ALMACENAR DATOS ya MODIFICADOS***********/&lt;br /&gt;
&lt;br /&gt;
public function actualizar(Request $request, $id){&lt;br /&gt;
&lt;br /&gt;
        $validacion=$request-&amp;gt;validate([&lt;br /&gt;
        'nombre' =&amp;gt; 'required|min:1|max:10',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ]);&lt;br /&gt;
       &lt;br /&gt;
        Dato::whereId($id)-&amp;gt;update($validacion); //otra opción&lt;br /&gt;
&lt;br /&gt;
        /*  //otra forma de almacenar &lt;br /&gt;
        $datos = Dato::find($id);   //podremos utilizar findOrFail($id) para que en caso de no encontrar no falle&lt;br /&gt;
        $datos-&amp;gt;nombre = $validacion['nombre'];&lt;br /&gt;
        $datos-&amp;gt;descripcion = $validacion['descripcion'];&lt;br /&gt;
&lt;br /&gt;
        $datos-&amp;gt;update();*/&lt;br /&gt;
&lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
      &lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// formar de recuperar datos de un formulario. $request-&amp;gt;get('nombre'); $request-&amp;gt;nombre;  $request-&amp;gt;input('nombre');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BORRAR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/***********en el controlador borrar***********/&lt;br /&gt;
&lt;br /&gt;
    public function borrar($id){&lt;br /&gt;
&lt;br /&gt;
        $dato = Dato::findOrFail($id);&lt;br /&gt;
        &lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
    &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
       } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*Otra forma de Borrar*/&lt;br /&gt;
use App\Dato; //añadimos el modelo en el controlador&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;br /&gt;
  public function borrar(Dato $dato){&lt;br /&gt;
&lt;br /&gt;
        $dato-&amp;gt;delete();&lt;br /&gt;
                  &lt;br /&gt;
        return redirect()-&amp;gt;route('index');&lt;br /&gt;
         } &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===RELACIONES===&lt;br /&gt;
&lt;br /&gt;
Se puede crear primero el Modelo(Entidad) y luego generar la migración, el problema es que si diseñamos el modelo Escritor(Entidad) generará automáticamente la migración Escritors, habría que definir la tabla en la entidad.&lt;br /&gt;
&lt;br /&gt;
Por tanto, la otra opción es diseñar primero la migración (tablas) y luego los modelos (entidades)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://laravel.com/docs/6.x/eloquent-relationships&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACIÓN UNO A MUCHOS (1XM)===&lt;br /&gt;
&lt;br /&gt;
Una categoria tiene muchos artículos.&lt;br /&gt;
Creamos primero las migraciones (bases datos) y luego el modelo (Entidades), también tenemos la opción de crear el modelo y luego automaticamente las migraciones pero hay que tener cuidado ya que genera el nombre de las tablas de la migración en inglés.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
php artisan make:migration create_categorias_table --create=&amp;quot;categorias&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
php artisan make:migration create_articulos_table --create=&amp;quot;articulos&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tablas migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//tabla Categories&lt;br /&gt;
  Schema::create('categorias', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;text('nombre');&lt;br /&gt;
            $table-&amp;gt;mediumText('masInfo');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//tabla articulos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Schema::create('articulos', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('categoria_id')-&amp;gt;unsigned();  //si hubieramos puesto categorias_id tambien hubiera cogido la relación&lt;br /&gt;
            $table-&amp;gt;text('titulo');&lt;br /&gt;
            $table-&amp;gt;mediumText('descripcion');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
            //relaciones&lt;br /&gt;
            $table-&amp;gt;foreign('categoria_id')-&amp;gt;references('id')-&amp;gt;on('categorias')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
            //category_id hace referencia a la tabla categories y el borrado y la actualización es en cascada.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos los modelos&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:model Categoria'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo Categoria&lt;br /&gt;
class Categoria extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'categorias';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';  //Por defecto id es la clave primaria, podemos definir un campo diferente con la propiedad primaryKey&lt;br /&gt;
    //public $timestamps = true;  //especificamos si queremos crear created_at y updated_at en la base de datos&lt;br /&gt;
    protected $fillable = ['nombre', 'masInfo'];&lt;br /&gt;
&lt;br /&gt;
    public function articulos()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;hasMany('App\Articulo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Modelo Artículos&lt;br /&gt;
&lt;br /&gt;
class Articulo extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'articulos';&lt;br /&gt;
    protected $fillable = ['titulo', 'descripcion'];&lt;br /&gt;
&lt;br /&gt;
    public function categoria()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsTo('App\Categoria');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function insertar()&lt;br /&gt;
    {&lt;br /&gt;
        $categoria = Categoria::find(3);   //buscamos que ya tenemos almacenada o la creamos.&lt;br /&gt;
&lt;br /&gt;
        $articulo = new Articulo(['titulo' =&amp;gt; 'Pedazo Artículo', 'descripcion' =&amp;gt; 'toda la descripción']);  //creamos artículo.&lt;br /&gt;
        $categoria-&amp;gt;articulos()-&amp;gt;save($articulo);  //guardamos dentro de categoria un artículo.&lt;br /&gt;
       &lt;br /&gt;
       //en caso que tengamos varios artículos&lt;br /&gt;
       /* $categoria-&amp;gt;articulos()-&amp;gt;saveMany([&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'A new comment.', 'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
            new Articulo(['titulo' =&amp;gt; 'Another comment.',  'descripcion' =&amp;gt; 'hola']),&lt;br /&gt;
        ]);*/&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
http://documentacion-laravel.com/eloquent-relationships.html#insertando-y-actualizando-modelos-relacionados&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROBLEMA N+1 - LAZY LOADING '''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//muestra el nombre de todas las categorias de todos los artículos. Una consulta para obtener todos los artículos en la tabla, después otra consulta para cada articulos para obtener quien es el autor&lt;br /&gt;
&lt;br /&gt;
 $articulos = Articulo::all();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
     dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SOLUCIÓN - EAGER LOADING'''&lt;br /&gt;
//al usar la carga previa o carga impaciente (Eager Loading)  para reducir esta operación a solo 2 consultas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$articulos = Articulo::with('categoria')-&amp;gt;get();&lt;br /&gt;
&lt;br /&gt;
 foreach ($articulos as $articulo) {&lt;br /&gt;
           echo $articulo-&amp;gt;categoria-&amp;gt;nombre .&amp;quot;&amp;lt;/br&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://styde.net/lazy-loading-vs-eager-loading/&lt;br /&gt;
&lt;br /&gt;
'''Borrado'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//borra la categoria 9 y todos los articulos relacionados (cascada)&lt;br /&gt;
$Categoria = Categoria::find(9);&lt;br /&gt;
$Categoria-&amp;gt;delete();&lt;br /&gt;
&lt;br /&gt;
//borra artículo&lt;br /&gt;
$articulo = Articulo::find(2);        &lt;br /&gt;
$articulo-&amp;gt;delete();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Consultas interesantes para 1xN'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//Métodos de relación&lt;br /&gt;
//Toda la info de Categoria&lt;br /&gt;
 $categoria = Categoria::find(3);  //debe existir categoria y artículos&lt;br /&gt;
 return $categoria-&amp;gt;articulos()-&amp;gt;where('descripcion', &amp;quot;hola&amp;quot;)-&amp;gt;get();  //-&amp;gt;whereDescripcion('hola')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Obtenemos del artículo el nombre de la Categoria relacionada&lt;br /&gt;
 $articulo = Articulo::findOrFail(2);&lt;br /&gt;
 dump($articulo-&amp;gt;categoria-&amp;gt;nombre);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://desarrollowebtutorial.com/laravel-eloquent-orm-query-builder-consultas-sql/&lt;br /&gt;
&lt;br /&gt;
'''HAS'''&lt;br /&gt;
&lt;br /&gt;
Es como el WHERE, devuelve las categorias que tiene al menos 1 articulo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categorias=Categoria::has('articulos')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Categoria::where('descripcion','like','%#'.$etiqueta.'%')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://blog.coffeedevs.com/como-evitar-consultas-de-mas-al-utilizar-eloquent-orm/&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@hemnys25/de-0-a-100-con-eloquent-de-laravel-parte-0-d5347c060ad7&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-mean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===CONSULTAS EN MULTIPLES TABLAS ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejemplo// Tablas: a, b, c, d, e, f&lt;br /&gt;
&lt;br /&gt;
Quiero traer los datos de todas las tablas relacionadas, los datos de a, b, c, d,e,f.&lt;br /&gt;
&lt;br /&gt;
    A está relacionado con B (1,n)&lt;br /&gt;
    B con C (1,n)&lt;br /&gt;
    C con D (1,n)&lt;br /&gt;
    D con E (1,n)&lt;br /&gt;
    E con F (1,n)&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
https://es.stackoverflow.com/questions/173727/consultas-en-m%C3%BAltiples-tablas-con-laravel-5-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
&lt;br /&gt;
===RELACION DE MUCHOS A MUCHOS (NXM)===&lt;br /&gt;
&lt;br /&gt;
Un post puede tener muchas Etiquetas y una etiqueta puede tener muchos Posts, por tanto habrá que crear una tabla auxiliar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiquetas_table --create=&amp;quot;etiquetas&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_posts_table --create=&amp;quot;posts&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
'''php artisan make:migration create_etiqueta_post_table --create=&amp;quot;etiqueta_post&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de la tabla de migraciones&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//ETIQUETAS&lt;br /&gt;
Schema::create('etiquetas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;string('nombre',128);&lt;br /&gt;
            $table-&amp;gt;string('slug',128);&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//POSTS&lt;br /&gt;
   Schema::create('posts', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
             $table-&amp;gt;string('nombre',128)-&amp;gt;unique();&lt;br /&gt;
             $table-&amp;gt;string('slug',128);&lt;br /&gt;
             $table-&amp;gt;text('cuerpo');&lt;br /&gt;
             $table-&amp;gt;enum('status',['PUBLISHED','DRAFT'])-&amp;gt;default('DRAFT');&lt;br /&gt;
             $table-&amp;gt;string('file', 128)-&amp;gt;nullable();&lt;br /&gt;
 &lt;br /&gt;
             $table-&amp;gt;timestamps();&lt;br /&gt;
             &lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//ETIQUETA_POST&lt;br /&gt;
 Schema::create('etiqueta_post', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;integer('post_id')-&amp;gt;unsigned();&lt;br /&gt;
            $table-&amp;gt;integer('etiqueta_id')-&amp;gt;unsigned();&lt;br /&gt;
&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
&lt;br /&gt;
             //relaciones&lt;br /&gt;
             $table-&amp;gt;foreign('post_id')-&amp;gt;references('id')-&amp;gt;on('posts')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
             $table-&amp;gt;foreign('etiqueta_id')-&amp;gt;references('id')-&amp;gt;on('etiquetas')-&amp;gt;onDelete('cascade')-&amp;gt;onUpdate('cascade');&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dentro de los modelos&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Modelo POST&lt;br /&gt;
class Post extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'posts';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'cuerpo','status'];&lt;br /&gt;
&lt;br /&gt;
    public function etiquetas()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Etiqueta');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Modelo ETIQUETA&lt;br /&gt;
&lt;br /&gt;
class Etiqueta extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'etiquetas';&lt;br /&gt;
    //protected $primary_key = 'categoria_id';&lt;br /&gt;
    protected $fillable = ['nombre', 'slug'];&lt;br /&gt;
&lt;br /&gt;
    public function posts()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;belongsToMany('App\Post');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//INSERTAR Tabla intermedia&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        public function insertarTablaIntermedia(){&lt;br /&gt;
        $etiqueta=Etiqueta::find(1);&lt;br /&gt;
        $post = Post::find(2);&lt;br /&gt;
        $post-&amp;gt;etiquetas()-&amp;gt;attach($etiqueta);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//OBTENER DATOS DE LA otra TABLA RELACIONADA.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;get();  //del Post(1) obtiene todas las etiquetas relacionadas&lt;br /&gt;
return Post::find(1)-&amp;gt;etiquetas()-&amp;gt;where('nombre','futbol')-&amp;gt;get();  //del Post(1) obtiene la etiqueta relacionada que tiene nombre = &amp;quot;futbol&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CREAR MODELOS ELOQUENT desde la BASE DATOS ===&lt;br /&gt;
&lt;br /&gt;
Introducimos el comando de instalación del paquete&lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
 composer require reliese/laravel --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registrar el provider en app/Providers/AppServiceProvider.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function register()&lt;br /&gt;
{&lt;br /&gt;
    if ($this-&amp;gt;app-&amp;gt;environment() == 'local') {&lt;br /&gt;
        $this-&amp;gt;app-&amp;gt;register(\Reliese\Coders\CodersServiceProvider::class);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comandos: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
//Crea todos los MODELOS de las tablas de la BD &lt;br /&gt;
php artisan code:models&lt;br /&gt;
&lt;br /&gt;
//Crea un MODELO de una tabla&lt;br /&gt;
php artisan code:models --table=users&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://cristianllanos.medium.com/eloquent-models-from-my-database-5d74c632e03c#.qg7cd4vri&lt;br /&gt;
&lt;br /&gt;
===SLUG (babosa)===&lt;br /&gt;
&lt;br /&gt;
Para mejorar el posicionamiento SEO de nuestra web en las url hay que evitar poner &amp;quot;/detalle/1&amp;quot; y darle un signficado a nuestras rutas &amp;quot;/detalle/julio-profesor&amp;quot; &lt;br /&gt;
&lt;br /&gt;
Por tanto, podemos añadir a nuestra tabla de la base de datos un nuevo campo, por ello, podemos editar la tabla:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:migration anadir_slug_tabla_tareas --table=tareas&lt;br /&gt;
//creará una nueva migración donde añadiremos un nuevo campo, en este caso slug.&lt;br /&gt;
&lt;br /&gt;
class AnadirSlugTablaTareas extends Migration&lt;br /&gt;
{&lt;br /&gt;
    public function up()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;string('slug')-&amp;gt;unique;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    public function down()&lt;br /&gt;
    {&lt;br /&gt;
        Schema::table('tareas', function (Blueprint $table) {&lt;br /&gt;
        $table-&amp;gt;dropColumn('slug');    //eliminar campo.&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego en el campo slug habrá que añadir &amp;quot;julio-profesor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//CONTROLADOR&lt;br /&gt;
   public function mostrar()   //muestro todos los campos&lt;br /&gt;
    {&lt;br /&gt;
        $datos = Tarea::all();&lt;br /&gt;
        return view('datos', ['datos' =&amp;gt; $datos]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function detalle($slug)   //Recibe el campo slug de la base de datos  y busca el resultado en la base de datos.&lt;br /&gt;
    {&lt;br /&gt;
        $tarea = Tarea::where('slug', $slug)-&amp;gt;first();&lt;br /&gt;
        return $tarea;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//VISTA&lt;br /&gt;
@forelse ($datos as $item)&lt;br /&gt;
&amp;lt;li&amp;gt; {{$item-&amp;gt;nombre}}  &amp;lt;a href=&amp;quot;{{ route('detalle', $item-&amp;gt;slug)}}&amp;quot; &amp;gt;detalles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
@empty&lt;br /&gt;
&amp;lt;li&amp;gt;NO HAY NADA &amp;lt;/li&amp;gt;&lt;br /&gt;
@endforelse&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//RUTAS&lt;br /&gt;
Route::get('/mostrar', 'PruebaController@mostrar')-&amp;gt;name('mostrar');&lt;br /&gt;
Route::get('/detalle/{slug}', 'PruebaController@detalle')-&amp;gt;name('detalle');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MANEJAR VALIDACIONES===&lt;br /&gt;
Para hacer las validaciones hay que evitar ponerlo en el controlador ya que es una mala práctica, por tanto el controlador solo debe tener la responsabilidad de tratar las solicitudes. &lt;br /&gt;
&lt;br /&gt;
https://styde.net/como-trabajar-con-form-requests-en-laravel/&lt;br /&gt;
&lt;br /&gt;
https://www.laraveltip.com/que-son-como-y-por-que-utilizar-los-form-request-de-laravel/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Para mantener el código limpio y no tener que poner  app-&amp;gt;http-&amp;gt;request&lt;br /&gt;
php artisan make:request CreateDatosRequest   // [Nombre-del-modelo-que-impacta]+[Acción]+Request&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 public function authorize()&lt;br /&gt;
    {&lt;br /&gt;
        return true;  //cambiar a true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function rules()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre' =&amp;gt; 'required',&lt;br /&gt;
        'descripcion' =&amp;gt; 'required',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function messages()&lt;br /&gt;
    {&lt;br /&gt;
        return [&lt;br /&gt;
        'nombre.required' =&amp;gt; 'El :attribute es obligatorio campeón',&lt;br /&gt;
        'descripcion.required' =&amp;gt; 'El :attribute es obligatorio también',&lt;br /&gt;
        ];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// en el controlador bastará con poner&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public function actualizar(CreateDatosRequest $request){&lt;br /&gt;
//quitamos la validación&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRY ... CATCH===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*Las Rutas*/&lt;br /&gt;
Route::get('/formularioBusqueda', 'ProductController@formulario')-&amp;gt;name('formularioBusqueda');   &lt;br /&gt;
Route::post('/product/resultado', 'ProductController@resultado')-&amp;gt;name('resultadoBusqueda');&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En la vista 'formularioBusqueda'*/&lt;br /&gt;
@if (session('error'))&lt;br /&gt;
&amp;lt;div&amp;gt;{{ session('error') }}&amp;lt;/div&amp;gt;   &amp;lt;!--En caso de no encontrar el producto en la BBDD muestra error--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('resultadoBusqueda') }}&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
@csrf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input id=&amp;quot;title name=&amp;quot;title&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;{{ old('product') }}&amp;quot; placeholder=&amp;quot;Product Title&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*En el controlador */&lt;br /&gt;
&lt;br /&gt;
public function resultado(Request $request)&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        $product = Product::where('title',$request-&amp;gt;get('title'));  //busca el producto en la BBDD&lt;br /&gt;
    } catch (ModelNotFoundException $exception) {&lt;br /&gt;
        return back()-&amp;gt;withError($exception-&amp;gt;getMessage())-&amp;gt;withInput();   //en caso de no encontrar en la BBDD captura la excepción y envia la info a la misma vista &lt;br /&gt;
        //return $exception-&amp;gt;getMessage();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    return view('resultadoBusqueda', compact('product'));   //en caso de encontrar el producto manda otra vista el resultado&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
https://www.tutsmake.com/laravel-try-catch/&lt;br /&gt;
&lt;br /&gt;
===TRADUCCIÓN=== &lt;br /&gt;
&lt;br /&gt;
Podemos hacerlo de dos formas:&lt;br /&gt;
&lt;br /&gt;
1) '''Manualmente:'''&lt;br /&gt;
&lt;br /&gt;
*En el caso que queramos hacer validaciones en Castellano, deberemos ir a la carpeta Resources&amp;gt;Lang y crear una llamada ES. Luego para establecer el lang por defecto hay que cambiarlo en configuración APP&amp;gt;CONFIG&amp;gt;app.php y buscar la linea 'locate'=&amp;gt; 'es'.&lt;br /&gt;
&lt;br /&gt;
2)También podemos '''instalar complemento''':&lt;br /&gt;
&lt;br /&gt;
*'''composer require laraveles/spanish'''&lt;br /&gt;
&lt;br /&gt;
*'''php artisan vendor:publish --tag=lang'''&lt;br /&gt;
&lt;br /&gt;
https://github.com/Laraveles/spanish&lt;br /&gt;
&lt;br /&gt;
===AUTENTIFICACIÓN===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Crear usuario en versiones anteriores a 6&lt;br /&gt;
&lt;br /&gt;
php artisan make:auth&lt;br /&gt;
&lt;br /&gt;
//Laravel 6&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &amp;quot;^3.0&amp;quot;   //composer require laravel/ui &amp;quot;^1.0&amp;quot; --dev -vvv&lt;br /&gt;
&lt;br /&gt;
php artisan ui vue --auth   //php artisan ui bootstrap --auth&lt;br /&gt;
&lt;br /&gt;
//para visualizar el login y registro con css, habrá que instalar nodejs y usar: &lt;br /&gt;
//npm install&lt;br /&gt;
//npm run dev&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Después si accedemos dentro '''routes-&amp;gt;Web''' podemos ver que se ha creado '''Auth::routes()'''; &lt;br /&gt;
&lt;br /&gt;
2. Para cambiar la redirección después de Logearnos, tendremos que ir dentro '''app-&amp;gt;http-&amp;gt;Controller-&amp;gt;Auth''' cambiamos las rutas de '''register''' y '''login''' cambiando ruta a '''/'''&lt;br /&gt;
&lt;br /&gt;
3. Quitamos la ruta /home dentro de las rutas en web&lt;br /&gt;
&lt;br /&gt;
&amp;quot;para borrar la sesion podemos borrar el fichero dentro storage-&amp;gt;framework-&amp;gt;session como  prueba&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''MUESTRA USUARIO BLADE'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
@auth    &amp;lt;!--sirve para mostrar en caso de estar autentificado, estar logeado--&amp;gt;&lt;br /&gt;
{{auth()-&amp;gt;user()-&amp;gt;name}}&lt;br /&gt;
@endauth&lt;br /&gt;
&amp;lt;!--tambien cambiar la ruta de middleware en caso de estar autentificado y volver hacer login peta y te manda a home por tanto cambiar a raiz.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@if(auth()) &amp;lt;!--si el usuario está autentificado--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
@endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SABER SI ESTÁ LOGEADO EN EL CONTROLADOR'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Illuminate\Support\Facades\Auth;&lt;br /&gt;
&lt;br /&gt;
if(Auth::check()){ &lt;br /&gt;
 return &amp;quot;estas logeado&amp;quot;;&lt;br /&gt;
}else { &lt;br /&gt;
 return &amp;quot;no estas logeado&amp;quot;;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
// Obtiene el objeto del Usuario Autenticado&lt;br /&gt;
$user = Auth::user();&lt;br /&gt;
$user-&amp;gt;name;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SECURIZAR''' &lt;br /&gt;
&lt;br /&gt;
También podemos indicarlo directamente en el constructor de un controlador &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function __construct()&lt;br /&gt;
{&lt;br /&gt;
$this-&amp;gt;middleware('auth');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Otra forma es indicándolo en la ruta para protegerla &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/resultado', 'PruebasController@ejemplo')-&amp;gt;middleware('auth);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''LOGOUT'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//usar directiva @guest- invitado. en caso de no estar logueado no muestra&lt;br /&gt;
@guest &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('login')}}&amp;quot;&amp;gt;Login&amp;lt;/a&amp;gt;&lt;br /&gt;
@else   &lt;br /&gt;
&amp;lt;a href=&amp;quot;{{ route('logout') }}&amp;quot; onclick=&amp;quot;event.preventDefault(); document.getElementById('logout-form').submit();&amp;quot;&amp;gt; Logout &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;form id=&amp;quot;logout-form&amp;quot; action=&amp;quot;{{ route('logout') }}&amp;quot; method=&amp;quot;POST&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&lt;br /&gt;
    {{ csrf_field() }}&lt;br /&gt;
  &amp;lt;/form&amp;gt;&lt;br /&gt;
@endguest&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''DESHABILITAR REGISTRO'''&lt;br /&gt;
&lt;br /&gt;
vamos a Web y modificamos ruta&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Auth::routes(['register'=&amp;gt;false]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''' BLOQUEAR USUARIO, INTENTOS FALLIDOS '''&lt;br /&gt;
&lt;br /&gt;
En el caso que querramos bloquear al usuario por intentos de ingresos fallidos y penalizar el tiempo a la hora de volver autenficarte, bastará con añadir el controlador por defecto app-&amp;gt;http-&amp;gt;Controller-&amp;gt;auth-&amp;gt; '''LoginController'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class LoginController extends Controller&lt;br /&gt;
{&lt;br /&gt;
   &lt;br /&gt;
    use AuthenticatesUsers;&lt;br /&gt;
&lt;br /&gt;
    public $maxAttempts = 2;   //número máximo de intentos&lt;br /&gt;
    public $decayMinutes = 2;  //tiempo que durará el bloqueo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIDDLEWARE o FILTRO===&lt;br /&gt;
filtran las peticiones http, en nuestro caso que compruebe si el usuario está autentificado o no.&lt;br /&gt;
Son puertas que una peticion de usuario tiene que pasar antes de llegar al controlador que tiene la logica a la que el usuario intenta acceder. &lt;br /&gt;
&lt;br /&gt;
'''php artisan make:middleware DomingoMiddleware'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Middleware;&lt;br /&gt;
&lt;br /&gt;
use Closure;&lt;br /&gt;
&lt;br /&gt;
class DomingoMiddleware&lt;br /&gt;
{&lt;br /&gt;
    public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if(date('w')==='0'){&lt;br /&gt;
            //echo &amp;quot;Es domingo!&amp;quot;; &lt;br /&gt;
           redirect()-&amp;gt;route('home');&lt;br /&gt;
&lt;br /&gt;
        }else{&lt;br /&gt;
            echo &amp;quot;No es domingo&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $next($request);   //&amp;quot;continua tu camino&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego hay dos formas de registrar el MiddleWare&lt;br /&gt;
&lt;br /&gt;
1) de Forma GLOBAL en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
protected $middleware = [&lt;br /&gt;
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,&lt;br /&gt;
        // otros middleware&lt;br /&gt;
        // ...&lt;br /&gt;
        \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
    ];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2)Una ruta determinada o un controlador en app/Http/Kernel.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
protected $routeMiddleware = [&lt;br /&gt;
        'auth' =&amp;gt; \App\Http\Middleware\Authenticate::class,&lt;br /&gt;
        // otros middleware de rutas...&lt;br /&gt;
        'domingo' =&amp;gt; \App\Http\Middleware\DomingoMiddleware::class,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//hay que añadir en la ruta web -&amp;gt;middleware('domingo');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ahora podemos probar que funciona nuestro middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//pruebas en route web&lt;br /&gt;
&lt;br /&gt;
Route::get('/test', ['middleware' =&amp;gt; 'domingo', function(){&lt;br /&gt;
    return 'Probando ruta con middleware';&lt;br /&gt;
}])&lt;br /&gt;
&lt;br /&gt;
Route::get('/test1','MoviesController@insertar')-&amp;gt;name('insertar')-&amp;gt;middleware('domingo');&lt;br /&gt;
&lt;br /&gt;
//segunda prueba en route web&lt;br /&gt;
&lt;br /&gt;
Route::group(['middleware' =&amp;gt; 'domingo'], function(){&lt;br /&gt;
    Route::get('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo &lt;br /&gt;
        return 'get';&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    Route::post('/probando/ruta', function(){&lt;br /&gt;
        //código a ejecutar cuando se produzca esa ruta y el verbo POST&lt;br /&gt;
        return 'post';&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//también se puede llamar desde dentro de un controlador y afectará a todas las acciones de dentro.&lt;br /&gt;
&lt;br /&gt;
class PrimerController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function __construct(){&lt;br /&gt;
        $this-&amp;gt;middleware('domingo');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://programacionymas.com/blog/restringir-acceso-solo-administradores-laravel-usando-middlewares&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/laravel-middleware.html&lt;br /&gt;
&lt;br /&gt;
===ROLE===&lt;br /&gt;
Añadimos en la tabla de migracion users un nuevo atributo role de tipo enum y luego hacemos la migración &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$table-&amp;gt;enum('role',['user','admin'])-&amp;gt;default('user');&lt;br /&gt;
&lt;br /&gt;
//hacemos la migración&lt;br /&gt;
php artisan migrate&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Añadimos la autentificación de usuarios en este caso para Laravel 6.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
composer require laravel/ui &lt;br /&gt;
&lt;br /&gt;
php artisan ui bootstrap --auth &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos el MiddleWare y dentro introducimos el siguiente código app-&amp;gt;http-&amp;gt;Middleware&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//php artisan make:middleware Admin&lt;br /&gt;
&lt;br /&gt;
  public function handle($request, Closure $next)&lt;br /&gt;
    {&lt;br /&gt;
        if (auth()-&amp;gt;user()-&amp;gt;role == &amp;quot;admin&amp;quot;) {&lt;br /&gt;
&lt;br /&gt;
            return $next($request);&lt;br /&gt;
        }&lt;br /&gt;
        return redirect('home')-&amp;gt;with('error', 'You dont have admin access');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego registramos dentro del fichero Kernel.php el middleware en $routeMiddleware &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'admin' =&amp;gt; \App\Http\Middleware\Admin::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos la ruta nueva&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('admin/routes', 'HomeController@admin')-&amp;gt;middleware('admin');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el controlador de HomeController, son las dos rutas que hemos indicado en caso de ser user o admin&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('home');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function admin()&lt;br /&gt;
    {&lt;br /&gt;
       return view('admin');&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creamos las dos vistas&lt;br /&gt;
&lt;br /&gt;
home.blade&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;USER NORMAL&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
admin.blade.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@extends('layouts.app')&lt;br /&gt;
 &lt;br /&gt;
@section('content')&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row justify-content-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;col-md-8&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-header&amp;quot;&amp;gt;ADMINISTRADOR&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
                &amp;lt;div class=&amp;quot;card-body&amp;quot;&amp;gt;&lt;br /&gt;
                    @if(auth()-&amp;gt;user()-&amp;gt;role== &amp;quot;admin&amp;quot;)&lt;br /&gt;
                    &amp;lt;a href=&amp;quot;{{url('admin/routes')}}&amp;quot;&amp;gt;Admin&amp;lt;/a&amp;gt;&lt;br /&gt;
                    @else&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;Normal User&amp;lt;/div&amp;gt;&lt;br /&gt;
                    @endif&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endsection&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
//nota: habrá que cambiar la ruta del fichero loginController a la ruta /admin/routes para que haga el middleware&lt;br /&gt;
&lt;br /&gt;
https://w3path.com/laravel-6-multiple-authentication-system-example-tutorial/&lt;br /&gt;
https://stackoverflow.com/questions/39555865/laravel-routegroup-for-admins&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ejercicio:&lt;br /&gt;
Modificar el registro de usuarios para que pueda añadirse el diferente tipo de role con un desplegable (user o Admin)&lt;br /&gt;
&lt;br /&gt;
composer dump-autoload&lt;br /&gt;
&lt;br /&gt;
===RECUPERAR CONTRASEÑA POR CORREO===&lt;br /&gt;
https://stackoverflow.com/questions/33939393/failed-to-authenticate-on-smtp-server-error-using-gmail&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://github.com/facade/ignition-code-editor&lt;br /&gt;
&lt;br /&gt;
===SUBIR FICHEROS===&lt;br /&gt;
&lt;br /&gt;
'''RUTAS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::view('/subir','subir')-&amp;gt;name('subir');   //va directamente a la vista, no hace falta poner controlador&lt;br /&gt;
&lt;br /&gt;
Route::post('/subidoFichero','PruebasController@subidoFicheroPost')-&amp;gt;name('subidoFicheroPost');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA Subir'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
@if ($message = Session::get('success'))&lt;br /&gt;
&amp;lt;strong&amp;gt;{{ $message }}&amp;lt;/strong&amp;gt;  &amp;lt;!-- muestra el mensaje flash en caso de ser cierto--&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
@if (count($errors) &amp;gt; 0)&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Uppss!&amp;lt;/strong&amp;gt; Hay algunos problemas en la subida.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        @foreach ($errors-&amp;gt;all() as $error)&lt;br /&gt;
        &amp;lt;li&amp;gt;{{ $error }}&amp;lt;/li&amp;gt;&lt;br /&gt;
        @endforeach&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
@endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form action=&amp;quot;{{ route('subidoFicheroPost')}}&amp;quot; method=&amp;quot;post&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
    @csrf&lt;br /&gt;
    &amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;fileToUpload&amp;quot; id=&amp;quot;exampleInputFile&amp;quot; aria-describedby=&amp;quot;fileHelp&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;small id=&amp;quot;fileHelp&amp;quot;&amp;gt;El tamaño del fichero no debe ser superior a 2 MB.&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Subir&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CONTROLADOR SubidaFicheroPost'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   public function subidoFicheroPost(Request $request){&lt;br /&gt;
        $request-&amp;gt;validate([&lt;br /&gt;
            'fileToUpload' =&amp;gt; 'required|file|max:1024',&lt;br /&gt;
        ]);&lt;br /&gt;
&lt;br /&gt;
       // $request-&amp;gt;fileToUpload-&amp;gt;store('logos');   //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
       $fileName = &amp;quot;fileName&amp;quot;.time().'.'.request()-&amp;gt;fileToUpload-&amp;gt;getClientOriginalExtension();  //filename+ tiempo desde inicio UNIX + extensión fichero (.pdf...)&lt;br /&gt;
&lt;br /&gt;
        $request-&amp;gt;fileToUpload-&amp;gt;storeAs('public/logos',$fileName); //almacena el fichero dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
        return back()-&amp;gt;with('success','Tu imagen se ha subido satisfactoriamente');  //retorna a la misma página&lt;br /&gt;
&lt;br /&gt;
       //public_path() , storage_path()&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuando subimos imágenes y queremos mostrarla en la vista, por defecto se almacenan dentro de storage-&amp;gt;app-&amp;gt;public-&amp;gt;logos, el problema es que esa carpeta no es pública para todo el mundo, por tanto, si ejecutamos el comando '''php artisan storage:link''' creará un enlace simbólico creando una nueva carpeta dentro public-&amp;gt;storage-&amp;gt;logos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista  (las imágenes deben estar en la carpeta app/storage/public/logos)&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ url('storage/logos/'.$imagen) }}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;{{ asset('storage/logos') }}/{{$b-&amp;gt;imagen}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#introduccion&lt;br /&gt;
http://documentacion-laravel.com/filesystem.html#configuracion&lt;br /&gt;
&lt;br /&gt;
=== DRAG &amp;amp; DROP ===&lt;br /&gt;
&lt;br /&gt;
Creamos la vista y luego en el controlador tenemos que guardar al igual que subimos un fichero&lt;br /&gt;
     &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En la VISTA*/&lt;br /&gt;
//librerias&lt;br /&gt;
  &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://code.jquery.com/jquery-3.2.1.slim.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/min/dropzone.min.css&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.0/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h2&amp;gt;Laravel 6 Subir multiples imágenes&amp;lt;/h2&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
        &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;{{ route('almacenar') }}&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot; class=&amp;quot;dropzone&amp;quot; id=&amp;quot;dropzone&amp;quot;&amp;gt;&lt;br /&gt;
        @csrf&lt;br /&gt;
        &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        Dropzone.options.dropzone =&lt;br /&gt;
        {&lt;br /&gt;
            maxFilesize: 10,&lt;br /&gt;
            acceptedFiles: &amp;quot;.jpeg,.jpg,.png,.gif&amp;quot;,&lt;br /&gt;
            addRemoveLinks: false,&lt;br /&gt;
            timeout: 60000,&lt;br /&gt;
            success: function (file, response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            },&lt;br /&gt;
            error: function (file, response) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;script&amp;quot;&amp;gt;&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
//otra forma de subir fichero en la carpeta Public&lt;br /&gt;
public function subidoFicheroPost(Request $request){&lt;br /&gt;
&lt;br /&gt;
        $image = $request-&amp;gt;file('file');&lt;br /&gt;
        $avatarName = $image-&amp;gt;getClientOriginalName();&lt;br /&gt;
        $image-&amp;gt;move(public_path('images'),$avatarName);  //guarda en la ruta -&amp;gt;public-&amp;gt;images&lt;br /&gt;
        //$image-&amp;gt;move(storage_path('\app\public\images'),$avatarName);  //almacena en la ruta storage-&amp;gt;app-&amp;gt;public-&amp;gt;images&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://appdividend.com/2018/05/31/laravel-dropzone-image-upload-tutorial-with-example/&lt;br /&gt;
&lt;br /&gt;
===DESCARGAR FICHEROS .ZIP===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require chumper/zipper&lt;br /&gt;
&lt;br /&gt;
//dentro de config/app.php&lt;br /&gt;
//en providers&lt;br /&gt;
Chumper\Zipper\ZipperServiceProvider::class,&lt;br /&gt;
//en aliases&lt;br /&gt;
'Zipper' =&amp;gt; Chumper\Zipper\Zipper::class,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Controlador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use Zipper;&lt;br /&gt;
&lt;br /&gt;
class Controller extends BaseController&lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
    public function comprimirDescargar()&lt;br /&gt;
    {&lt;br /&gt;
        /*Añadimos la ruta donde se encuentran los archivos que queramos comprimir,&lt;br /&gt;
          en este ejemplo comprimimos todos los que se encuentran en la carpeta &lt;br /&gt;
          storage/app/public*/&lt;br /&gt;
        $files = glob(storage_path('app/public/*'));&lt;br /&gt;
        &lt;br /&gt;
        /* Le indicamos en que carpeta queremos que se genere el zip y los comprimimos*/&lt;br /&gt;
        Zipper::make(storage_path('app/public/ejemplo.zip'))-&amp;gt;add($files)-&amp;gt;close();&lt;br /&gt;
        &lt;br /&gt;
        /* Por último, si queremos descarlos, indicaremos la ruta del archiv, su nombre&lt;br /&gt;
        y lo descargaremos*/&lt;br /&gt;
        return response()-&amp;gt;download(storage_path('app/public/ejemplo.zip'));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''RUTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/comprimir', 'Controller@comprimirDescargar')-&amp;gt;name('comprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VISTA'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{route('comprimir')}}&amp;quot;&amp;gt;Comprimir y descargar&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AJAX===&lt;br /&gt;
https://www.tutsmake.com/laravel-6-install-yajra-datatables-example-tutorial/&lt;br /&gt;
&lt;br /&gt;
https://laraveles.com/implementacion-datatables-laravel-5-4/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//instalamos paquete yajra	&lt;br /&gt;
composer require yajra/laravel-datatables-oracle&lt;br /&gt;
&lt;br /&gt;
Cambiar -&amp;gt; config/app.php&lt;br /&gt;
&lt;br /&gt;
añadir en alias&lt;br /&gt;
'Datatables' =&amp;gt; yajra\Datatables\Datatables::class,&lt;br /&gt;
&lt;br /&gt;
añadir en providers&lt;br /&gt;
yajra\Datatables\DatatablesServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
hacer público el archivo de configuración con el siguiente comando, el cual nos crea el archivo config/datatables.php	&lt;br /&gt;
php artisan vendor:publish --tag=datatables&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//Migración&lt;br /&gt;
 Schema::create('tareas', function (Blueprint $table) {&lt;br /&gt;
            $table-&amp;gt;increments('id');&lt;br /&gt;
            $table-&amp;gt;string('nombre');&lt;br /&gt;
            $table-&amp;gt;string('apellido');&lt;br /&gt;
            $table-&amp;gt;string('estado');&lt;br /&gt;
            $table-&amp;gt;timestamps();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
//Modelo&lt;br /&gt;
&lt;br /&gt;
class Tarea extends Model&lt;br /&gt;
{&lt;br /&gt;
    protected $table = 'tareas';&lt;br /&gt;
    protected $primary_key = 'tareas_id';&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// web&lt;br /&gt;
Route::get('/', 'PruebaController@index');&lt;br /&gt;
Route::get('/tareas', 'PruebaController@getTareas')-&amp;gt;name('datatable.tareas');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//controlador&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
use Illuminate\Http\Request;&lt;br /&gt;
use Redirect,Response,DB,Config;&lt;br /&gt;
use Datatables;&lt;br /&gt;
use App\tarea;&lt;br /&gt;
&lt;br /&gt;
class PruebaController extends Controller&lt;br /&gt;
{&lt;br /&gt;
    public function index()&lt;br /&gt;
    {&lt;br /&gt;
        return view('vista');&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return mixed&lt;br /&gt;
     */&lt;br /&gt;
    public function getTareas()&lt;br /&gt;
    {&lt;br /&gt;
        $tareas = Tarea::select(['id','nombre','apellido','estado']);&lt;br /&gt;
 &lt;br /&gt;
        return Datatables::of($tareas)-&amp;gt;make(true);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//vista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;Laravel DataTable - Tuts Make&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;link  href=&amp;quot;https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table id=&amp;quot;task&amp;quot; class=&amp;quot;table table-hover table-condensed&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Id&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Task&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;Category&amp;lt;/th&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;State&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        oTable = $('#task').DataTable({&lt;br /&gt;
            &amp;quot;processing&amp;quot;: true,&lt;br /&gt;
            &amp;quot;serverSide&amp;quot;: true,&lt;br /&gt;
            &amp;quot;ajax&amp;quot;: &amp;quot;{{ route('datatable.tareas') }}&amp;quot;,&lt;br /&gt;
            &amp;quot;columns&amp;quot;: [&lt;br /&gt;
                {data: 'id', name: 'id'},&lt;br /&gt;
                {data: 'nombre', name: 'nombre'},&lt;br /&gt;
                {data: 'apellido', name: 'apellido'},&lt;br /&gt;
                {data: 'estado', name: 'estado'}&lt;br /&gt;
            ]&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===CLASES PERSONALIZADAS===&lt;br /&gt;
&lt;br /&gt;
//Crear nuestra Clase Personaliza Helper.php dentro de un directorio Helpers dentro de nuestra carpeta app de laravel quedando de la siguiente forma: app/Helpers/Helper.php con la siguientes lineas de codigo, &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Ubicacion app\Helpers\Helper.php&lt;br /&gt;
&lt;br /&gt;
namespace App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class Helper&lt;br /&gt;
{&lt;br /&gt;
    public static function strUp(string $string)&lt;br /&gt;
    {&lt;br /&gt;
        return strtoupper($string);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Crear Alias en nuestra aplicacion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
# Ubicacion: config/app.php&lt;br /&gt;
&lt;br /&gt;
    'aliases' =&amp;gt; [&lt;br /&gt;
     ...&lt;br /&gt;
        'Helper' =&amp;gt; App\Helpers\Helper::class,&lt;br /&gt;
     ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlo en nuestras plantillas Blade&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
{{ Helper::strUp('mostrar este texto en mayúsculas!') }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usarlos en nuestro controlador&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
namespace App\Http\Controllers;&lt;br /&gt;
&lt;br /&gt;
//use Helper;&lt;br /&gt;
use App\Helpers\Helper;&lt;br /&gt;
//use App\Helpers;&lt;br /&gt;
&lt;br /&gt;
class TuController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    public function metodo()&lt;br /&gt;
    {&lt;br /&gt;
        Helper::strUp('mostrar este texto en mayúsculas!');&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TRAITS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*En el CONTROLADOR*/&lt;br /&gt;
&lt;br /&gt;
use App\Http\Traits\Mayusculas;&lt;br /&gt;
.....&lt;br /&gt;
&lt;br /&gt;
class PeliculasController extends Controller&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  use Mayusculas;&lt;br /&gt;
&lt;br /&gt;
  public function ejemplo()&lt;br /&gt;
  {&lt;br /&gt;
    echo Mayusculas::convertir(&amp;quot;Julio Noguera&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos creamos un fichero en app-&amp;gt;Http-&amp;gt;Traits-&amp;gt;Mayusculas.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
namespace App\Http\Traits;&lt;br /&gt;
&lt;br /&gt;
trait Mayusculas&lt;br /&gt;
{&lt;br /&gt;
    public static function convertir(string $string)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        $mayusculas=strtoupper($string);&lt;br /&gt;
&lt;br /&gt;
        return $mayusculas;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://diego.com.es/traits-en-php&lt;br /&gt;
&lt;br /&gt;
=== GENERAR PDF ===&lt;br /&gt;
&lt;br /&gt;
Instalamos libreria&lt;br /&gt;
&lt;br /&gt;
composer require barryvdh/laravel-dompdf&lt;br /&gt;
&lt;br /&gt;
añadimos la siguiente ruta en config/app.php en el array 'provider'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Barryvdh\DomPDF\ServiceProvider::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
luego añadimos la siguiente ruta en config/app.php en el array 'aliases'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
'PDF' =&amp;gt; Barryvdh\DomPDF\Facade::class,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
crearmos ruta en Web&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Route::get('/imprimir', 'RelacionController@imprimir')-&amp;gt;name('imprimir');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y una vista llamada 'imprimir.blade.php' con código en html&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Página de prueba&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
use PDF;&lt;br /&gt;
......&lt;br /&gt;
&lt;br /&gt;
public function imprimir(){&lt;br /&gt;
     $pdf = PDF::loadView('imprimir');&lt;br /&gt;
     return $pdf-&amp;gt;download('ejemplo.pdf');&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.nigmacode.com/laravel/Generar-pdf-Dompdf-Laravel&lt;br /&gt;
&lt;br /&gt;
=== DEBUGBAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
composer require barryvdh/laravel-debugbar --dev&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dentro de config-&amp;gt;App añadimos en '''provider'''&lt;br /&gt;
&lt;br /&gt;
Barryvdh\Debugbar\ServiceProvider::class,&lt;br /&gt;
&lt;br /&gt;
En '''aliases'''&lt;br /&gt;
&lt;br /&gt;
'Debugbar' =&amp;gt; Barryvdh\Debugbar\Facade::class,&lt;br /&gt;
&lt;br /&gt;
===EJERCICIO 1===&lt;br /&gt;
&lt;br /&gt;
1. Se desea crear una filmografía de películas, por ello, debemos crear una página web que liste todas las películas que tiene almacenada localmente (array, fichero), también cabe la posiblidad de tener un formulario donde se pueda introducir el nombre de la película, año, director, descripción y una imagen (url) y se almacene.&lt;br /&gt;
&lt;br /&gt;
Habrá que crear las rutas (crear, buscar/{id}, listar) y las correspondientes vistas(herencia). Lo ideal es que se muestre la imagen de película y clicando sobre ella muestre el resto de la información.&lt;br /&gt;
&lt;br /&gt;
:[[array_ejemplo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@bapunawarsaddam/rest-api-with-laravel-5-8-using-laravel-passport-53b5953798bb&lt;br /&gt;
&lt;br /&gt;
https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424&lt;br /&gt;
&lt;br /&gt;
https://github.com/chiraggude/awesome-laravel&lt;br /&gt;
&lt;br /&gt;
Intersante&lt;br /&gt;
&lt;br /&gt;
Lazy Size&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15381</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15381"/>
				<updated>2021-03-22T18:37:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJEMPLO POST EN AJAX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CORS'''&lt;br /&gt;
&lt;br /&gt;
Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
 :[[solució exercici1-Ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
 :[[solució exercici espera]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 :[[solució exercici2-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 :[[solució exercici3-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 :[[solució exercici-nom]]&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
 :[[solució exercici4-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
:[[solució exercici6-ajax]]&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15377</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15377"/>
				<updated>2021-03-22T18:06:14Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* EJEMPLO POST EN AJAX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//CORS&lt;br /&gt;
// Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio. Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
// Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
//header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);  &lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
 :[[solució exercici1-Ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
 :[[solució exercici espera]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 :[[solució exercici2-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 :[[solució exercici3-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 :[[solució exercici-nom]]&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
 :[[solució exercici4-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
:[[solució exercici6-ajax]]&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15376</id>
		<title>NF1 - AJAX</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=NF1_-_AJAX&amp;diff=15376"/>
				<updated>2021-03-22T18:01:26Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* FETCH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= AJAX =&lt;br /&gt;
&lt;br /&gt;
Ajax significa Asynchronous JavaScript i XML, un terme que va ser encunyat per Jesse James Garrett en Adaptive Path, el febrer de 2005. S'hi descriu una metodologia de desenvolupament d'aplicacions web d'una manera diferent a la tradicional. &lt;br /&gt;
Segons l'article, les aplicacions web i llocs tradicionals funcionen sincrònicament-cada vegada &lt;br /&gt;
segueix un enllaç, o quan s'envia un formulari, el navegador envia les dades al servidor, el servidor (amb sort) respon, i tota la pàgina s'actualitza.&lt;br /&gt;
Aplicacions Ajax funcionen de forma asíncrona, el que significa que envies dades d'anada i tornada entre el navegador i el servidor sense haver de recarregar tota la pàgina. Substitueix només les parts de la pàgina que canvia. &lt;br /&gt;
[[Fitxer:ajax_vs_traditional.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
El realment bo d'això és que la comunicació entre el motor Ajax i el navegador passa a través de JavaScript i no a través de carregar la pàgina. &lt;br /&gt;
En termes pràctics, això significa per a l'usuari final menys temps d'espera per carregar les pàgines i la visualització, i més fàcil la interacció amb la pàgina, per que pots sol·licitar dades i continuar llegint el text o el contingut d'una altre part de la pàgina.&lt;br /&gt;
== Els principals elements d'AJAX ==&lt;br /&gt;
Ajax no és una tecnologia única. Més aviat, és una col·lecció de quatre tecnologies que es complementen:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Tecnologia&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Expliació&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript ||És un llenguatge de scripting de propòsit general dissenyat per a ser integrat dins les aplicacions. L'intèrpret de JavaScript en un navegador web permet la interacció programàtica amb moltes de les capacitats incorporades del navegador. Aplicacions Ajax estan escrits en JavaScript.&lt;br /&gt;
|-&lt;br /&gt;
| Cascading Style Sheets (CSS) || Ofereix una forma de definir els estils visuals reutilitzables per a elements de la pàgina web. Ofereix una forma senzilla i potent de definir i aplicar un estil visual consistent. En una aplicació Ajax, l'estil d'una interfície d'usuari es pot ajustar de forma interactiva a través de CSS.&lt;br /&gt;
|-&lt;br /&gt;
| Document Object Model (DOM) ||El DOM presenta l'estructura de les pàgines web com un conjunt d'objectes programables que poden ser manipulats amb JavaScript. Scripts del DOM permet a una aplicació Ajax modificar la interfície d'usuari sobre la marxa, tornar a dibuixar de manera efectiva les parts de la pàgina.&lt;br /&gt;
|-&lt;br /&gt;
| XMLHttpRequest object (XHR) || El objecte XMLHttpRequest permet que els programadors web recuperarin les dades des del servidor web com una activitat de fons. El format de dades és típicament XML, però funciona bé amb totes les dades basades en text.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Funcionament ==&lt;br /&gt;
L'objecte XHR ens permet fer peticions HTTP al servidor i rebre la resposta mitjançant programació , en lloc que el navegador doni automàticament la resposta com una nova pàgina . &lt;br /&gt;
El primer que hem de fer és crear un objecte XHR. A continuació , proporcionar-li la informació que necessita per realitzar la sol·licitud i finalment , gestionar la resposta quan ens la donen.Entre l'enviament de la sol·licitudi la recepció de la resposta , hi ha feina per fer en el servidor, i algunes linies més de codi que hem d'escriure en PHP, Java, .NET o qualsevol altre. &lt;br /&gt;
&lt;br /&gt;
Ens interessa principalment el codi del costat del client, a més la mecànica del costat del servidor de maneig d'una senzilla&lt;br /&gt;
petició Ajax no són molt diferents de programació web pre-Ajax.&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:lifecycle-ajax.png|center]]&lt;br /&gt;
&lt;br /&gt;
===El API XMLHttpRequest===&lt;br /&gt;
El cor d'AJAX és una API anomenada XMLHttpRequest(XHR), disponible en els llenguatges de scripting en el costat del client,com ara JavaScript. S'utilitza per realitzar peticions, HTTP o HTTPS, directament al servidor web, i per carregar les respostes directament a la pàgina del client. Les dades que rebem des del servidor es poden rebre en forma de text pla o text XML. Aquestes dades podran ser utilitzats per modificar el DOM del document actual, sense haver de recarregar la pàgina, o també podran ser avaluats amb JavaScript, si són rebuts en format JSON.&lt;br /&gt;
XMLHttpRequest juga un paper molt important en la tècnica AJAX, ja que sense aquest objecte, no seria possible realitzar les peticions asíncrones al servidor.&lt;br /&gt;
Una de les limitacions de XMLHTTPR equest és que, per seguretat, només ens deixa realitzar peticions AJAX, a les pàgines que es trobin allotjades en el mateix domini, des del qual s'està realitzant la petició AJAX.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== L'objecte XHR (XMLHttpRequest) ===&lt;br /&gt;
En un món perfecte, el codi escrit per a un navegador funcionaria en tots els navegadors. Ja hem après que no vivim en aquest món, i les coses no són diferents quan es tracta d'Ajax. Hi ha una manera estàndard de fer peticions asíncrones a través de l'objecte JavaScript XHR, i una manera patentada Internet Explorer que utilitza un control ActiveX. Amb IE 7, un embolcall que emula la interfície estàndard està disponible, però IE 6 requereix codi diferent.&lt;br /&gt;
Un cop creat l'objecte XHR, el codi per configurar, iniciar i respondre a la sol·licitud és relativament independent del navegador, i la creació d'una instància de XHR és fàcil per a qualsevol navegador en particular. El problema és que els diferents navegadors implementen XHR de diferents maneres, i hem de crear la instància de la manera adequada per al navegador actual.&lt;br /&gt;
Utilitzarem la técnica ''featured detection'' per averiguar quin objecte XHR podem crear pel navegador actual. &lt;br /&gt;
Exemple de la '''creació''' d'aquest Objecte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var xhr;&lt;br /&gt;
if (window.ActiveXObject) { //Iexplorer&lt;br /&gt;
	xhr = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
else if (window.XMLHttpRequest) { //Tots els altres navegadors que soporten ajax&lt;br /&gt;
	xhr = new XMLHttpRequest();&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
	throw new Error(&amp;quot;Ajax is not supported by this browser&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mètodes i propietats de l'objecte XHR ===&lt;br /&gt;
Primer donem una ullada als mètodes del Objecte XMLHttpRequest:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Mètode&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| abort() || Fa que la Sol·licitud que s'està executant sigui cancel·lada.&lt;br /&gt;
|-&lt;br /&gt;
| getAllResponseHeaders() || Retorna una cadena que conté els noms i valors de totes les capçaleres de resposta.&lt;br /&gt;
|-&lt;br /&gt;
| getResponseHeader(name) || Retorna el valor de la capçalera de la resposta anomenada 'named'.&lt;br /&gt;
|-&lt;br /&gt;
| open(method,url,async, username,password)  || Estableix el mètode HTTP (GET o POST) i l'URL de destinació de la sol·licitud. Opcionalment, la sol·licitud pot ser declarada síncrona (async=false), i es pot subministrar un nom d'usuari i contrasenya per a les sol·licituds que requereixen autenticació.&lt;br /&gt;
|-&lt;br /&gt;
| send(dades) ||dades: S'usa en el cas que estiguem utilitzant el mètode POST, com a mètode d'enviament.Si fem servir GET, dades serà null&lt;br /&gt;
|-&lt;br /&gt;
| setRequestHeader(name,value)  || Afegeix el parell etiqueta / valor a la capçalera de dades que s'enviarà al servidor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exemples amb els diferents mètodes de enviament d'informació (GET i POST):&lt;br /&gt;
*Exemple amb GET: Amb el mètode GET els paràmetres es passen a la mateixa URL.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;datos.php?curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;, true);&lt;br /&gt;
xmlhttp.send(null);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*Exemple amb POST: Con el método POST los parámetros se pasan con la función datos.send().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xmlhttp.open(&amp;quot;POST&amp;quot;,&amp;quot;datos.php&amp;quot;,true);&lt;br /&gt;
xmlhttp.setRequestHeader(&amp;quot;Content-type&amp;quot;,&amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
xmlhttp.send(&amp;quot;curso=SMX1&amp;amp;tutor=Julio+Noguera&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
si no s'estableix la capçalera &amp;quot;Content-Type&amp;quot; correcta, el servidor descarta totes les dades enviades mitjançant el mètode POST. D'aquesta manera, al programa que s'executa en el servidor no li arriba cap paràmetre. Així, per enviar paràmetres mitjançant el mètode POST, és obligatori incloure la capçalera &amp;quot;Content-Type&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Propietats del Objecte XMLHttpRequest:===&lt;br /&gt;
&lt;br /&gt;
L'objecte XMLHttpRequest, disposa de les següents propietats, que ens faciliten informació sobre el estat de la petició al servidor, i on rebrem les dades de la resposta retornada a la petició AJAX:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Propietat&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;450 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Descripció&lt;br /&gt;
|-&lt;br /&gt;
| onreadystatechange  || Emmagatzema una funció (o el nom d'una funció), que serà cridada automàticament, cada vegada que es produeixi un canvi en la propietat readyState.&lt;br /&gt;
|-&lt;br /&gt;
| readyState ||Emmagatzema l'estat de la petició XMLHTTPRequest. Possibles estats, del 0 al 4:&lt;br /&gt;
'''0:''' sol·licitud no inicialitzada.&lt;br /&gt;
&lt;br /&gt;
'''1:''' connexió establerta amb el servidor.&lt;br /&gt;
&lt;br /&gt;
'''2:''' sol·licitud rebuda.&lt;br /&gt;
&lt;br /&gt;
'''3:''' processant sol·licitud.&lt;br /&gt;
&lt;br /&gt;
'''4:''' sol·licitud ja acabada i la resposta està disponible.&lt;br /&gt;
|-&lt;br /&gt;
| responseText || Conté les dades de resposta, com una cadena de text.&lt;br /&gt;
|-&lt;br /&gt;
| responseXML  ||  Si es responseText és XML aqui trobem l'arbre XML DOM associat. Datos devueltos por el servidor en forma de documento XML que puede ser recorrido mediante las funciones del DOM (getEementsByTagName, etc.).Retorna un [object XMLDocument]&lt;br /&gt;
|-&lt;br /&gt;
| status  || El codi d'estat de resposta retornat pel servidor. Per exemple: 200 per a l'èxit o el 404 perquè no es troba. Consulteu l'especificació [http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 HTTP] per a tot el conjunt de codis.&lt;br /&gt;
|-&lt;br /&gt;
| statusText  || El missatge de text de l'estat retornat pel servidor. (per exemple: &amp;quot;Not Found&amp;quot; o &amp;quot;OK&amp;quot;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utilització de l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
Ara que tenim una instància XHR creada, donem una ullada al que es necessita per configurar i executar la sol·licitud al servidor.&lt;br /&gt;
&lt;br /&gt;
*Especificar un mètode HTTP com GET o POST&lt;br /&gt;
*Especificar la URL del servidor al que demanarem la informació a mostrar a l'usuari&lt;br /&gt;
*Especificar a l'objecte XHR la manera que volem saber del progrès de la petició&lt;br /&gt;
*Especificar la informació a enviar al servidor (content).&lt;br /&gt;
&lt;br /&gt;
Amb la següent sentencia javascript especifiquem els primers dos items del llistat anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.open('GET', 'url');&lt;br /&gt;
o&lt;br /&gt;
xhr.open('POST', 'url');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tingues en compte que la sentencia anterior no envia res al servidor, només estem configurant l'objecte per tal que utilitzi un servidor i un mètode de conexió HTTP.&lt;br /&gt;
&lt;br /&gt;
El tercer item diu que hem de dotar a l'objecte XHR amb un mecanisme d'avís per fer-nos saber com va la petició ajax. Per fer-ho, s'ha d'assignar una funció de resposta (callback function) a la propietat ''onreadystatechange'' del objecte XHR. Aquesta funció l'executarà l'objecte XHR en diverses ocasions, segons l'estat amb el que es trobi l'objecte.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) { &lt;br /&gt;
			// només ens interesa si la petició al servidor &lt;br /&gt;
			// s'ha completat i ha estat correcta.&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			// problema amb la petició&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A l'últim item s'ha d'especificar, si hi ha, la informació necessaria que necessita saber el servidor per tal de processar correctament la petició. Finalment, enviar la petició. Aixó s'aconsegueix amb el mètode ''send()'' de l'objecte XHR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xhr.send(&amp;quot;a=1&amp;amp;b=2&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resposta del servidor mitjançant l'objecte XHR ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una vegada s'ha completat la petició al servidor podem agafar la seva resposta (response) del objecte XHR. El format de la resposta pot ser qualsevol format en mode TEXT; no està limitat a XML. De fet, la majoria del temps, la resposta de Ajax és un altre format. Aquest pot ser text planer, un fragment HTML o pot ser una representació d'objecte de JavaScript com és JSON.&lt;br /&gt;
&lt;br /&gt;
Sigui quin sigui el format del text, la resposta es pot obtenir mitjançant la propietat ''responseText'' del objecte XHR. Si la resposta està en format XML, per que s'ha especificat utilitzant el tipus MIME '''text/xml''' o '''application/xml''', es tractada i es crea un arbre DOM que està disponible a la propietat responseXML del objecte XHR. &lt;br /&gt;
&lt;br /&gt;
Una vegada tenim la resposta del servidor la hem de carregar al element DOM apropiat.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
xhr.onreadystatechange = function() {&lt;br /&gt;
	if (this.readyState == 4) {&lt;br /&gt;
		if (this.status &amp;gt;= 200 &amp;amp;&amp;amp; this.status &amp;lt; 300) {&lt;br /&gt;
			document.getElementById('someContainer').innerHTML = this.responseText;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
       var objetoXHR = new XMLHttpRequest();&lt;br /&gt;
&lt;br /&gt;
       function obtenerDatosServidor(origen, elemento)     //Función “obtenerDatosServidor” contiene dos parámetros&lt;br /&gt;
       {&lt;br /&gt;
           var objeto_destino = document.getElementById(elemento); // Se elige el elemento HTML a ser modificado.&lt;br /&gt;
           objetoXHR.open(“GET”, origen);                 //Se configura una conexión asíncrona con una URL.&lt;br /&gt;
           objetoXHR.onreadystatechange = respuesta;    // Se indica la función a ser llamada una vez el estado&lt;br /&gt;
                                                          // del objeto cambie. &lt;br /&gt;
           objetoXHR.send(null);                          // Se abre la conexión.&lt;br /&gt;
       }&lt;br /&gt;
     &lt;br /&gt;
       function respuesta()&lt;br /&gt;
       {&lt;br /&gt;
            if (objetoXHR.readyState == 4 &amp;amp;&amp;amp; objetoXHR.status == 200) &lt;br /&gt;
            {&lt;br /&gt;
            objeto_destino.innerHTML = objetoXHR.responseText;&lt;br /&gt;
            }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO GET EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$seleccion = $_GET['curso'];&lt;br /&gt;
$tutor = $_GET['tutor'];&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor ;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GET con AJAX'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        window.onload = function () {&lt;br /&gt;
            let datos;&lt;br /&gt;
&lt;br /&gt;
            function mostrar_datos() {&lt;br /&gt;
                if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                    document.getElementById(&amp;quot;resultado&amp;quot;).innerHTML = datos.responseText;&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function iniciar() {&lt;br /&gt;
                var url = 'get.php';&lt;br /&gt;
                var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
                datos = new XMLHttpRequest();&lt;br /&gt;
                datos.open(&amp;quot;GET&amp;quot;, url + '?' + params, true);&lt;br /&gt;
                datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
                datos.send(null);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;boton&amp;quot;).onclick = iniciar;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;get&amp;quot; action=&amp;quot;get.php&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot; selected&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot;&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;boton&amp;quot; name=&amp;quot;boton&amp;quot; value=&amp;quot;ok&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;br&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;CONTENIDO:&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt;resultado&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/b7GuKxIQYOg&lt;br /&gt;
&lt;br /&gt;
===EJEMPLO POST EN AJAX===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$seleccion = $_POST['curso'];&lt;br /&gt;
$tutor = $_POST['tutor'];&lt;br /&gt;
echo &amp;quot;curso &amp;quot;.$seleccion.&amp;quot; tutor &amp;quot;.$tutor;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST con AJAX'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
        var datos;&lt;br /&gt;
&lt;br /&gt;
        function pedir_datos(url, params) {&lt;br /&gt;
            datos = new XMLHttpRequest();&lt;br /&gt;
            datos.open(&amp;quot;POST&amp;quot;, url, true);&lt;br /&gt;
            datos.onreadystatechange = mostrar_datos;&lt;br /&gt;
            datos.setRequestHeader(&amp;quot;Content-type&amp;quot;, &amp;quot;application/x-www-form-urlencoded&amp;quot;);&lt;br /&gt;
            //Llamamos al método setRequestHeader indicando que los datos a enviarse están codificados como un formulario.&lt;br /&gt;
            datos.send(params);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function mostrar_datos() {&lt;br /&gt;
            if (datos.readyState == 4 &amp;amp;&amp;amp; datos.status == 200)&lt;br /&gt;
                document.getElementById('resultado').innerHTML = datos.responseText;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function iniciar() {&lt;br /&gt;
            var url = 'post.php';&lt;br /&gt;
            var params = formulario.curso.name + '=' + formulario.curso.value + '&amp;amp;' + formulario.tutor.name + '=' + formulario.tutor.value;&lt;br /&gt;
            pedir_datos(url, params);&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;formulario&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;javascript: iniciar()&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Curso: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;select name=&amp;quot;curso&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX1&amp;quot;&amp;gt; SMX1 &amp;lt;/option&amp;gt;&lt;br /&gt;
            &amp;lt;option value=&amp;quot;SMX2&amp;quot; selected&amp;gt; SMX2 &amp;lt;/option&amp;gt;&lt;br /&gt;
        &amp;lt;/select&amp;gt;&lt;br /&gt;
        &amp;lt;label&amp;gt;Tutor: &amp;lt;/label&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;tutor&amp;quot; value=&amp;quot;Julio Noguera&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; value=&amp;quot;boton&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;resultado&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Esta cabecera la ponemos para que peticiones AJAX se acepten desde fuera del dominio.&lt;br /&gt;
&lt;br /&gt;
// Sin ella, no funcionaria las peticiones al hosting XXXXX.&lt;br /&gt;
&lt;br /&gt;
// Esta cabecera NO debe estar si haceis peticiones AJAX entre un mismo dominio&lt;br /&gt;
&lt;br /&gt;
header(&amp;quot;Access-Control-Allow-Origin: *&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/ULSCT3nYzJ8&lt;br /&gt;
&lt;br /&gt;
===FETCH===&lt;br /&gt;
&lt;br /&gt;
API fetch es que utiliza promesas, es decir, devuelve un objeto con dos métodos, uno then() y otro catch() a la que pasaremos una función que será invocada cuando se obtenga la respuesta o se produzca un error.&lt;br /&gt;
&lt;br /&gt;
Aquí hay que aclarar un punto con los errores: si se devuelve un código HTTP correspondiente a un error no se ejecutará el catch(), ya que se ha obtenido una respuesta válida, por lo que se ejecutará el then(). Sólo si hay un error de red o de otro tipo se ejecutará el catch().&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante que hay que comprender es que para obtener el body o cuerpo del mensaje devuelto por el servidor deberemos obtener una segunda promesa por medio de los métodos del objeto Response. Por ello será muy habitual ver dos promesas encadenadas, una para el fetch() y otra con el retorno del método que utilicemos para obtener el body.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fetch('https://httpbin.org/ip')&lt;br /&gt;
    .then(function(response) { //Este objeto 'response' contiene la respuesta que hace el servidor y dispone de una serie de propiedades con los valores de esa respuesta&lt;br /&gt;
        console.log('response.body =', response.body);&lt;br /&gt;
        console.log('response.bodyUsed =', response.bodyUsed);&lt;br /&gt;
        console.log('response.headers =', response.headers);&lt;br /&gt;
        console.log('response.ok =', response.ok);&lt;br /&gt;
        console.log('response.status =', response.status);&lt;br /&gt;
        console.log('response.statusText =', response.statusText);&lt;br /&gt;
        console.log('response.type =', response.type);&lt;br /&gt;
        console.log('response.url =', response.url);&lt;br /&gt;
        return response.text();&lt;br /&gt;
    })&lt;br /&gt;
    .then(function(data) {&lt;br /&gt;
        console.log('data = ', data);&lt;br /&gt;
    })&lt;br /&gt;
    .catch(function(err) {&lt;br /&gt;
        console.error(err);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-hemos llamado a fetch() con la URL a la que queremos acceder como parámetro esta llamada nos devuelve una promesa&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa nos entrega un objeto response&lt;br /&gt;
&lt;br /&gt;
-del objeto response llamamos al método text() para obtener el cuerpo retornado en forma de texto&lt;br /&gt;
&lt;br /&gt;
-nos devuelve otra promesa que se resolverá cuando se haya obtenido el contenido&lt;br /&gt;
&lt;br /&gt;
-el método then() de esa promesa recibe el cuerpo devuelto por el servidor en formato de texto&lt;br /&gt;
&lt;br /&gt;
-hemos incluido un catch() por si se produce algún error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let data = new FormData();   &lt;br /&gt;
// También se puede enviar cambiando el FormData&lt;br /&gt;
// data = new URLSearchParams(&amp;quot;profesor=Julio&amp;amp;INS=La Merce&amp;quot;);&lt;br /&gt;
data.append('profesor', 'Julio');&lt;br /&gt;
data.append('INS', 'La Mercè');&lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: data&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
   if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;INS&amp;quot;].$_POST[&amp;quot;profesor&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''OTRA FORMA RECUPERANDO DATOS DEL FORMULARIO'''&lt;br /&gt;
&lt;br /&gt;
'''HTML'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;form  action='./datos.php' id=&amp;quot;formulario&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&lt;br /&gt;
  Input1: &amp;lt;input name='input1'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  Input2: &amp;lt;input name='input2'&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;input type='submit'&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''JS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var testForm = document.getElementById('formulario');&lt;br /&gt;
    testForm.onsubmit = function(event) {   //en el momento que se activa un botón submit&lt;br /&gt;
    event.preventDefault();   //evita que se propague el evento recargando la página.&lt;br /&gt;
    var formData = new FormData(document.getElementById('formulario'));  //recupera los datos del formulario.&lt;br /&gt;
   &lt;br /&gt;
fetch('./datos.php', {&lt;br /&gt;
   method: 'POST',&lt;br /&gt;
   body: formData&lt;br /&gt;
})&lt;br /&gt;
.then(function(response) {&lt;br /&gt;
      if(response.ok) {&lt;br /&gt;
       return response.text()&lt;br /&gt;
   } else {&lt;br /&gt;
       throw &amp;quot;Error en la llamada Ajax&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
})&lt;br /&gt;
.then(function(texto) {&lt;br /&gt;
   console.log(texto);&lt;br /&gt;
})&lt;br /&gt;
.catch(function(err) {&lt;br /&gt;
   console.log(err);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SERVIDOR'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
echo $_POST[&amp;quot;input1&amp;quot;].$_POST[&amp;quot;input2&amp;quot;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/6BeO1gObVS8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.todojs.com/api-fetch-el-nuevo-estandar-que-permite-hacer-llamadas-http/&lt;br /&gt;
&lt;br /&gt;
https://cursos.mejorcodigo.net/article/el-fetch-api-en-javascript-43&lt;br /&gt;
&lt;br /&gt;
https://desarrolloweb.com/articulos/fetch-post-ajax-javascript.html&lt;br /&gt;
&lt;br /&gt;
===AXIOS===&lt;br /&gt;
&lt;br /&gt;
Axios es una librería  JavaScript que puede ejecutarse en el navegador y que nos permite hacer sencillas las operaciones como cliente HTTP, por lo que podremos configurar y realizar solicitudes a un servidor y recibiremos respuestas fáciles de procesa.&lt;br /&gt;
&lt;br /&gt;
Así que Axios es una alternativa que nos brinda multitud de ventajas:&lt;br /&gt;
&lt;br /&gt;
*La API es unificada para las solicitudes Ajax.&lt;br /&gt;
*Está optimizado para facilitar el consumo de servicios web, API REST y que devuelvan datos JSON.&lt;br /&gt;
*De fácil utilización y como complemento perfecto para las páginas convencionales.&lt;br /&gt;
*Pesa poco, apenas 13KB minimizado. Menos aún si se envía comprimido al servidor.&lt;br /&gt;
*Compatibilidad con todos los navegadores en sus versiones actuales.&lt;br /&gt;
&lt;br /&gt;
'''TABLA COMPARATIVA'''&lt;br /&gt;
&lt;br /&gt;
https://www.javascriptstuff.com/ajax-libraries/&lt;br /&gt;
&lt;br /&gt;
'''GET''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://unpkg.com/axios/dist/axios.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
 axios({&lt;br /&gt;
    url: 'https://api.github.com/users/julio', //Endpoint&lt;br /&gt;
    method: 'GET',  //Método&lt;br /&gt;
    timeout: 3000,  //Tiempo máximo de espera&lt;br /&gt;
    responseType: 'JSON',  //Tipo de respuesta (Por defecto es JSON)&lt;br /&gt;
    }).then(function (response) {&lt;br /&gt;
       //Si todo OK te imprime la respuesta&lt;br /&gt;
       console.log(response.data); //Datos de la respuesta&lt;br /&gt;
       console.log(response.status); //Estatus&lt;br /&gt;
       console.log(response.statusText); //Mensaje del estatus&lt;br /&gt;
       console.log(response.headers); // Encabezados&lt;br /&gt;
    }).catch(function (error) {&lt;br /&gt;
       //Si hay error el catch lo imprime&lt;br /&gt;
       console.log(error.response); //Objeto respuesta&lt;br /&gt;
       console.log(error.response.data); // Respuesta del servidor&lt;br /&gt;
       console.log(error.response.status); //Código de error&lt;br /&gt;
       console.log(error.response.statusText); //Mensaje del error&lt;br /&gt;
   });&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios({&lt;br /&gt;
                url: 'data.php',&lt;br /&gt;
                method: 'POST',&lt;br /&gt;
                data: data&lt;br /&gt;
            }).then(function (response) {&lt;br /&gt;
                console.log(response.data);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error.response.statusText);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA GET'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    axios.get('/user?ID=12345')&lt;br /&gt;
      .then(function (response) {&lt;br /&gt;
        console.log(response);&lt;br /&gt;
      })&lt;br /&gt;
      .catch(function (error) {&lt;br /&gt;
        console.log(error);&lt;br /&gt;
      });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''FORMA MÁS ABREVIADA POST'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
        let data = new FormData();&lt;br /&gt;
        data.append('nombre', 'John');&lt;br /&gt;
        data.append('apellido', 'Die');&lt;br /&gt;
        axios.post('data.php', data)&lt;br /&gt;
              .then(function (response) {&lt;br /&gt;
                console.log(response);&lt;br /&gt;
            }).catch(function (error) {&lt;br /&gt;
                console.log(error);&lt;br /&gt;
            });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VIDEOTUTORIAL'''&lt;br /&gt;
&lt;br /&gt;
https://youtu.be/-Fl11UJmYSQ&lt;br /&gt;
&lt;br /&gt;
https://www.hoclabs.com/2017/05/30/axios-promesas-y-http/&lt;br /&gt;
&lt;br /&gt;
===ASYNC AWAIT===&lt;br /&gt;
&lt;br /&gt;
https://codingpotions.com/vue-axios#async--await-para-las-llamadas&lt;br /&gt;
&lt;br /&gt;
https://blog.nexlab.dev/tech/2018/08/31/que-es-async-await-en-javascript.html&lt;br /&gt;
&lt;br /&gt;
https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=stiPdlSkTOI&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
=== Exercici 1 ===&lt;br /&gt;
&lt;br /&gt;
Crea una petició amb AJAX per tal de conèixer els paràmetres de configuració del php. Et recordo que per obtenir-los només cal executar la funció de php anomenada  phpinfo();&lt;br /&gt;
 :[[solució exercici1-Ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 2 ===&lt;br /&gt;
&lt;br /&gt;
Realitzar un exercici que mostri per pantalla en quin estat de petició està (1 al 4) per pantalla, per a això s'haurà d'afegir en un fitxer anomenat espera a php o jsp amb una pausa de tres segons i quan acabi haurà de mostrar el temps abans i després d'aquest temps.&lt;br /&gt;
 :[[solució exercici espera]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 3 ===&lt;br /&gt;
Crea dos camps (nom i cognom). Envia la informació mitjançant AJAX al servidor PHP i fes que et retorni els valors passats a majúscules. Insereix directament amb HTML la informació a un DIV a la pàgina &lt;br /&gt;
 :[[solució exercici2-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 4 ===&lt;br /&gt;
Desplegables encadenats. Es vol crear 2 desplegables en HTML que la seva informació la obtingui del servidor mitjançant AJAX. &lt;br /&gt;
El primer Desplegable ha de contenir les següents ciutats: Barcelona, Madrid, Sevilla, LaCoruña.&lt;br /&gt;
El segon desplegable mostrarà els Barris de la Ciutat escollida al primer desplegable.&lt;br /&gt;
 :[[solució exercici3-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 5 ===&lt;br /&gt;
*a)Crea un formulari que demani nom d'usuari i contrasenya. Crea un botó de validació que validi amb AJAX que l'usuari introduït no existeixi. Si existeix s'ha de proposar un nom alternatiu. Com no utilitzarem BD crea un fitxer on a cada linia hi hagi un nom d'usuari. El nou nom d'usuari no ha de coincidir amb cap dels noms que apareix a la llista.&lt;br /&gt;
&lt;br /&gt;
 :[[solució exercici-nom]]&lt;br /&gt;
*b)Crea un Botó anomenat enviar que mitjançant AJAX envii el nom d'usuari i la contrasenya al servidor. El nom d'usuari s'ha d'afegir al fitxer anterior.&lt;br /&gt;
 :[[solució exercici4-ajax]]&lt;br /&gt;
&lt;br /&gt;
=== Exercici 6 ===&lt;br /&gt;
&lt;br /&gt;
Es tracta de crear un input que s'introduiran noms i mitjançant ajax consultar la base de dades si hi ha el nom en cas d'existir ha de mostrar tots els noms que comencen amb les lletres introduïdes&lt;br /&gt;
:[[solució exercici6-ajax]]&lt;br /&gt;
&lt;br /&gt;
ocult&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
Per realitzar aquest exercicis es necessita una màquina virtual amb els programes apache i php5 instalats.&lt;br /&gt;
https://uf.ctrl-alt-d.net/material/mostra/236/ajax-i-jquery-prediccions-metereologiques&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://www.svnlabs.com/blogs/php-spotify-web-api/&lt;br /&gt;
&lt;br /&gt;
https://developer.spotify.com/dashboard/&lt;br /&gt;
&lt;br /&gt;
= Referències =&lt;br /&gt;
*http://www.w3schools.com/ajax/default.ASP&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX&lt;br /&gt;
*https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started&lt;br /&gt;
*http://www.xul.fr/en-xml-ajax.html&lt;br /&gt;
&lt;br /&gt;
= Bibliografia =&lt;br /&gt;
&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Dace Crane, Bear Bibeault, Jord Sonneveld,&amp;quot;Ajax in Practice&amp;quot;, Ed. Manning, 2007, ISBN 1-932394-99-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Christian Heilmann, &amp;quot;Beginning JavaScript with DOM Scripting and Ajax&amp;quot;, Ed. Apress, 2006, ISBN 1-59059-680-3 &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=VUEJS&amp;diff=15375</id>
		<title>VUEJS</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=VUEJS&amp;diff=15375"/>
				<updated>2021-03-22T17:08:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Ejercicios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:vueimagen.png]]&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=ub8ZU3JxNsM&amp;amp;list=PL7VXpoQP1k247QUTTxHcYBNyCg1j2ALfD&lt;br /&gt;
&lt;br /&gt;
v-text: para mostrar texto y que no parpadee&lt;br /&gt;
&lt;br /&gt;
v-show: para mostrar u ocultar el elemento en función de su valor. v-show=&amp;quot;true&amp;quot; es igual v-show=&amp;quot;mensaje&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===V-TEXT===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt; {{mensaje}}&amp;lt;/h1&amp;gt;    &amp;lt;!--podemos ver --&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  //CDN&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
         Vue.config.devtools = true;    &lt;br /&gt;
         new Vue({&lt;br /&gt;
            el: '#el',   //hace referencia al elemento id= el&lt;br /&gt;
            data: {&lt;br /&gt;
                mensaje: &amp;quot;resultado&amp;quot;   //datos, hace referencia dentro de elemento #el {{mensaje}} &lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;h1&amp;gt;Hola &amp;lt;span v-text=&amp;quot;mensaje&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;   &amp;lt;!--muestra &amp;quot;Hola&amp;quot; y luego en función del texto del input va rellenando--&amp;gt;&lt;br /&gt;
                &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;text&amp;quot; v-model=&amp;quot;mensaje&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        var variable = new Vue({&lt;br /&gt;
            el: '#el',&lt;br /&gt;
            data: {&lt;br /&gt;
                mensaje: &amp;quot;resultado&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    &lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===V-SHOW===&lt;br /&gt;
v-show: para mostrar u ocultar el elemento en función de su valor. v-show=&amp;quot;true&amp;quot; es igual v-show=&amp;quot;mensaje&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h1 v-show=&amp;quot;mensaje.length &amp;gt; 2&amp;quot;&amp;gt;Ejemplo &amp;lt;span v-text=&amp;quot;mensaje&amp;quot;&amp;gt; {{mensaje}}&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;  &amp;lt;!--al recargar la pagina, se puede ver {{mensaje}} para evitar esto se usa la directiva v-text--&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;text&amp;quot; v-model=&amp;quot;mensaje&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
            mensaje: &amp;quot;resultado&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;h1 v-show=&amp;quot;mensaje.length &amp;gt; 2&amp;quot;&amp;gt;Hola &amp;lt;span v-text=&amp;quot;mensaje&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;   &amp;lt;!--si el mensaje es mayor que 2 muestra en caso contrario hace un display:none en css--&amp;gt;&lt;br /&gt;
                &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;text&amp;quot; v-model=&amp;quot;mensaje&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        var variable = new Vue({&lt;br /&gt;
            el: '#el',&lt;br /&gt;
            data: {&lt;br /&gt;
                mensaje: &amp;quot;resultado&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    &lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===V-IF===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;h1 v-if=&amp;quot;mensaje.length &amp;gt; 2&amp;quot;&amp;gt;Hola &amp;lt;span v-text=&amp;quot;mensaje&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;    &amp;lt;!--en vez de v-show podemos usar v-if--&amp;gt;&lt;br /&gt;
                &amp;lt;h1 v-else&amp;gt;otra&amp;lt;/h1&amp;gt;&lt;br /&gt;
                &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;text&amp;quot; v-model=&amp;quot;mensaje&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
        var variable = new Vue({&lt;br /&gt;
            el: '#el',&lt;br /&gt;
            data: {&lt;br /&gt;
                mensaje: &amp;quot;resultado&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    &lt;br /&gt;
     &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===V-FOR===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;!-- &amp;lt;li v-text=&amp;quot;profesores[0]&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;--&amp;gt;&lt;br /&gt;
            &amp;lt;li v-for=&amp;quot;profesor in profesores&amp;quot; v-text=&amp;quot;profesor&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
            profesores: [      //utilizamos un array con cadenas&lt;br /&gt;
                &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                &amp;quot;Alex Salinas&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recorriendo Objetos &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;!-- &amp;lt;li v-text=&amp;quot;profesores[0]&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;--&amp;gt;&lt;br /&gt;
            &amp;lt;li v-for=&amp;quot;profesor in profesores&amp;quot; v-text=&amp;quot;profesor.nombre&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {    //utilizamos un array con objetos&lt;br /&gt;
            profesores: [   &lt;br /&gt;
                {nombre:&amp;quot;Julio Noguera&amp;quot;},&lt;br /&gt;
                {nombre: &amp;quot;Albert Canela&amp;quot;},&lt;br /&gt;
                {nombre: &amp;quot;Alex Salinas&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podemos especificar recorrer los objetos y mostrar o acceder a su contenido&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;!-- &amp;lt;li v-text=&amp;quot;profesores[0]&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;--&amp;gt;&lt;br /&gt;
            &amp;lt;li v-for=&amp;quot;profesor in profesores&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;span v-text=&amp;quot;profesor.nombre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                &amp;lt;small v-if=&amp;quot;profesor.activo&amp;quot;&amp;gt;-Activo&amp;lt;/small&amp;gt;&lt;br /&gt;
                &amp;lt;small v-else&amp;gt;-NO está&amp;lt;/small&amp;gt;&lt;br /&gt;
               &lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
            profesores: [{&lt;br /&gt;
                    nombre: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Alex Salinas&amp;quot;,&lt;br /&gt;
                    activo: false&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//en Consola del navegador-&amp;gt;&lt;br /&gt;
// variable.profesores[0].nombre =&amp;quot;Pepe&amp;quot;&lt;br /&gt;
// variable.profesores.push({nombre:&amp;quot;Joan Comas&amp;quot;,activo:true})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EVENTOS y FUNCIONES ===&lt;br /&gt;
&lt;br /&gt;
===CLICK===&lt;br /&gt;
&lt;br /&gt;
Tenemos los datos mensajes y el array de profesores, también el método invertir que se ejecutará cuando se haga click en botón, también es interesante que para acceder a los datos se utiliza this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;mensaje&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h1 v-text=&amp;quot;mensaje&amp;quot;&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;!--  &amp;lt;button @click=&amp;quot;mensaje=mensaje.split('').reverse('').join('')&amp;quot;&amp;gt;BOTON&amp;lt;/button&amp;gt; &amp;lt;!-- @click es abreviación de v-on:click --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;button @click=&amp;quot;invertir&amp;quot;&amp;gt;INVERTIR&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
&lt;br /&gt;
            mensaje: &amp;quot; &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
            profesores: [{&lt;br /&gt;
                    nombre: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Alex Salinas&amp;quot;,&lt;br /&gt;
                    activo: false&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        methods: {&lt;br /&gt;
            invertir: function () {&lt;br /&gt;
                this.mensaje = this.mensaje.split('').reverse('').join('');  //utilizamos this.mensaje para acceder a los datos &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mostrar lista asociando evento click&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.false{background:blue}&lt;br /&gt;
.true{background: green}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div id=&amp;quot;elemento&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
                &amp;lt;li v-for=&amp;quot;profe in profesores&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;span v-text=&amp;quot;profe.nombre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;span @click=&amp;quot;profe.activo=false&amp;quot; v-if=&amp;quot;profe.activo&amp;quot; class=&amp;quot;false&amp;quot;&amp;gt;X&amp;lt;/span&amp;gt;&lt;br /&gt;
                    &amp;lt;span @click=&amp;quot;profe.activo=true&amp;quot; v-else class=&amp;quot;true&amp;quot;&amp;gt;X&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                &amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
            &amp;lt;pre&amp;gt;&lt;br /&gt;
                    {{$data}}&lt;br /&gt;
            &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#elemento',&lt;br /&gt;
        data: {&lt;br /&gt;
&lt;br /&gt;
            profe: &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
            profesores: [{&lt;br /&gt;
                    nombre: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Alex Salinas&amp;quot;,&lt;br /&gt;
                    activo: false&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''BOTÓN- AÑADIR LISTA'''&lt;br /&gt;
&lt;br /&gt;
===KEYUP===&lt;br /&gt;
&lt;br /&gt;
Eventos de teclado&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;ul&amp;gt;&lt;br /&gt;
            &amp;lt;!-- &amp;lt;li v-text=&amp;quot;profesores[0]&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;--&amp;gt;&lt;br /&gt;
            &amp;lt;li v-for=&amp;quot;profesor in profesores&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;span v-text=&amp;quot;profesor.nombre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                &amp;lt;small v-if=&amp;quot;profesor.activo&amp;quot;&amp;gt;-Activo&amp;lt;/small&amp;gt;&lt;br /&gt;
                &amp;lt;small v-else&amp;gt;-NO está&amp;lt;/small&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
             &amp;lt;input v-on:keyup.13=&amp;quot;anadir&amp;quot; type=&amp;quot;text&amp;quot; v-model=&amp;quot;profe&amp;quot; &amp;gt;   &amp;lt;!-- cuando apretamos el ENTER hace el evento (el 13 es enter en ascii)--&amp;gt;&lt;br /&gt;
             &amp;lt;!-- &amp;lt;input v-on:keyup.enter=&amp;quot;anadir&amp;quot; type=&amp;quot;text&amp;quot; v-model=&amp;quot;profe&amp;quot; &amp;gt;  --&amp;gt;&lt;br /&gt;
           &amp;lt;!-- &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;profe&amp;quot;&amp;gt; --&amp;gt;&lt;br /&gt;
           &amp;lt;!-- &amp;lt;button @click=&amp;quot;anadir&amp;quot;&amp;gt;+ añadir&amp;lt;/button&amp;gt;--&amp;gt;&lt;br /&gt;
        &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
&lt;br /&gt;
            profe: &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
            profesores: [{&lt;br /&gt;
                    nombre: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                    activo: true&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Alex Salinas&amp;quot;,&lt;br /&gt;
                    activo: false&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        methods: {&lt;br /&gt;
            anadir: function () {&lt;br /&gt;
&lt;br /&gt;
                this.profesores.push({&lt;br /&gt;
                    nombre: this.profe,&lt;br /&gt;
                    activo: false&lt;br /&gt;
                });&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DIRECTIVA V-BIND=== &lt;br /&gt;
&lt;br /&gt;
'''PARA ACTIVAR CLASES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    .rojo {&lt;br /&gt;
        background: red;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .verde {&lt;br /&gt;
        background: green;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;div id=&amp;quot;elemento&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--v-bind:class=&amp;quot;['glyphicon',tarea.completo ? 'glyphicon-check': 'glyphicon-unchecked']&amp;quot;  //en el caso de querer añadir varias clases--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;li v-for=&amp;quot;tarea in tareas&amp;quot;&amp;gt; &lt;br /&gt;
                  &amp;lt;span v-text=&amp;quot;tarea.nombre&amp;quot; @click=&amp;quot;tarea.completo=!tarea.completo&amp;quot; &amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                  &amp;lt;input type=&amp;quot;checkbox&amp;quot;  v-model=&amp;quot;tarea.completo&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;span v-bind:class=&amp;quot;{  &lt;br /&gt;
                               'rojo':tarea.completo,&lt;br /&gt;
                               'verde': ! tarea.completo&lt;br /&gt;
                                }&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
              &amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;/ul&amp;gt;&lt;br /&gt;
          &amp;lt;pre&amp;gt;&lt;br /&gt;
                  {{$data}}&lt;br /&gt;
               &lt;br /&gt;
          &amp;lt;/pre&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var variable = new Vue({&lt;br /&gt;
      el: '#elemento',&lt;br /&gt;
      data: {&lt;br /&gt;
&lt;br /&gt;
          tareas: [{&lt;br /&gt;
              nombre: &amp;quot;Estudiar&amp;quot;,&lt;br /&gt;
              completo: true&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
              nombre: &amp;quot;Repasar&amp;quot;,&lt;br /&gt;
              completo: true&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
              nombre: &amp;quot;Examinar&amp;quot;,&lt;br /&gt;
              completo: false&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          ]&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''INCREMENTAR''' &lt;br /&gt;
&lt;br /&gt;
Como se puede ver, se produce un incremento de voto modificando su atributo directamente. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;veamos&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
            &amp;lt;ul&amp;gt;&lt;br /&gt;
              &amp;lt;li v-for=&amp;quot;storie in stories&amp;quot;&amp;gt;&amp;lt;button  @click=&amp;quot;storie.votos++&amp;quot;&amp;gt;Vote&amp;lt;/button&amp;gt;&amp;lt;pre v-text=&amp;quot;storie.votos&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;/ul&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;pre&amp;gt;&lt;br /&gt;
{{$data | json}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    new Vue({&lt;br /&gt;
        el: '.container',&lt;br /&gt;
        data: {&lt;br /&gt;
            stories: [{&lt;br /&gt;
                    politico: &amp;quot;julio&amp;quot;,&lt;br /&gt;
                    votos: 1&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    politico: &amp;quot;paco&amp;quot;,&lt;br /&gt;
                    votos: 2&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    politico: &amp;quot;raúl&amp;quot;,&lt;br /&gt;
                    votos: 3&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    politico: &amp;quot;jorge&amp;quot;,&lt;br /&gt;
                    votos: 4&lt;br /&gt;
                },&lt;br /&gt;
            ]&lt;br /&gt;
        }        &lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FILTRAR ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;range&amp;quot; v-model=&amp;quot;minimo&amp;quot; min=&amp;quot;0&amp;quot; max=&amp;quot;50&amp;quot;&amp;gt;  &lt;br /&gt;
    &amp;lt;div v-text=&amp;quot;minimo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div v-for=&amp;quot;dato in filtrar&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div v-text=&amp;quot;dato.descripcion&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;input type=&amp;quot;search&amp;quot; v-model=&amp;quot;campo&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div v-for=&amp;quot;dato in busqueda&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div v-text=&amp;quot;dato.descripcion&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    Vue.config.devtools = true;&lt;br /&gt;
    var app = new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data: {&lt;br /&gt;
&lt;br /&gt;
        minimo: &amp;quot;5&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        campo: &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
        datos: [{&lt;br /&gt;
          codigo: 1,&lt;br /&gt;
          descripcion: 'papas',&lt;br /&gt;
          precio: 12.52&lt;br /&gt;
        }, {&lt;br /&gt;
          codigo: 2,&lt;br /&gt;
          descripcion: 'naranjas',&lt;br /&gt;
          precio: 21&lt;br /&gt;
        }, {&lt;br /&gt;
          codigo: 3,&lt;br /&gt;
          descripcion: 'peras',&lt;br /&gt;
          precio: 18.20&lt;br /&gt;
        }]&lt;br /&gt;
      },&lt;br /&gt;
      computed: {&lt;br /&gt;
        filtrar() {&lt;br /&gt;
          return this.datos.filter((dato) =&amp;gt; dato.precio &amp;gt; this.minimo);&lt;br /&gt;
        },&lt;br /&gt;
        busqueda() {&lt;br /&gt;
          return this.datos.filter((dato) =&amp;gt; dato.descripcion.includes(this.campo));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Componentes==&lt;br /&gt;
&lt;br /&gt;
1. Crear una nueva instancia de Vue con new Vue&lt;br /&gt;
&lt;br /&gt;
2. Existen 3 Objetos básicos y fundamentales que estarán en la mayoria de las aplicaciones web: el data y methods.&lt;br /&gt;
&lt;br /&gt;
3. Se debe crear un contenedor con un id igual al del objeto el para establecer el alcance del framework&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Crear Nuestro primer Componente Básico&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- vue está disponible en todo este div--&amp;gt;&lt;br /&gt;
    &amp;lt;hola-mundo&amp;gt;&amp;lt;/hola-mundo&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  Vue.component('hola-mundo', {    //debe coincidir con el nombre del componente(etiqueta html)&lt;br /&gt;
    template: `&amp;lt;p&amp;gt;&lt;br /&gt;
                 Hola mundo&lt;br /&gt;
              &amp;lt;/p&amp;gt;`&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
//nueva instacia de Vue : new Vue&lt;br /&gt;
  var app=new Vue({&lt;br /&gt;
    el: '#aplicacion',  // el elemento donde se aplicará Vue, en este caso un div con id = main&lt;br /&gt;
    data:{ //capa de datos&lt;br /&gt;
&lt;br /&gt;
    },&lt;br /&gt;
    methods:&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PROPS'''&lt;br /&gt;
&lt;br /&gt;
Props sirve para interpolar o pasar los valores que hayan dentro del atributo la etiqueta html (inglés, castellano) al objeto component&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;hola-mundo idioma=&amp;quot;ingles&amp;quot;&amp;gt;&amp;lt;/hola-mundo&amp;gt;&lt;br /&gt;
    &amp;lt;hola-mundo idioma=&amp;quot;castellano&amp;quot;&amp;gt;&amp;lt;/hola-mundo&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  Vue.component('hola-mundo', {&lt;br /&gt;
    props: ['idioma'],&lt;br /&gt;
    template: `&amp;lt;div&amp;gt;&lt;br /&gt;
                  &amp;lt;p v-if=&amp;quot;idioma=='castellano'&amp;quot;&amp;gt;Hola mundo&amp;lt;/p&amp;gt;&lt;br /&gt;
                  &amp;lt;p v-if=&amp;quot;idioma=='ingles'&amp;quot;&amp;gt;Hello world&amp;lt;/p&amp;gt;&lt;br /&gt;
              &amp;lt;/div&amp;gt;`&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  var app=new Vue({&lt;br /&gt;
    el: '#aplicacion'&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otro Componente Básico&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;app&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ejemplo nombre=&amp;quot;Juan&amp;quot; apellido=&amp;quot;Perez&amp;quot;&amp;gt;&amp;lt;/ejemplo&amp;gt; &lt;br /&gt;
 &amp;lt;ejemplo nombre=&amp;quot;Alejandra&amp;quot; apellido=&amp;quot;Quiroga&amp;quot;&amp;gt;&amp;lt;/ejemplo&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vue.component('ejemplo', {&lt;br /&gt;
 props: ['nombre', 'apellido'],&lt;br /&gt;
 template: '&amp;lt;p&amp;gt; Hola {{nombre}} {{apellido}} &amp;lt;/p&amp;gt;' &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo de Componente, podemos ver que pasamos una peliculas &amp;quot;peliculon 1917&amp;quot; y una imagen en la etiqueta peliculas, que serán los valores que recibirá el componente para luego incluirlo en la plantilla.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;peliculas titulo=&amp;quot;peliculon 1917&amp;quot;&lt;br /&gt;
      imagen=&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcSexz8IyOhoxR2ibVc78RHzpBCsvhDt3fx0wl99Qcxacht4gk9z&amp;quot;&amp;gt;&amp;lt;/peliculas&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  Vue.config.devtools = true;&lt;br /&gt;
&lt;br /&gt;
  Vue.component('peliculas', {&lt;br /&gt;
&lt;br /&gt;
    props: ['imagen', 'titulo'],  //los props reciben los datos externos del html en este caso será &amp;quot;peliculon 1917&amp;quot; y la ruta de la imagen&lt;br /&gt;
    template: &lt;br /&gt;
      `&amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;img width=&amp;quot;100px&amp;quot; v-bind:src=&amp;quot;imagen&amp;quot; :alt=&amp;quot;titulo&amp;quot;/&amp;gt;  &amp;lt;!-- v-bind:alt se reduce en :alt , al ser un atributo no se puede usar {{}} sino v-bind--&amp;gt;&lt;br /&gt;
      &amp;lt;h2&amp;gt; {{titulo}} &amp;lt;/h2&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;`&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  new Vue({&lt;br /&gt;
    el: '.container'&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este ejemplo, viene a basarse en el ejemplo anterior pero además coje datos del JSON data y los va mostrando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div v-for=&amp;quot;(index, dato) in datos&amp;quot;&amp;gt;   &amp;lt;!--añadimos indice--&amp;gt;&lt;br /&gt;
      &amp;lt;peliculas :key=&amp;quot;index&amp;quot; :titulo=&amp;quot;dato.titulo&amp;quot; :imagen=&amp;quot;dato.imagen&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;/peliculas&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  Vue.config.devtools = true;&lt;br /&gt;
&lt;br /&gt;
  Vue.component('peliculas', {&lt;br /&gt;
    props: ['key','titulo', 'imagen'],&lt;br /&gt;
    template: `&amp;lt;div&amp;gt;&lt;br /&gt;
      &amp;lt;img width=&amp;quot;100px&amp;quot; v-bind:src=&amp;quot;imagen&amp;quot; v-bind:alt=&amp;quot;titulo&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;h2&amp;gt; {{titulo}}: {{key}} &amp;lt;/h2&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;`&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  new Vue({&lt;br /&gt;
    el: '.container',&lt;br /&gt;
    data: {&lt;br /&gt;
      datos: [{&lt;br /&gt;
          titulo: &amp;quot;star wars&amp;quot;,&lt;br /&gt;
          imagen: &amp;quot;https://vignette.wikia.nocookie.net/cine/images/8/88/Sw1.jpg/revision/latest?cb=20120930202439 &amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          titulo: &amp;quot;Sonic&amp;quot;,&lt;br /&gt;
          imagen: &amp;quot;https://www.smashbros.com/wiiu-3ds/images/character/sonic/main.png&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          titulo: &amp;quot;Mario bros&amp;quot;,&lt;br /&gt;
          imagen: &amp;quot;https://cdn02.nintendo-europe.com/media/images/05_packshots/games_13/nes_1/PS_NES_SuperMarioBros.jpg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ejercicios ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
'''v-if, v-else, v-else-if, v-show'''&lt;br /&gt;
&lt;br /&gt;
Tenemos dos inputs de tipo passwords y muestre un mensaje en caso que sean iguales&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese la clave:&lt;br /&gt;
      &amp;lt;input type=&amp;quot;password&amp;quot; v-model=&amp;quot;clave1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Repita la clave:&lt;br /&gt;
      &amp;lt;input type=&amp;quot;password&amp;quot; v-model=&amp;quot;clave2&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;  &lt;br /&gt;
    &amp;lt;p v-if=&amp;quot;clave1===clave2&amp;quot;&amp;gt;Las claves son iguales.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p v-else&amp;gt;Las claves son distintas.&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;   &lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        clave1 : '',&lt;br /&gt;
        clave2 : ''&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''v-for'''&lt;br /&gt;
&lt;br /&gt;
Tenemos un array en data con los días de la semana, se trata de generar una tabla de 1 columna y 7 filas en HTML&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;template v-for=&amp;quot;dia in dias&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;{{dia}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;/template&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;   &lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        dias: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo']&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''v-for con array de objetos literales'''&lt;br /&gt;
&lt;br /&gt;
Definir un array con objetos que almacenan los nombres y edades de 6 personas. Mostrar en una lista ordenada el nombre de cada persona y entre paréntesis si es mayor o no de edad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
personas: [{&lt;br /&gt;
                    nombre: 'Julio', &lt;br /&gt;
                    edad: 32&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'Albert', &lt;br /&gt;
                    edad: 50&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'Alex', &lt;br /&gt;
                    edad: 35&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'Ramón', &lt;br /&gt;
                    edad: 50&lt;br /&gt;
                   }]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;template v-for=&amp;quot;persona in personas&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt;&lt;br /&gt;
          {{persona.nombre}}&lt;br /&gt;
          &amp;lt;span v-if=&amp;quot;persona.edad&amp;gt;=18&amp;quot;&amp;gt;(Mayor)&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;span v-else&amp;gt;(Menor)&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/template&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;   &lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        personas: [{&lt;br /&gt;
                    nombre: 'Jose', &lt;br /&gt;
                    edad: 12&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'Ana', &lt;br /&gt;
                    edad: 43&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'Pedro', &lt;br /&gt;
                    edad: 4&lt;br /&gt;
                   },{&lt;br /&gt;
                    nombre: 'María', &lt;br /&gt;
                    edad: 12&lt;br /&gt;
                   }]&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Ejercicios===&lt;br /&gt;
&lt;br /&gt;
Se desea mostrar una lista de profesores, donde se pueda insertar un nuevo profesor e incrementar la edad de cada uno de ellos. Cada profesor nuevo empezará con 0 años.&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt; &lt;br /&gt;
        &amp;lt;div v-for=&amp;quot;profesor in profesores&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;div v-text=&amp;quot;profesor.nombre&amp;quot; &amp;gt;&amp;lt;/div&amp;gt; &amp;lt;div v-text=&amp;quot;profesor.edad&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;span @click=&amp;quot;incrementar(profesor)&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt;&lt;br /&gt;
         &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;profesor&amp;quot; @click=&amp;quot;anadir&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        {{$data}}&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    Vue.config.devtools = true&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
&lt;br /&gt;
            profesor: &amp;quot; &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
            profesores: [{&lt;br /&gt;
                    nombre: &amp;quot;Julio Noguera&amp;quot;,&lt;br /&gt;
                    edad: &amp;quot;0&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Albert Canela&amp;quot;,&lt;br /&gt;
                    edad: &amp;quot;1&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    nombre: &amp;quot;Alex Salinas&amp;quot;,&lt;br /&gt;
                    edad: &amp;quot;2&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        methods: {&lt;br /&gt;
            anadir: function(){&lt;br /&gt;
                this.profesores.push({nombre: this.profesor, edad: 0});&lt;br /&gt;
                console.log(this.profesor);&lt;br /&gt;
            },&lt;br /&gt;
            incrementar: function(profe){&lt;br /&gt;
                console.log(profe.edad++);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Eventos :click'''&lt;br /&gt;
&lt;br /&gt;
Crear dos inputs de tipo input(number) y un botón. Cuando se presione dicho botón mostrar la suma de los valores ingresados (usar método)&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese primer valor:&lt;br /&gt;
      &amp;lt;input type=&amp;quot;number&amp;quot; v-model=&amp;quot;valor1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese segundo valor:&lt;br /&gt;
      &amp;lt;input type=&amp;quot;number&amp;quot; v-model=&amp;quot;valor2&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese primer valor:&lt;br /&gt;
      &amp;lt;button v-on:click=&amp;quot;sumarValores&amp;quot;&amp;gt;Sumar&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;El resultado de la suma es igual a {{suma}}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;   &lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        valor1: 0,&lt;br /&gt;
        valor2: 0,&lt;br /&gt;
        suma: ''&lt;br /&gt;
      },&lt;br /&gt;
      methods: {&lt;br /&gt;
        sumarValores: function() {&lt;br /&gt;
          this.suma = parseInt(this.valor1) + parseInt(this.valor2);&lt;br /&gt;
        }&lt;br /&gt;
      }      &lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ejercicio===&lt;br /&gt;
&lt;br /&gt;
Se desea mostrar una lista de tareas, se pide que se pueda eliminar el item seleccionado.&lt;br /&gt;
&lt;br /&gt;
'''Solución''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;el&amp;quot;&amp;gt; &lt;br /&gt;
        &amp;lt;div v-for=&amp;quot;tarea in tareas&amp;quot; &amp;gt;     // &amp;lt;div v-for=&amp;quot;(item, index) in tareas&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;div v-text=&amp;quot;tarea&amp;quot; &amp;gt;&amp;lt;/div&amp;gt; &amp;lt;span @click=&amp;quot;eliminar(tarea)&amp;quot;&amp;gt;X&amp;lt;/span&amp;gt;&lt;br /&gt;
         &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;input type=&amp;quot;text&amp;quot; v-model=&amp;quot;tarea&amp;quot;&amp;gt;&amp;lt;span @click=&amp;quot;anadir&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        {{$data}}&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    Vue.config.devtools = true&lt;br /&gt;
    var variable = new Vue({&lt;br /&gt;
        el: '#el',&lt;br /&gt;
        data: {&lt;br /&gt;
&lt;br /&gt;
            tarea: &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
            tareas: []&lt;br /&gt;
        },&lt;br /&gt;
        methods: {&lt;br /&gt;
            anadir: function(){&lt;br /&gt;
                this.tareas.push(this.tarea);&lt;br /&gt;
                console.log(this.tareas);&lt;br /&gt;
            },&lt;br /&gt;
            eliminar: function(tarea){&lt;br /&gt;
                let x=this.tareas.indexOf(tarea);&lt;br /&gt;
                this.tareas.splice(x, 1);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Eventos: v-on:keypress, v-on:keyup'''&lt;br /&gt;
&lt;br /&gt;
Mediante un control de tipo input permitir el ingreso de una frase. Mostrar por pantalla cada vez que presionamos una tecla la cantidad de letras 'a' que tiene la &lt;br /&gt;
oración.&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese una frase:&lt;br /&gt;
      &amp;lt;input v-model=&amp;quot;frase&amp;quot; v-on:keyup=&amp;quot;contabilizarLetrasA&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;80&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Cantidad de letras 'a o 'A'':{{cantidadLetrasa}}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        cantidadLetrasa: 0,&lt;br /&gt;
        frase: ''&lt;br /&gt;
      },&lt;br /&gt;
      methods: {&lt;br /&gt;
        contabilizarLetrasA: function () {&lt;br /&gt;
          var cant=0;&lt;br /&gt;
          for(var f=0; f&amp;lt;this.frase.length; f++)&lt;br /&gt;
            if (this.frase[f]=='a' || this.frase[f]=='A')&lt;br /&gt;
              cant++;&lt;br /&gt;
          this.cantidadLetrasa=cant;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Eventos: v-on:keypress, v-on:keyup'''&lt;br /&gt;
&lt;br /&gt;
Tenemos un input de tipo text que introducimos un texto, a medida que vayamos escribiendo texto deberá ir mostrando la cantidad de 'a' y 'A' que hay&lt;br /&gt;
&lt;br /&gt;
'''solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Ingrese una frase:&lt;br /&gt;
      &amp;lt;input v-model=&amp;quot;frase&amp;quot; v-on:keyup=&amp;quot;contabilizarLetrasA&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;80&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Cantidad de letras 'a o 'A'':{{cantidadLetrasa}}&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        cantidadLetrasa: 0,&lt;br /&gt;
        frase: ''&lt;br /&gt;
      },&lt;br /&gt;
      methods: {&lt;br /&gt;
        contabilizarLetrasA: function () {&lt;br /&gt;
          var cant=0;&lt;br /&gt;
          for(var f=0; f&amp;lt;this.frase.length; f++)&lt;br /&gt;
            if (this.frase[f]=='a' || this.frase[f]=='A')&lt;br /&gt;
              cant++;&lt;br /&gt;
          this.cantidadLetrasa=cant;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''bind (enlace) a clases CSS'''&lt;br /&gt;
&lt;br /&gt;
Se tiene la siguiente declaración de lenguajes de programación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
data:{ &lt;br /&gt;
        lenguajes: [&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'C',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Java',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'PHP',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Python',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Ruby',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Kotlin',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'C#',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          }]        &lt;br /&gt;
      },&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Cuando se hace clic sobre una de las opciones tachar dicho lenguaje agregando una clase en forma dinámica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
   .tachar {&lt;br /&gt;
      text-decoration: line-through;&lt;br /&gt;
      color: blue;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''solución:''' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;ul style=&amp;quot;font-size:2rem; list-style:none&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li v-for=&amp;quot;lenguaje in lenguajes&amp;quot;&lt;br /&gt;
          v-on:click=&amp;quot;presion(lenguaje)&amp;quot;&lt;br /&gt;
          v-bind:class=&amp;quot;{tachar: lenguaje.tachado }&amp;quot;&amp;gt;&lt;br /&gt;
        {{lenguaje.nombre}}&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
var app=new Vue({&lt;br /&gt;
      el: '#aplicacion',&lt;br /&gt;
      data:{ &lt;br /&gt;
        lenguajes: [&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'C',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Java',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'PHP',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Python',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Ruby',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'Kotlin',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            nombre: 'C#',&lt;br /&gt;
            tachado:false&lt;br /&gt;
          }]        &lt;br /&gt;
      },&lt;br /&gt;
      methods: {&lt;br /&gt;
        presion: function(lenguaje) {&lt;br /&gt;
          lenguaje.tachado=true;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    })&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Componentes en Vue'''&lt;br /&gt;
&lt;br /&gt;
Crear una componente llamada 'acerca-de' que muestre el nombre del programa y la versión del mismo.&lt;br /&gt;
&lt;br /&gt;
'''Solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;acerca-de&amp;gt;&amp;lt;/acerca-de&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  Vue.component('acerca-de', {&lt;br /&gt;
    template: `&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Programa: xxxxxxxx&amp;lt;/p&amp;gt;&lt;br /&gt;
                    &amp;lt;p&amp;gt;Versión: xx&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt; `&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  new Vue({&lt;br /&gt;
    el: '#aplicacion'&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Componentes: propiedades'''&lt;br /&gt;
&lt;br /&gt;
Modificar el ejemplo de la componente 'hola-mundo' de tal forma que se pueda seleccionar el idioma que se debe mostrar utilizando un control de formulario 'select'&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;select v-model=&amp;quot;idioma&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;castellano&amp;lt;/option&amp;gt;&lt;br /&gt;
      &amp;lt;option&amp;gt;ingles&amp;lt;/option&amp;gt;&lt;br /&gt;
    &amp;lt;/select&amp;gt;&amp;lt;/p&amp;gt;    &lt;br /&gt;
    &amp;lt;hola-mundo v-bind:idioma=&amp;quot;idioma&amp;quot;&amp;gt;&amp;lt;/hola-mundo&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  Vue.component('hola-mundo', {&lt;br /&gt;
    props: ['idioma'],&lt;br /&gt;
    template: `&amp;lt;div&amp;gt;&lt;br /&gt;
                  &amp;lt;p v-if=&amp;quot;idioma=='castellano'&amp;quot;&amp;gt;Hola mundo&amp;lt;/p&amp;gt;&lt;br /&gt;
                  &amp;lt;p v-if=&amp;quot;idioma=='ingles'&amp;quot;&amp;gt;Hello world&amp;lt;/p&amp;gt;&lt;br /&gt;
              &amp;lt;/div&amp;gt;`&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  var app=new Vue({&lt;br /&gt;
    el: '#aplicacion',&lt;br /&gt;
    data: {&lt;br /&gt;
      idioma: 'castellano'&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Componentes: propiedades de tipo objeto y vector'''&lt;br /&gt;
&lt;br /&gt;
Crear una componente llamada 'articulos' que tenga una propiedad que reciba un vector de objetos literales. El objetivo de la componente es mostrar los datos del vector de articulos en una tabla HTML&lt;br /&gt;
&lt;br /&gt;
'''Solución'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;articulos v-bind:datos=&amp;quot;datos&amp;quot;&amp;gt;&amp;lt;/articulos&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  Vue.component('articulos', {&lt;br /&gt;
    props:['datos'],&lt;br /&gt;
    template: `&amp;lt;div&amp;gt;&lt;br /&gt;
                 &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Código&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Descripción&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Precio&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                 &amp;lt;tr v-for=&amp;quot;art in datos&amp;quot;&amp;gt;&amp;lt;td&amp;gt;{{art.codigo}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{art.descripcion}}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{{art.precio}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                 &amp;lt;/table&amp;gt;&lt;br /&gt;
               &amp;lt;/div&amp;gt;`&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  var app=new Vue({&lt;br /&gt;
    el: '#aplicacion',&lt;br /&gt;
    data: {&lt;br /&gt;
      datos: [{&lt;br /&gt;
              codigo: 1, &lt;br /&gt;
              descripcion: 'papas',&lt;br /&gt;
              precio: 12.52&lt;br /&gt;
              },{&lt;br /&gt;
              codigo: 2, &lt;br /&gt;
              descripcion: 'naranjas',&lt;br /&gt;
              precio: 21&lt;br /&gt;
              },{&lt;br /&gt;
              codigo: 3, &lt;br /&gt;
              descripcion: 'peras',&lt;br /&gt;
              precio: 18.20&lt;br /&gt;
              }]      &lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Componentes: definición de métodos y modelo de datos'''&lt;br /&gt;
&lt;br /&gt;
Crear una componente que contenga un botón que en su interior tenga el valor 0. Cada vez que se lo presione se debe incrementar en 1.&lt;br /&gt;
&lt;br /&gt;
'''Solución:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;aplicacion&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;contador&amp;gt;&amp;lt;/contador&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdn.jsdelivr.net/npm/vue&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  Vue.component('contador', {&lt;br /&gt;
    template:`&amp;lt;div&amp;gt;&amp;lt;button v-on:click=&amp;quot;incrementar()&amp;quot;&amp;gt;&lt;br /&gt;
              {{cantidad}}&lt;br /&gt;
              &amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;`,&lt;br /&gt;
    data: function() {&lt;br /&gt;
      return {&lt;br /&gt;
        cantidad: 0&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    methods: {&lt;br /&gt;
      incrementar: function() {&lt;br /&gt;
        this.cantidad++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  var app=new Vue({&lt;br /&gt;
    el: '#aplicacion'&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Componentes: definición de métodos y modelo de datos'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;app&amp;quot; class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt; Helados &amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;h2&amp;gt; Lista &amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li v-for=&amp;quot;item in helados&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;component-helado v-bind:helado=&amp;quot;item&amp;quot;&amp;gt;&amp;lt;/component-helado&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;h2&amp;gt; Seleccionados &amp;lt;/h2&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
      &amp;lt;li v-for=&amp;quot;item in helados&amp;quot; v-if=&amp;quot;item.seleccionado&amp;quot;&amp;gt; {{ item.sabor }} &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.18/vue.js&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  Vue.config.devtools = true; &lt;br /&gt;
    Vue.component('component-helado', {&lt;br /&gt;
      props: ['helado'],&lt;br /&gt;
      template: `&lt;br /&gt;
    &amp;lt;div&amp;gt; &lt;br /&gt;
       &amp;lt;button class=&amp;quot;btn btn-success&amp;quot; v-on:click=&amp;quot;agregar(helado)&amp;quot; v-if=&amp;quot;!helado.seleccionado&amp;quot;&amp;gt; + &amp;lt;/button&amp;gt; &lt;br /&gt;
       &amp;lt;button class=&amp;quot;btn btn-danger&amp;quot; v-on:click=&amp;quot;eliminar(helado)&amp;quot; v-if=&amp;quot;helado.seleccionado&amp;quot;&amp;gt; - &amp;lt;/button&amp;gt; &lt;br /&gt;
       &amp;lt;span&amp;gt; {{ helado.sabor }} &amp;lt;/span&amp;gt; &lt;br /&gt;
       &amp;lt;hr/&amp;gt;  &amp;lt;/div&amp;gt;  `,&lt;br /&gt;
      methods: {&lt;br /&gt;
        agregar: function (p_helado) {&lt;br /&gt;
          p_helado.seleccionado = true;&lt;br /&gt;
        },&lt;br /&gt;
        eliminar: function (p_helado) {&lt;br /&gt;
          p_helado.seleccionado = false;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    new Vue({&lt;br /&gt;
      el: '#app',&lt;br /&gt;
      data: {&lt;br /&gt;
        helados: [{&lt;br /&gt;
            sabor: 'Chocolate',&lt;br /&gt;
            seleccionado: false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            sabor: 'Dulce de leche',&lt;br /&gt;
            seleccionado: false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            sabor: 'Frutilla',&lt;br /&gt;
            seleccionado: false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            sabor: 'Limón',&lt;br /&gt;
            seleccionado: false&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            sabor: 'Vainilla',&lt;br /&gt;
            seleccionado: false&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialesprogramacionya.com/vueya/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=jfEEQVdbl54&amp;amp;list=PLPl81lqbj-4J-gfAERGDCdOQtVgRhSvIT&amp;amp;index=7&amp;amp;t=0s&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=JQUERY&amp;diff=15374</id>
		<title>JQUERY</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=JQUERY&amp;diff=15374"/>
				<updated>2021-03-22T17:07:50Z</updated>
		
		<summary type="html">&lt;p&gt;Jnoguera: /* Exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= JQuery =&lt;br /&gt;
&lt;br /&gt;
== Introducció ==&lt;br /&gt;
&lt;br /&gt;
jQuery és un framework de JavaScript que permet simplificar el maneig dels documents HTML, l'arbre DOM, manejar esdeveniments, desenvolupar animacions i afegir interacció amb Ajax a pàgines web.&lt;br /&gt;
&lt;br /&gt;
JQuery és programari lliure i de codi obert creat per John Resig que a més treballa per a Mozilla Corporation.&lt;br /&gt;
&lt;br /&gt;
La primera versió de jQuery estable aparèixer l'any 2006 i l'última, de febrer de 2011, és la versió 1.5.1. Aquesta última versió es caracteritza per la utilització d'Ajax.&lt;br /&gt;
&lt;br /&gt;
L'ús de jQuery llibretera al programador d'haver de implementar els mètodes JavaScript que el framework conté. Entre altres facilitats, jQuery té implementats tots els seus mètodes per detectar el navegador de l'usuari i adaptar les&lt;br /&gt;
funcions a cada un d'ells.&lt;br /&gt;
&lt;br /&gt;
La llibreria jQuery en resum ens aporta els següents avantatges:&lt;br /&gt;
&lt;br /&gt;
* Estalvia moltes línies de codi.&lt;br /&gt;
* Fa transparent el suport de la nostra aplicació per als navegadors principals.&lt;br /&gt;
* Proveeix d'un mecanisme per a la captura d'esdeveniments.&lt;br /&gt;
* Proveeix un conjunt de funcions per animar el contingut de la pàgina en forma molt senzilla.&lt;br /&gt;
* Integra funcionalitats per treballar amb AJAX.&lt;br /&gt;
&lt;br /&gt;
== PRINCIPIS D'ÚS ==&lt;br /&gt;
La forma d'interactuar amb la pàgina és mitjançant la funció $ (), un àlies de jQuery que rep com a paràmetre una expressió CSS o el nom d'una etiqueta HTML i retorna tots els elements que concorden amb l'expressió.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Devuelve el elemento con id=&amp;quot;cabecera&amp;quot; &lt;br /&gt;
$(&amp;quot;#cabecera&amp;quot;)  &lt;br /&gt;
// Devolverá una matriz de elementos con class=&amp;quot;destacado&amp;quot; &lt;br /&gt;
$(&amp;quot;.destacado&amp;quot;)        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un cop obtinguts els elements, se'ls pot aplicar qualsevol de les funcions que facilita la biblioteca.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Se elimina el estilo (removeClass()) y se aplica uno nuevo (addClass()) a todos los nodos con class=&amp;quot; destacado &amp;quot; &lt;br /&gt;
$(&amp;quot;.destacado&amp;quot;).removeClass(&amp;quot;destacado&amp;quot;).addClass(&amp;quot;nodestacado&amp;quot;);      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CARREGAR LA WEB ==&lt;br /&gt;
Una de les funcions més utilitzades en les aplicacions JavaScript és la següent &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
window.onload = function () {,,,}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forma abreviada amb crida funció&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(inicializar);&lt;br /&gt;
&lt;br /&gt;
	function inicializar(){&lt;br /&gt;
		$(&amp;quot;#boton&amp;quot;).click(function(){&lt;br /&gt;
			alert(&amp;quot;Boton pulsado&amp;quot;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forma abreviada amb funció anònima&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
   ...&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forma més abreviada&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {...}); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passar una funció anomenada en lloc de funció anònima&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function nomFunció() {&lt;br /&gt;
        ...&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
$(document).ready(nomFunció);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El gran avantatge de la funció de jQuery, és que la pàgina es pot manipular quant s'ha carregat el seu codi HTML (i per tant, s'ha construït l'arbre DOM de la pàgina) mentre que la funció de JavaScript espera que es carreguin tots els&lt;br /&gt;
elements de la pàgina, incloent totes les imatges. D'aquesta manera, les aplicacions realitzades amb jQuery poden respondre de forma molt més ràpida que les aplicacions JavaScript tradicionals.&lt;br /&gt;
&lt;br /&gt;
== ACCÉS ALS ELEMENTS DEL WEB ==&lt;br /&gt;
D'altra banda, la funció getElementById () és possiblement la més utilitzada a desenvolupar aplicacions web, ja que permet seleccionar un element a partir de la seva atribut &amp;quot;id&amp;quot;. A més, hi ha dues funcions relacionades:&lt;br /&gt;
&lt;br /&gt;
getElementsByTagName () i getElementsByName (). jQuery inclou la funció $ ()&lt;br /&gt;
com una alternativa més ràpida i completa per seleccionar qualsevol element de la pàgina:&lt;br /&gt;
&lt;br /&gt;
'''Con JavaScript''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Seleccionar un elemento &lt;br /&gt;
document.getElementById(&amp;quot;miParrafo&amp;quot;); &lt;br /&gt;
// Seleccionar todos los enlaces &lt;br /&gt;
document.getElementsByTagName(&amp;quot;a&amp;quot;); &lt;br /&gt;
// Seleccionar todo lo anterior &lt;br /&gt;
---- &lt;br /&gt;
// Seleccionar mediante la clase CSS &lt;br /&gt;
---- &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Con jQuery''' &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Seleccionar un elemento &lt;br /&gt;
$(&amp;quot;#miParrafo&amp;quot;); &lt;br /&gt;
 // Seleccionar todos los enlaces &lt;br /&gt;
$(&amp;quot;a&amp;quot;); &lt;br /&gt;
// Seleccionar todo lo anterior &lt;br /&gt;
$(&amp;quot;#miParrafo, a&amp;quot;) &lt;br /&gt;
// Seleccionar mediante la clase CSS &lt;br /&gt;
$(&amp;quot;.miClase&amp;quot;) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SELECTORS ==&lt;br /&gt;
jQuery s'utilitza selectors per identificar aquells elements sobre els quals es vol actuar. Un selector és una cadena de caràcters que identifica un o diversos elements d'una pàgina web.&lt;br /&gt;
Els selectors bàsics utilitzats en jQuery són:&lt;br /&gt;
&lt;br /&gt;
'''Selector d'etiquetes.'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;h2&amp;quot;)  &lt;br /&gt;
//selecciona tots els elements que tenen etiqueta &amp;lt;h2&amp;gt; ... .. &amp;lt;/ h2&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Selector por etiqueta/contingut. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;p:contains('Hola')&amp;quot;) &lt;br /&gt;
//selecciona els paràgrafs (&amp;lt;p&amp;gt; ... &amp;lt;/ p&amp;gt;) que continguin la paraula &amp;quot;Hola&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;!--* Selector per etiqueta / propietat. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;div:visible&amp;quot;) &lt;br /&gt;
//selecciona els div que tinguin la propietat visible = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* Selector per etiquetes/classe. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;li.nombreClase&amp;quot;) &lt;br /&gt;
//selecciona els li que tinguin assignada la classe CSS nombreClase&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Selector per identificador'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (&amp;quot;#MeusComentaris&amp;quot;)&lt;br /&gt;
// selecciona tots els elements que tenen l'atribut id = misComentarios&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Selector per classe CSS'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (&amp;quot;.miClase&amp;quot;)&lt;br /&gt;
// selecciona tots els elements que tenen com a atribut class = &amp;quot;miClase&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Selectors de diversos elements'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (&amp;quot;p, a&amp;quot;)&lt;br /&gt;
// Selecciona tots els &amp;lt;a&amp;gt; i tots els &amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:selectors.png]]&lt;br /&gt;
&lt;br /&gt;
'''Selectors posicionals'''&lt;br /&gt;
&lt;br /&gt;
  Els selectors posicionals están basats en les relacions posicionals entre elements segons l'estructura DOM del document.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Selector&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;p:first&amp;quot;) || Selecciona el primer element &amp;lt; p&amp;gt; de la pàgina&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;p:last&amp;quot;) || Selecciona l'últim element &amp;lt; p&amp;gt; de la pàgina&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;img[src$=.Png]:first) || Selecciona el primer &amp;lt;img&amp;gt; de la pàgina que té un atribut src acabat en .png &lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;p[@miClase]&amp;quot;)  || Selecciona tots els paràgrafs que implementin la classe CSS miClase&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;div[p]&amp;quot;) || Selecciona tots els divs que continguin algun paràgraf dins&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;p[a]&amp;quot;) || Selecciona tots els paràgrafs que tinguin almenys un enllaç&lt;br /&gt;
|-&lt;br /&gt;
| $ (&amp;quot;input[@type = ràdio] [@checked]&amp;quot;)  || Selecciona tots els ràdio buttons que han estat revisats&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fitxer:selectors_posicionals.png]]&lt;br /&gt;
&lt;br /&gt;
'''Selectors parent&amp;gt; child'''&lt;br /&gt;
&lt;br /&gt;
Els selectors parent&amp;gt; child permet que es pugui puguin accedir als elements que siguin fills directes d'altres.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// selecciona totes les etiquetes b que són filles directes dels paràgrafs&lt;br /&gt;
$ (&amp;quot;p&amp;gt;b&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// selecciona totes les etiquetes que són filles directes de l'element amb id = &amp;quot;capa&amp;quot;&lt;br /&gt;
$ (&amp;quot;#capa&amp;gt;*&amp;quot;) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Selectors de formulari'''&lt;br /&gt;
&lt;br /&gt;
Els selectors de formulari permeten seleccionar elements de formulari de forma específica.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Selector&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:text&amp;quot;)|| selecciona tots els input que tinguin tipus text&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:checkbox&amp;quot;) || selecciona tots els input que tinguin tipus checkbox &lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:input&amp;quot;)  || Selecciona tots els elements input&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:button&amp;quot;) || Selecciona tots els elements button&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:enabled&amp;quot;) || Selecciona tots els elements activats del formulari&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:checked&amp;quot;)  || Selecciona tots els ràdio buttons i checkbox del formulari que estan premuts&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:ràdio :checked&amp;quot;) || Selecciona tots els radio button que estiguin revisats&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Fitxer:selectors_formulari.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Selectors de jerarquia'''&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Selector&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;p a&amp;quot;)|| Selector de descendents: selecciona elements 'p' que baixin d'un altre element 'a' (CSS 1)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;div.entrada h2&amp;quot;)|| Selector de descendents: selecciona elements que baixin d'un altre element (CSS 1)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;div.entrada&amp;gt; h2&amp;quot;) || Selector de fills: selecciona elements que siguin fills directes d'un altre element (CSS 2) &lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;tr:nth-child(1)&amp;quot;)  || Pseudo classe fill: selecciona l'enèsim fill d'un element (CSS 3)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;tr:first-child&amp;quot;) || Pseudo classe primer fill: selecciona el primer fill d'un element (CSS 2)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;tr:last-child&amp;quot;) || Pseudo classe últim fill: selecciona l'últim fill d'un element (CSS 3)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;div:only-child&amp;quot;)  || Pseudo classe fill únic: selecciona els elements que siguin un únic fill de altres elements (CSS 3)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:first)&amp;quot;) || Pseudo classe primer: selecciona el primer element d'un grup de elements. Equival a eq (0) (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:last)&amp;quot;)  || Pseudo classe últim: selecciona l'últim element d'un grup de elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;body &amp;gt; div:has(a)&amp;quot;)  || Selecciona el/s fill/s directe/s &amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt; de &amp;lt;body&amp;gt;&amp;lt;/nowiki&amp;gt; que contenen enllaços&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:gt (0)&amp;quot;) || Pseudo classe més gran que: selecciona tots els elements amb un índex major que l'indicat en un grup d'elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:lt (3)&amp;quot;)  || Pseudo classe menor que: selecciona tots els elements amb un índex menor que l'indicat en un grup d'elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:even&amp;quot;) || Pseudo classe parell: selecciona els elements parells d'un grup d'elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;td:odd&amp;quot;)  || Pseudo classe senar: selecciona els elements imparells d'un grup de elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;div.entrada~p&amp;quot;) || Selector de germans: selecciona tots els germans que es troben precedits d'un altre element (CSS 3)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;div.entrada+p&amp;quot;) || Selector de proper adjacent: similar a l'anterior, però només selecciona el adjacent directe (CSS 2)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;h2:parent&amp;quot;) || Pseudo classe pare: selecciona els pares d'altres elements (jQuery)&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;:empty&amp;quot;) || Pseudo classe buit: selecciona els elements que no tinguin cap fill,incloent text pla (CSS 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.w3schools.com/cssref/trysel.asp Més Exemples]&lt;br /&gt;
&lt;br /&gt;
== TAULES DE SELECTORS ==&lt;br /&gt;
Quan una funció jQuery retorna diversos elements, ho fa en format de taula,on cada element està identificat per una posició de la mateixa. llavors mitjançant: eq (índex) podem obtenir l'element de la llista a què es fa referència&lt;br /&gt;
de la posició índex + 1, tenint en compte que les llista en jQuery comencen comptar des de 0.&lt;br /&gt;
Per exemple, en la següent instrucció emmagatzema una referència al tercer enllaç que implementa la classe &amp;quot;enlaceAmigos&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
enllaç = $ ('a.enlaceAmigos:eq(2)')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuació es mostra com accedir al paràgraf número 3 (segona posició)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
miParrafo = $ (&amp;quot;p:eq(2)&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OPERADORS ==&lt;br /&gt;
Es poden utilitzar els operadors ^ =, $ = i * =.&lt;br /&gt;
* ^ = per obtenir els elements d'una pàgina HTML que continguin un atribut que comenci per un valor determinat.&lt;br /&gt;
* $ = per obtenir els elements d'una pàgina HTML que acabi per un valor determinat.&lt;br /&gt;
* * = per obtenir els elements d'una pàgina HTML que contingui un valor determinat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (document) .ready (function () {&lt;br /&gt;
// fa referència als enllaços que comencen per mailto:&lt;br /&gt;
$ ('a[href^=&amp;quot;mailto:&amp;quot;]'). addClass ('mailto');&lt;br /&gt;
// fa referència als enllaços que facin referència a un fitxer pdf&lt;br /&gt;
$ ('a[href$=&amp;quot;.pdf&amp;quot;]'). addClass ('enlacePdf');&lt;br /&gt;
// fa referència a un enllaç a sitio.com&lt;br /&gt;
$ ('a[href*=&amp;quot;sitio.com&amp;quot;]'). addClass ('lloc');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquestes classes CSS han d'estar prèviament definides a la pàgina, per exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
.mailto {color: blue; }&lt;br /&gt;
.enlacePdf {color: green; }&lt;br /&gt;
.sitio {color: yellow; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
D'aquesta manera, els enllaços de tipus mailto apareixeran en blau, els enllaços a fitxers pdf verds i els enllaços a &amp;quot;sitio.com&amp;quot; apareixeran en groc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilitzant Events (Event handler) ===&lt;br /&gt;
Si volem afegir esdeveniments als diferents elements que apareixen a la pàgina web utilitzant Jquery podem fer-ho molt fàcilment:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#boton').click(function() {&lt;br /&gt;
	$('#missatge').show(); //es mostra el missatge&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Però quan s'executa un element moltes vegades volem utilitzar l'element on està l'esdeveniment per tal de fer alguna cosa amb els seus valors. Jquery ens permet utilitzar la paraula reservada '''this'''.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#Boton').click(function() {&lt;br /&gt;
	$(this).hide(); // el botó desapareix&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''$(this)'''proporciona una manera més maca d'accedir al botó en comptes de tornar a seleccionar-ho.&lt;br /&gt;
Amb JQuery podem fer coses molt potents com el botó 'toggle':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#toggleBoto').click(function() {&lt;br /&gt;
	$('#missatge').toggle();&lt;br /&gt;
	if ($('#missatge').is(':visible')) {&lt;br /&gt;
		$(this).val('Amaga');     //val canvia o retorna el valor&lt;br /&gt;
	} else {&lt;br /&gt;
		$(this).val('Mostra');&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*Desenvolupar una pàgina que mostri dos títols de primer nivell, en ser pressionats canviar el color de font, fons i la font del text.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_titols]]&lt;br /&gt;
&lt;br /&gt;
*Confeccionar una taula amb 5 files. Fer que canvi de color la fila que es pressiona amb el ratolí.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_taula]]&lt;br /&gt;
&lt;br /&gt;
*Disposar dues llistes després quan es premi un botó amagar tots els li de la primera llista.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_ocultar_llista]]&lt;br /&gt;
&lt;br /&gt;
*Mostrar una sèrie de llenguatges de programació i aplicar un estil ressaltat per a aquells llenguatges que són orientats a objectes. Quan es premi un botó afegir la propietat background-color a tots els elements d'aquesta classe.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_llenguatges]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TIPUS D'ESDEVENIMENTS ==&lt;br /&gt;
jQuery disposa de tantes funcions com esdeveniments estàndard de JavaScript. El nom de cada funció és el mateix que el de l'esdeveniment, sense l'habitual prefix &amp;quot;On&amp;quot;: focus (), blur (), keyup (), mouseover (), MouseUp (), resize (), submit (), etc.&lt;br /&gt;
&lt;br /&gt;
'''ESDEVENIMENTS RELACIONATS AMB EL RATOLÍ'''&lt;br /&gt;
&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/event_click.asp click]''' Detecta l'esdeveniment clic quan es produeix en un element de la pàgina.&lt;br /&gt;
* '''dblclick ()''' Detecta un esdeveniment quan es produeix un doble clic sobre un element.&lt;br /&gt;
* '''hover()''' Aquesta funció en realitat serveix per manejar dos esdeveniments, quan el ratolí entra i surt de sobre d'un element. Per tant s'ha d'enviar dos funcions en comptes d'una.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_mup_mdown_ref mouseDown()]''' Detecta un esdeveniment quan l'usuari fa clic al moment que pressiona el botó i independentment de si el deixa anar o no. serveix tant per al botó dret com l'esquerre del ratolí.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_mup_mdown_ref MouseUp() ]''' Detecta un esdeveniment quan l'usuari ha fet clic i després deixa anar un botó del ratolí. L'esdeveniment MouseUp es produeix només en el moment dedeixar anar el botó.&lt;br /&gt;
* '''mouseenter ()''' Detecta l'esdeveniment es produeix en situar el ratolí a sobre d'un element de la pàgina.&lt;br /&gt;
* '''mouseleave ()''' Detecta un esdeveniment quan el ratolí surt de sobre d'un element de la pàgina.&lt;br /&gt;
* '''mousemove ()''' Detecta l'esdeveniment que es produeix en moure el ratolí sobre un element de la pàgina.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_mouseover_mouseout mouseout ()]''' Detecta l'esdeveniment que es deslliga quan l'usuari surt amb el ratolí de la superfície d'un element.&lt;br /&gt;
* '''mouseover ()''' Detecta l'esdeveniment que es produeix quan el ratolí està sobre un element, però té com a particularitat que pot produir diverses vegades mentre es mou el ratolí sobre l'element, sense necessitat d'haver sortit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ESDEVENIMENTS RELACIONATS AMB EL TECLAT'''&lt;br /&gt;
&lt;br /&gt;
* '''keydown ()''' Detecta l'esdeveniment que es produeix en el moment que es pressiona una tecla del teclat, independentment de si s'allibera la pressió o es manté. Es produeix una única vegada en el moment exacte de la pressió.&lt;br /&gt;
* '''keypress ()''' Detecta l'esdeveniment que ocorre quan es digitals un caràcter, o es pressiona altre tipus de tecla. És com l'esdeveniment keypress de Javascript, per la qual que s'entén que keypress () s'executa una vegada, com a resposta a una pulsació i immediat alliberament de la tecla, o diverses vegades si es prem una tecla i es manté premuda.&lt;br /&gt;
* '''keyup ()''' Detecta l'esdeveniment que es produeix en el moment d'alliberar una tecla, és a dir, en deixar de pressionar una tecla que teníem premuda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function operaEvento(evento){&lt;br /&gt;
   $(&amp;quot;#loescrito&amp;quot;).html($(&amp;quot;#loescrito&amp;quot;).html() + evento.type + &amp;quot;: &amp;quot; + evento.which + &amp;quot;, &amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
   $(document).keypress(operaEvento);&lt;br /&gt;
   $(document).keydown(operaEvento);&lt;br /&gt;
   $(document).keyup(operaEvento);&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ESDEVENIMENTS COMBINATS TECLAT-RATOLÍ'''&lt;br /&gt;
&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_blur_alert blur () ]''' L'esdeveniment blur es llança sobre un element que acaba de perdre el focus. Normalment aquest esdeveniment és aplicable a inputs de formularis.&lt;br /&gt;
&lt;br /&gt;
* '''Focusin ()''' Esdeveniment que es produeix quan l'element guanya el focus de la aplicació, que pot produir en fer clic sobre un element o alpressionar el tabulador i situar el focus en aquest element.&lt;br /&gt;
* '''focusout ()''' Ocorre quan l'element perd el focus de l'aplicació, que pot ocórrer quan el focus està en aquest element i premem el tabulador,o ens movem a un altre element amb el ratolí.&lt;br /&gt;
* '''focus() ''' Serveix per a definir accions quan es produeix l'esdeveniment focus de Javascript, quan l'element guanya el focus de l'aplicació&lt;br /&gt;
&lt;br /&gt;
== ALTRES ESDEVENIMENTS ==&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_resize resize ()]''' Aquest esdeveniment és llança quan es canvia la mida de la finestra.Aquest esdeveniment només s'envia a l'objecte window.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_scroll scroll ()]''' Aquest esdeveniment s'envia als elements que canvien el seu scroll davant d'una acció de l'usuari. S'aplica als objectes Window System, frames i elements amb la propietat overflow CSS posada en estat &amp;quot;scroll&amp;quot;.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_event_select_ref select ()]''' L'esdeveniment select es llança quan l'usuari selecciona un text del element sobre el qual es gestiona l'esdeveniment. Aquest esdeveniment només s'aplica als textarea i als inputs de tipus text.&lt;br /&gt;
* '''submit ()''' Aquest esdeveniment es llança quan un usuari està tractant d'enviar un formulari. Aquest esdeveniment només és vàlid per a formularis. depenent del navegador és possible enviar el formulari sense necessitat de punxar en un botó, simplement prement la tecla ENTER. Quan això succeeix el esdeveniment no es llança, per la qual cosa hem de parar especial atenció a aquest comportament per gestionar en el seu corresponent esdeveniment &amp;quot;Keypressed&amp;quot;.&lt;br /&gt;
* '''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_toggle toggle ()]''' L'esdeveniment toggle s'utilitza per generar comportaments canvi d'estat generats en punxar sobre un element. Per exemple, pot interessar que en punxar sobre un element es visualitzi i que al tornar a punxar s'oculti. Toggle ens permet fer això associant dos o més funcions al mateix esdeveniment que es van executant de forma seqüencial.&lt;br /&gt;
La primera vegada que es punxa sobre l'element (i totes les vegades senars), es executa la primera funció i la segona vegada que es punxa l'element (i totes les vegades parells) s'executa la segona funció:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (document) .ready (function () {&lt;br /&gt;
   $ (&amp;quot;p&amp;quot;). toggle (function () {&lt;br /&gt;
        alert (&amp;quot;Em acabes d'activar&amp;quot;);&lt;br /&gt;
     }, function () {&lt;br /&gt;
          alert (&amp;quot;Em acabes de desactivar&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* '''unload ()''' L'esdeveniment unload es llança quan un usuari navega fora de la pàgina web o es dirigeix cap a una altra part de la web. S'executa sempre, fins i tot si l'usuari tanca el navegador (No s'utilitza desde la versió 1.8)&lt;br /&gt;
&lt;br /&gt;
== DEFINIR / ELIMINAR ESDEVENIMENTS: ON/ OFF ==&lt;br /&gt;
&lt;br /&gt;
'''ON() '''&lt;br /&gt;
&lt;br /&gt;
El mètode On () permet definir qualsevol tipus d'esdeveniments i els enllaça amb el controlador d'esdeveniment que el programador desitgi.&lt;br /&gt;
&lt;br /&gt;
Va ser introduïda en jQuery 1.7 per portar una mica de &amp;quot;ordre&amp;quot; a les anteriors funcions ('''delegate(), live(), bind()'''). On() té tots els avantatges de delegate () però al seu torn serveix com la funció bind () depenent de com ho fem servir.&lt;br /&gt;
&lt;br /&gt;
La seva sintaxi és la següent:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Exemples''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Un event&lt;br /&gt;
$(&amp;quot;p&amp;quot;).on(&amp;quot;click&amp;quot;, function() { &lt;br /&gt;
    console.log( &amp;quot;click&amp;quot; ); &lt;br /&gt;
}); &lt;br /&gt;
&lt;br /&gt;
//Multiples events&lt;br /&gt;
$(&amp;quot;p&amp;quot;).on({ &lt;br /&gt;
    &amp;quot;click&amp;quot;: function() { console.log( &amp;quot;clicked!&amp;quot; ); }, &lt;br /&gt;
    &amp;quot;mouseover&amp;quot;: function() { console.log( &amp;quot;hovered!&amp;quot; ); } &lt;br /&gt;
}); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Asignació de una funció a diversos events al mateix temps&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 var functionControlador = function (event) {&lt;br /&gt;
 alert(&amp;quot;Heyyy Hola mon!!&amp;quot;);&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function () {&lt;br /&gt;
 $(&amp;quot;p&amp;quot;).on(&amp;quot;click mouseenter mouseleave&amp;quot;, functionControlador);&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Associar més events a elements fills&lt;br /&gt;
&lt;br /&gt;
https://jfraguio.wordpress.com/2014/12/10/recorrer-el-dom-de-forma-eficiente-con-jquery-delegacion-de-eventos/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OFF()'''&lt;br /&gt;
&lt;br /&gt;
Al igual que amb la asocación d'esdeveniments, també arribava amb l'acció contrària.&lt;br /&gt;
&lt;br /&gt;
L'objectiu principal de la nova instrucció és reemplaçar a tots d'una manera consistent.&lt;br /&gt;
&lt;br /&gt;
La sintaxi de off () resulta similar a la d'on ():&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#container a').off('click');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Amb off (), tots els paràmetres són opcionals. Quan s'utilitza en la seva forma més simple, $ (elements) .off (), s'eliminen tots els esdeveniments associats al conjunt seleccionat.&lt;br /&gt;
&lt;br /&gt;
== MÈTODES ==&lt;br /&gt;
'''text ()'''&lt;br /&gt;
&lt;br /&gt;
Per saber el contingut d'un element l'objecte jQuery compta amb un mètode anomenat text (), que es pot utilitzar per&lt;br /&gt;
* Modificar el contingut d'un element&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (&amp;quot;#MiElemento&amp;quot;).text(&amp;quot;paràgraf Nou&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Obtenir el contingut d'un element&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var contingut = $(&amp;quot;#miElemento&amp;quot;).text ()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
''Exemple''&lt;br /&gt;
&lt;br /&gt;
La següent funció jQuery canvia el text del paràgraf que està en primera posició quan es prem dobleclick en qualsevol paràgraf de la web, a més mostra el contingut anterior del paràgraf en una finestra.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (document).ready(function () {&lt;br /&gt;
   $ (&amp;quot;p&amp;quot;).dblclick(function () {&lt;br /&gt;
     var contingut = $(&amp;quot;p:eq(1)&amp;quot;).text ()&lt;br /&gt;
     alert (contingut);&lt;br /&gt;
     $ (&amp;quot;p:eq(1)&amp;quot;).text(&amp;quot;nou text&amp;quot;);&lt;br /&gt;
   })&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''html ()'''&lt;br /&gt;
&lt;br /&gt;
És possible afegir blocs de codi HTML a partir d'un element de la pàgina. Aquesta propietat és bàsicament = innerHTML del DOM.&lt;br /&gt;
* Per afegir un bloc HMTL&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (element).html(bloque_HTML)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Per obtenir el bloc HTML contingut a partir de l'element que fa referència l'objecte jQuery.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (element).html()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Exemple''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
function inicializarEventos(){ &lt;br /&gt;
  $(&amp;quot;#boton1&amp;quot;).click(presionBoton1); &lt;br /&gt;
}&lt;br /&gt;
function presionBoton1(){ &lt;br /&gt;
  var x; &lt;br /&gt;
  x=$(&amp;quot;#divFormulari&amp;quot;); &lt;br /&gt;
  x.html(&amp;quot;&amp;lt;form&amp;gt;Ingrese nombre:&amp;lt;input type='text' id='nombre'&amp;gt; &amp;lt;br&amp;gt;Introduzca clave:&amp;lt;input type='text' id='clave'&amp;gt;  &amp;lt;br&amp;gt; &amp;lt;input type='submit' value='confirmar'&amp;gt;&amp;lt;/form&amp;gt;&amp;quot;); &lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un altre exemple molt comú és canviar el text que hi ha en un element html. Amb Jquery es pot fer de dues maneres que donen resultats idèntics:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Primera Manera:&lt;br /&gt;
$(&amp;quot;selector&amp;quot;).html(&amp;quot;Acabo d'afegir Text a un element&amp;quot;);&lt;br /&gt;
// Segona Manera:&lt;br /&gt;
$(&amp;quot;selector&amp;quot;)[0].innerHTML = &amp;quot;Acabo d'afegir Text a un element&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Que passaria si el 'selector' retornes més d'un element?&lt;br /&gt;
Doncs que si utilitzem la 1a manera, es posaria el text &amp;quot;Acabo d'afegir Text a un element&amp;quot; a tots els elements seleccionat. Molt útil quan volem canviar tot el HTML d'un grup d'elements.&lt;br /&gt;
I amb la segona manera?&lt;br /&gt;
Hauriem de fer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
var elements = $(&amp;quot;selector&amp;quot;);&lt;br /&gt;
for(var i=0;i&amp;lt;elements.length;i++)&lt;br /&gt;
elements[i].innerHTML =&lt;br /&gt;
&amp;quot;Acabo d'afegir Text a un grup de nodes&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquest últim exemple és MOLT POC RECOMANAT. És molt més pràctic i eficient utilitzar la 1a manera a l'hora de programar amb JQuery.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Desenvolupar una pàgina que mostri l'ocupació dels mètode text (), text (valor), html () i html (valor)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_text]]&lt;br /&gt;
&lt;br /&gt;
*Disposar dos botons, en ser pressionat el primer crear un formulari en forma dinàmica que sol·liciti el nom d'usuari i la clau. Si es pressiona el segon botó mostrar tots els elements HTML del formulari prèviament creat.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_html]]&lt;br /&gt;
&lt;br /&gt;
*tenim dos paràgrafs amb text, un input i tres botons, es tracta veure la diferència entre ells. per això quan cliquem sobre el primer botó caldrà canviar el text (text), el segon el html (HTML) i el tercer el valor de l'input (value)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_text_html_value]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenemos tres botones, un parrafo que pone &amp;quot;texto original&amp;quot; y una tabla 3x3 con texto, cuando clicamos el primer botón muestra un mensaje de alerta con el contenido del párrafo, cuando apretamos el segundo botón modifica el contenido del párrafo con otro texto y el tercer botón cambia el contenido de texto de la tabla.&lt;br /&gt;
&lt;br /&gt;
:[[sol_text]]&lt;br /&gt;
&lt;br /&gt;
*Crear una capa cuyo id será &amp;quot;wrapper&amp;quot;.Tendré dos botones que harán las siguientes acciones:&lt;br /&gt;
Pintar una capa roja dentro de wrapper, es decir, insertar el siguiente código &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:red; width:300px; height:300px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Mostrar un alert con el código fuente que hay dentro de wrapper.&lt;br /&gt;
&lt;br /&gt;
:[[sol_html]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''attr()/removeAttr''' &lt;br /&gt;
&lt;br /&gt;
El método attr() permite agregar propiedades a un elemento HTML y recuperar el valor &lt;br /&gt;
de su propiedad. &lt;br /&gt;
*  Recuperar el valor de la propietat &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(elemento).attr(nombre_propiedad) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Dona valor a una propietat &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(elemento).attr(nombre de propiedad,valor) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
*  Eliminar una propietat &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(elemento).removeAttr(nombre de propiedad) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Exemple''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){ &lt;br /&gt;
  $(&amp;quot;p&amp;quot;).click(function(){ &lt;br /&gt;
    $(&amp;quot;#miEnlace&amp;quot;).attr(&amp;quot;title&amp;quot;,&amp;quot;Pepe&amp;quot;); &lt;br /&gt;
  }) &lt;br /&gt;
}); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''addClass / removeClass  / toggleClass'''&lt;br /&gt;
&lt;br /&gt;
Els mètodes addClass i removeClass ens permeten associar i desassociar una classe a un element o conjunt d'elements HTML.&lt;br /&gt;
* Afegir una classe CSS a un element.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).addClass(&amp;quot;nombre_clase&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Eliminar una classe CSS d'un element&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).removeClass(&amp;quot;nombre_clase&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
.azul{              //clase css&lt;br /&gt;
  color: #0000cc;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
//dins del script&lt;br /&gt;
$(&amp;quot;#elBotonA&amp;quot;).click(asociarClase);&lt;br /&gt;
&lt;br /&gt;
function asociarClase()&lt;br /&gt;
{ &lt;br /&gt;
 var x=$(&amp;quot;h1&amp;quot;); &lt;br /&gt;
 x.addClass(&amp;quot;azul&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per activar o desactivar una classe usem '''[http://www.w3schools.com/jquery/html_toggleclass.asp toggleClass]'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;div&amp;quot;).toggleClass(&amp;quot;nombre_clase&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenim una pàgina web amb un text &amp;quot;lorem ipsum ...&amp;quot;, i dins d'ella un input costat d'un botó que s'introduirà una paraula (no utilitzar id), en el moment que cliquem s'esborra el text introduït.&lt;br /&gt;
&lt;br /&gt;
[[solucio_borrar]]&lt;br /&gt;
&lt;br /&gt;
*En la pàgina web https://daneden.github.io/animate.css/ podem utilitzar diferents formes de fer animacions amb el text, utilitza jquery per a fer animacions. crea un div que contingui un text que quan passi el ratolí per damunt faci l'animació. Llegiu la documentació oficial &lt;br /&gt;
&lt;br /&gt;
:[[solucio_animate]]&lt;br /&gt;
&lt;br /&gt;
*Definir una taula sense l'atribut border. En pressionar un botó afegir-li la propietat border amb el valor 1. Si es pressiona un altre botó recuperar i mostrar el valor de l'atribut border i finalment si es pressiona un altre botó eliminar la propietat border.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_attr]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*En prémer el botó, canviar la imatge per una aleatòria. Usar &amp;quot;attr&amp;quot; per a canviar la direcció de la imatge.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_canvi_imatge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Disposar un div amb un conjunt de paràgrafs. Quan es premi un botó associar-li una classe que es pressioni altre desassociar d'aquesta classe.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_class]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*utilitzant addClass, fer que en prémer un botó agafe els estils de la llibreria animate.css perquè es produeixi l'animació corresponent. Als dos segons deurà eliminar la classe (pista setTimeout)&lt;br /&gt;
&lt;br /&gt;
:[[solucio_animate_class]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenemos un formulario que en su interior existe un label &amp;quot;introduce valores&amp;quot;, un input de type=text y un botón. El fin consiste en borrar la etiqueta por ello debe usarse la propiedad &amp;quot;find&amp;quot; que busca en el interior de un elemento. Para que funcione debe usarse dos eventos el dobleclick y salir del botón. &lt;br /&gt;
&lt;br /&gt;
:[[sol_find_on]]&lt;br /&gt;
&lt;br /&gt;
*Tenemos un div con id=&amp;quot;primero&amp;quot; que dentro tiene otro div luego un span, luego otro div y por último dos span seguidos. Queremos remarcarlo de rojo el segundo span, debe usarse la propiedad la propiedad find.&lt;br /&gt;
&lt;br /&gt;
:[[sol_segundo_span]]&lt;br /&gt;
&lt;br /&gt;
=== Utilitzant CSS ===&lt;br /&gt;
Després que hem seleccionat els elements som capaços d'afegir i treure estils, classes, i més. &lt;br /&gt;
Exemple per obtenir un atribut css:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	var fontSize = $('#productes tbody tr:first').css('font-size');&lt;br /&gt;
	alert(fontSize);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Exemple per canviar un atribut css:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	$('#productes tbody tr:even').css('background-color','#dddddd');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Però i si es vol canviar o afegir dos o més atributs?&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#productes tbody tr:even').css('background-color','#dddddd');&lt;br /&gt;
$('#productes tbody tr:even').css('color', '#666666');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Podem simplificar lo anterior amb una sola crida :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#productes tbody tr:even').css({&lt;br /&gt;
	'background-color': '#dddddd', &lt;br /&gt;
	'color': '#666666',&lt;br /&gt;
	'font-size': '11pt',&lt;br /&gt;
	'line-height': '2.5em' &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_classlist_add classList.add]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.getElementById(&amp;quot;myDIV&amp;quot;).classList.add(&amp;quot;mystyle&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afegir elements al DOM ===&lt;br /&gt;
Podem afegir elements al HTMl utilitzant JQUERY:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
    $(&amp;quot;&amp;lt;span&amp;gt;Hello world!&amp;lt;/span&amp;gt;&amp;quot;).insertAfter(&amp;quot;p&amp;quot;); //inserta la etiqueta &amp;quot;&amp;lt;span&amp;gt;Hello world!&amp;lt;/span&amp;gt;&amp;quot; amb text després de &amp;lt;p&amp;gt;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//altre exemple&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;&amp;lt;p&amp;gt;insertar després del div la etiq p&amp;lt;/p&amp;gt;&amp;quot;).insertAfter($(&amp;quot;#div&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;button&amp;quot;).click(function(){&lt;br /&gt;
    $(&amp;quot;&amp;lt;span&amp;gt;Hello world!&amp;lt;/span&amp;gt;&amp;quot;).insertBefore(&amp;quot;p&amp;quot;);  //inserta la etiqueta &amp;quot;&amp;lt;span&amp;gt;Hello world!&amp;lt;/span&amp;gt;&amp;quot; amb abans de &amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Altres funcions per afegir elements:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Añadir un texto y unas etiquetas HTML al elemento con id=&amp;quot;miElemento&amp;quot;. &lt;br /&gt;
$(&amp;quot;#miElemento&amp;quot;).append(&amp;quot;&amp;lt;p&amp;gt;Nuevo contenido de miElemento&amp;lt;/p&amp;gt;&amp;quot;) &lt;br /&gt;
//Para añadir un elemento al final de la lista &lt;br /&gt;
$(&amp;quot;ul&amp;quot;).append(&amp;quot;&amp;lt;li&amp;gt;otro item al final&amp;lt;/li&amp;gt;&amp;quot;); &lt;br /&gt;
//Para añadir un elemento al principio de la lista &lt;br /&gt;
$(&amp;quot;ul&amp;quot;).prepend(&amp;quot;&amp;lt;li&amp;gt;otro item al principio&amp;lt;/li&amp;gt;&amp;quot;); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Una altra forma de fer el mateix però al revés.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('&amp;lt;strong&amp;gt;Començar!&amp;lt;/strong&amp;gt;').prependTo('#missatge');&lt;br /&gt;
$('&amp;lt;strong&amp;gt;Acabar!&amp;lt;/strong&amp;gt;').appendTo('#missatge');&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ELIMINAR elements al DOM ===&lt;br /&gt;
Fins i tot, podem esborrar elements:&lt;br /&gt;
&lt;br /&gt;
.remove (), no només elimina el contingut d'un element, sinó que també elimina l'element en si.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#missatge').remove();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.empty () elimina el contingut (NO l'element en si)i tots els descendents d'un element. Per exemple, si fas servir .empty () en un 'ol', també eliminaràs tots els seus 'li' i el seu text.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#missatge').empty();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RECORRER DOM ===&lt;br /&gt;
&lt;br /&gt;
Accedir al [http://www.w3schools.com/jquery/traversing_closest.asp pare]:&lt;br /&gt;
El mètode closest retorna el primer ancestre de l'element seleccionat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $(&amp;quot;span&amp;quot;).closest(&amp;quot;ul&amp;quot;).css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;, &amp;quot;border&amp;quot;: &amp;quot;2px solid red&amp;quot;});   //canvia el css del pare &amp;lt;ul&amp;gt;&lt;br /&gt;
//&amp;lt;span&amp;gt; seria el fill i &amp;lt;ul&amp;gt; seria el pare, avi..&lt;br /&gt;
&lt;br /&gt;
 var id = $(&amp;quot;span&amp;quot;).closest(&amp;quot;ul&amp;quot;).attr(&amp;quot;id&amp;quot;);      //obté la id del element pare&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.w3schools.com/jquery/traversing_parent.asp parent()]&lt;br /&gt;
&lt;br /&gt;
El mètode parent () retorna l'element pare directe de l'element seleccionat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    $(&amp;quot;span&amp;quot;).parent().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.w3schools.com/jquery/traversing_parents.asp parents()] Padres, abuelos, bisabuelos, tataranietos…&lt;br /&gt;
&lt;br /&gt;
El mètode parents () retorna tots els elements ancestral del element seleccionats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    $(&amp;quot;span&amp;quot;).parents().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_traversing_next next()]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    $(&amp;quot;li.primer&amp;quot;).next().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El mètode next() retorna el pròxim element germà de l'element seleccionat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_traversing_prev prev()]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    $(&amp;quot;li.primer&amp;quot;).prev().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El mètode prev() retorna l'anterior element germà de l'element seleccionat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/traversing_find.asp find()]''' Hijos, nietos, bisnietos, tataranietos&lt;br /&gt;
&lt;br /&gt;
El mètode find()  retorna els elements descendents de l'element seleccionat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;ul&amp;quot;).find(&amp;quot;span&amp;quot;).css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});  //dibuixa de color roig el span dins del ul&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/traversing_children.asp children()]'''&lt;br /&gt;
&lt;br /&gt;
El mètode children()  retorna tots els fills directes de l'element seleccionat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
   $(&amp;quot;ul&amp;quot;).children().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});;  //dibuixa de color roig el fills directes.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/traversing_siblings.asp siblings()]'''&lt;br /&gt;
&lt;br /&gt;
El mètode siblings()  retorna tots els elements germans de l'element seleccionat.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
    $(&amp;quot;li.start&amp;quot;).siblings().css({&amp;quot;color&amp;quot;: &amp;quot;red&amp;quot;});  //dibuixa de color roig el germans del element seleccionat.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*tenemos un div que será un cuadrado rojo de 400x400 px, además tenemos 6 botones. El primero de ellos, eliminará todos los elementos que se encuentren dentro de él. El segundo botón inserta un cuadrado verde mediante la función .html de 50x50px, el tercer botón añadirá un elemento al final que tendrá de fondo azul, el cuarto botón añadirá un elemento al principio de fondo amarillo, el quinto botón eleminará el último elemento y el sexto botón eliminará el primer elemento&lt;br /&gt;
:[[sol_dom]]&lt;br /&gt;
&lt;br /&gt;
*Implementar una página que contenga una lista con cuatro items. El primer botón, elimina los elementos de la lista(li), el segundo restaura los elementos, el tercero añade otro item, el cuarto añade un item al principio, el quinto elimina un elemento del final, el sexo elimina un elemento del principio, el sexto elimina los dos primeros(usar lt),el septimo elimina los dos últimos, el octavo inserta un item después del ul.&lt;br /&gt;
:[[sol_dom_II]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== EFECTES VISUALS ==&lt;br /&gt;
Totes les aplicacions web modernes incorporen petits efectes visuals i animacions que, si s'utilitzen de forma adequada, milloren la interacció amb la aplicació i la seva usabilitat. jQuery inclou de sèrie els efectes visuals més utilitzats&lt;br /&gt;
pels dissenyadors, podent controlar mitjançant les seves opcions la durada de cada efecte.&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_show hide / show]''' &lt;br /&gt;
&lt;br /&gt;
jQuery permet gestionar els efectes visuals d'un pàgina web utilitzant, entre altres, els mètodes hide (amagar) i show (mostrar). Aquests mètodes ja els hem vist, però en aquest apartat veurem com aconseguir ocultar i mostrar informació a diferents velocitats.&lt;br /&gt;
Mostra un element de forma normal (normal), ràpida (fast) o lenta (slow), també es pot indicar els milisegons de l'acció. També és possible indicar una funció perquè s'executi en finalitzar l'efecte visual.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).show ([&amp;quot;fast&amp;quot; / &amp;quot;slow&amp;quot; / &amp;quot;normal&amp;quot; / &amp;quot;mil·lisegons&amp;quot;], [function])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Perquè es mostri de forma instantània s'omet qualsevol paràmetre.&lt;br /&gt;
Els paràmetres funcionen de forma equivalent amb hide (ocultar)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element) .hide ([&amp;quot;fast&amp;quot; / &amp;quot;slow&amp;quot; / &amp;quot;normal&amp;quot; / &amp;quot;milisegons&amp;quot;], [function])&lt;br /&gt;
$(#id).hide(&amp;quot;slow&amp;quot;);&lt;br /&gt;
$(#id).hide(&amp;quot;slow&amp;quot;,function(){alert(hola!!)});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''fadeIn / fadeOut / [http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_fadeto fadeTo]'''&lt;br /&gt;
&lt;br /&gt;
Aquests mètodes provoquen també que un element es mostri (fadein) o s'oculti (fadeout) però actua sobre la transparència dels objectes.&lt;br /&gt;
La sintaxi i els atributs són equivalents als mètodes show / hide&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).fadeIn ([&amp;quot;fast&amp;quot; / &amp;quot;slow&amp;quot; / &amp;quot;normal&amp;quot; / &amp;quot;mil·lisegons&amp;quot;], [function])&lt;br /&gt;
$(element).fadeOut([&amp;quot;fast&amp;quot;/&amp;quot;slow&amp;quot;/&amp;quot;normal&amp;quot;/&amp;quot;milisegundos&amp;quot;],[function]) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El mètode '''fadeTo''' pot modificar la opacitat d'un element fins a un valor determinat que es passa per paràmetre.&lt;br /&gt;
Podem inicialitzar aquest mètode de les següents formes:&lt;br /&gt;
&lt;br /&gt;
''fadeTo ([velocitat], [valor d'opacitat])''&lt;br /&gt;
&lt;br /&gt;
Indiquem la velocitat de transició de l'estat actual al nou estat (slow / normal / fast) o un valor indicat en mil·lisegons.&lt;br /&gt;
El valor de l'opacitat és un nombre real entre 0 (transparent) i 1 (opac) També podem cridar al mètode fadeTo amb tres paràmetres:&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).fadeTo ([velocitat], [valor d'opacitat], [funció])&lt;br /&gt;
 $(&amp;quot;#descripcion&amp;quot;).fadeTo(&amp;quot;fast&amp;quot;,0.5);} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aquesta segona estructura de la funció permet executar una funció quan finalitza la transició.&lt;br /&gt;
Cal tenir en compte que fadeTo per més que indiquem el valor 0 en opacitat l'espai que ocupa l'element a la pàgina seguirà ocupat per un requadre buit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_toggle toggle()]'''&lt;br /&gt;
 &lt;br /&gt;
Ja hem vist el mètode toggle per alternar l'execució de dues funcions, però en aquest apartat el veurem per intercanviar la visibilitat d'un element.&lt;br /&gt;
El mètode toggle permet ocultar un element si aquest està visible i mostrar si està ocult.&lt;br /&gt;
&amp;lt;source lang = &amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(element).toggle([“fast”/”slow”/“normal”/milisegundos],[function]) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_animate Animate()]'''&lt;br /&gt;
&lt;br /&gt;
El mètode animate permet realitzar animacions personalitzades. La seva sintaxi és la següent:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$ (element).animate ({propietats}, [durada], [f_animación], [callback])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
on:&lt;br /&gt;
&lt;br /&gt;
* propietats, és l'únic paràmetre obligatori i s'utilitza per indicar que atributs CSS es volen actualitzar amb nous valors. JQuery només permet el canvi de propietats CSS que tinguin valors numèrics. per exemple&lt;br /&gt;
podríem canviar la mida de la lletra però no la seva font. La mesura per defecte és la de píxels. Els nous valors s'han d'indicar de forma absoluta o de forma relativa utilitzant la notació &amp;quot;+ = nº&amp;quot; p &amp;quot;+ = nº&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* durada, indica la durada de l'animació en milisegons o un valor identificatiu de la velocitat (normal, fast o slow).&lt;br /&gt;
&lt;br /&gt;
''Exemple''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;#btn1&amp;quot;).click(function(){&lt;br /&gt;
        $(&amp;quot;#box&amp;quot;).animate({height: &amp;quot;300px&amp;quot;},2000, &amp;quot;linear&amp;quot;,function(){alert(&amp;quot;hola&amp;quot;);})&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_slidetoggle slideToggle()]'''&lt;br /&gt;
&lt;br /&gt;
Quan l'animació ha acabat podem programar que s'executi una funció automàticament (callback function):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#missatge').slideToggle('slow', function() {&lt;br /&gt;
	alert('s'ha acabat l'animació!')&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_eff_slideup_slidedown slideUp()/ slideDown()]'''&lt;br /&gt;
&lt;br /&gt;
Però potser, el que volem és que desaparegui el botó:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
$('#missatge').slideUp('slow', function() {&lt;br /&gt;
	$('#toggleBoto').fadeOut();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[https://jqueryui.com/draggable/ Draggable]'''&lt;br /&gt;
&lt;br /&gt;
jQuery UI té una funció .draggable () que permet arrossegar qualsevol element d'HTML; pots fer clic i moure-ho a qualsevol part de la pàgina. Però hi ha que utilitzar la llibreria &lt;br /&gt;
&amp;lt;script src=&amp;quot;//ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 $( &amp;quot;#draggable&amp;quot; ).draggable();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercicis ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
*Tenemos un planeta y de fondo tiene el espacio que queremos que cuando cliquemos cambie de color rojo lentamente&lt;br /&gt;
:[[css]]&lt;br /&gt;
&lt;br /&gt;
:[[sol_planeta]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenemos un menu que cuando pasemos el ratón por encima de un botón(div) añada un clase y cuando salga la elimine por tanto haremos uso del evento hover.&lt;br /&gt;
:[[sol_hover]]&lt;br /&gt;
&lt;br /&gt;
*Tenemos un input que deseamos cambiar el borde del input cuando hagamos foco sobre él, añadiendo una propiedad en css.&lt;br /&gt;
&lt;br /&gt;
:[[sol_focus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenemos un SuperMario que cuando pasamos el ratón por encima de él salta y cuando lo dejamos cae hacia abajo. Usad hover y animate.&lt;br /&gt;
&lt;br /&gt;
:[[sol_mario_animate_hover]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Se trata de hacer saltar a Sonic mediante dos teclas arriba y abajo.&lt;br /&gt;
&lt;br /&gt;
:[[sol_sonic_keypress_animate]]&lt;br /&gt;
&lt;br /&gt;
*Tenemos varios párrafos mediante la función draggable tenemos que enviar cada uno de ellos a una papelera(imagen), en el momento que llega a ella deberá eliminarse(en este ejercicio aún no es necesario usar droppable) Además deberá mostrar la posición en X e Y. Para este ejercicio no se usará la función droppable Más [http://www.desarrolloweb.com/articulos/preguntas-respuestas-draggable-jqueryui.html info]&lt;br /&gt;
&lt;br /&gt;
:[[sol_draggable_papelera]]&lt;br /&gt;
&lt;br /&gt;
*Se tratará de realizar un juego de relacionar palabras, por ello tenemos tres cuadrados 100x100 que uno será Julio, otro Albert, otro Alex, otro Ramón, otro Raquel y David. En otra parte de la pantalla, tenemos 6 apellidos, corresponden con Noguera, Canela, Salinas, Sort, López y Villote. Se deberá arrastrar el apellido sobre el cuadrado correspondiente (por ejemplo: Noguera al cuadrado Julio ). Las palabras deberán desaparecer progresivamente (SlideUp).Se deberá añadir un contador de tiempo (append) y palabras acertadas.&lt;br /&gt;
&lt;br /&gt;
:[[sol_juego_color]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Tenemos otro planeta que tiene de fondo el espacio que queremos que cuando cliquemos cambie de color rojo gradualmente la mismo tiempo que se reduzca a la mitad de su tamaño, por ello, usaremos las jqueryUi la función &amp;quot;animate&amp;quot;&lt;br /&gt;
:[[sol_planetaII]]&lt;br /&gt;
&lt;br /&gt;
*Se trata de hacer una calculadora básica que muestre el resultado usando Selectable (display as grid) en JqueryUI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Es tracta de crear dos inputs i al fer clic es produeïx un esdeveniment que mostra el seus valor en cas de estar omplits mostrant un missatge.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_id]]&lt;br /&gt;
&lt;br /&gt;
*Enllaça el paràgraf &amp;lt; p &amp;gt; amb Diversos esdeveniments (clic, MouseEnter, mouseleave) i un controlador únic paràgraf tots ells que fa que el contingut dels paràgrafs de canvieu de color al produir-se l'esdeveniment corresponent.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_esdeviments]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Canvia el text del paràgraf que està en primera posició quan es fa dobleclick en qualsevol paràgraf del web, a més mostra el contingut anterior del paràgraf en una finestra.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_canvia_paragraf]]&lt;br /&gt;
&lt;br /&gt;
*Aquesta pàgina web canvia l'atribut del títol de l'enllaç al fer clic sobre el primer paràgraf.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_atribut]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*La pàgina web conté botons que modifiquen els atributs de vora de la taula (no hi ha que usar css). Botó canvia, recupera borde i elimina atribut&lt;br /&gt;
&lt;br /&gt;
:[[solucio_botons_atributs]]&lt;br /&gt;
&lt;br /&gt;
*Crea un &amp;lt; h1 &amp;gt; i a més dos botons que permeten enllaçar i eliminar una classe CSS d'un element respectivament i que aquesta canvie de color.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_enllaçar_eliminar_classe]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Crea un botó que afegeixi un formulari i un altre per veure'n el contingut&lt;br /&gt;
&lt;br /&gt;
:[[solucio_modificar_formulari]]&lt;br /&gt;
&lt;br /&gt;
*Utilitzant efectes, fes que un requadre amb text i mitjançant l'ús de dos botons podrem fer que s'oculti lentament el quadre o que es mostra ràpidament.&lt;br /&gt;
&lt;br /&gt;
:[[solucio_show_hide]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- //apunts alex&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonaments ==&lt;br /&gt;
La potencia de Jquery radica en recuperar elements de les pàgines html i realitzar operacions amb ells d'una manera fàcil i ràpida. Si coneixes CSS, ets conscient del poder dels selectors que descriuen grups d'elements pel seu tipus, atributs o situació dins del document. Amb Jquery podem utilitzar aquest coneixement, i simplificar la manera d'utilitzar Javascript.&lt;br /&gt;
=== Selectors ===&lt;br /&gt;
Per exemple, el selector&lt;br /&gt;
*p a&lt;br /&gt;
fa referència a tots els enllaços (elements &amp;lt;nowiki&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/nowiki&amp;gt;) que estan dintre d'un element &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt;. Jquery utilitza els mateixos selectors CSS i a més a més, inclou alguns dels selectors més poderosos de CSS3.&lt;br /&gt;
Amb Jquery, utilitzarem la següent sintaxi:&lt;br /&gt;
'''$(selector)''' o '''jquery(selector))'''.&lt;br /&gt;
Per exemple, per obtenir tots els enllaços que estan dintre d'un element &amp;lt;nowiki&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/nowiki&amp;gt; farem:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;quot;p a&amp;quot;);&lt;br /&gt;
//o bé:&lt;br /&gt;
jquery(&amp;quot;p a&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Un altre exemple: Si volem ocultar tots els divs que pertanyen a la classe &amp;quot;ender&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;quot;div.ender&amp;quot;).hide();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Un altre exemple molt comú és canviar el text que hi ha en un element html. Amb Jquery es pot fer de dues maneres que donen resultats idèntics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Primera Manera:&lt;br /&gt;
$(&amp;quot;selector&amp;quot;).html(&amp;quot;Acabo d'afegir Text a un element&amp;quot;);&lt;br /&gt;
// Segona Manera:&lt;br /&gt;
$(&amp;quot;selector&amp;quot;)[0].innerHTML = &amp;quot;Acabo d'afegir Text a un element&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Que passaria si el 'selector' retornes més d'un element?&lt;br /&gt;
Doncs que si utilitzem la 1a manera, es posaria el text &amp;quot;Acabo d'afegir Text a un element&amp;quot; a tots els elements seleccionat. Molt útil quan volem canviar tot el HTML d'un grup d'elements.&lt;br /&gt;
I amb la segona manera?&lt;br /&gt;
Hauriem de fer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var elements = $(&amp;quot;selector&amp;quot;);&lt;br /&gt;
for(var i=0;i&amp;lt;elements.length;i++)&lt;br /&gt;
elements[i].innerHTML =&lt;br /&gt;
&amp;quot;Acabo d'afegir Text a un grup de nodes&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest últim exemple és MOLT POC RECOMANAT. És molt més pràctic i eficient utilitzar la 1a manera a l'hora de programar amb JQuery.&lt;br /&gt;
&lt;br /&gt;
Exemples de selectors:&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;200 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Selector&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;350 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Explicació&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;p:even&amp;quot;) || Selecciona tots els paràgrafs parells &lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;p:odd&amp;quot;) || Selecciona tots els paràgrafs senars &lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;tr:nth-child(1)&amp;quot;)  || Selecciona la primera fila de cada taula&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;body &amp;gt; div&amp;quot;) || Selecciona el/s fill/s directe/s &amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt; de &amp;lt;body&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;a[href$= 'pdf ']&amp;quot;) || Selecciona els enllaços a fitxers pdf&lt;br /&gt;
|-&lt;br /&gt;
| $(&amp;quot;body &amp;gt; div:has(a)&amp;quot;)  || Selecciona el/s fill/s directe/s &amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt; de &amp;lt;body&amp;gt;&amp;lt;/nowiki&amp;gt; que contenen enllaços&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Assegurant-nos que la pàgina està a punt ===&lt;br /&gt;
Abans que podem interaccionar amb elements d'HTML en una pàgina, aquests han d'estar carregats: només els podem canviar una vegada que són ja allà. L'única manera fiable era esperar que es carregui la pàgina sencera abans que poguéssim executar qualsevol script. &lt;br /&gt;
JQuery té un esdeveniment molt potent que ens permet executar el script tant aviat com sigui possible. Gràcies a això, les nostres aplicacions semblaran que es carreguen molt mes ràpid. Aquesta funció és: '''$(document).ready(....);'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
    alert('Benvinguts a la pàgina JQuery ...');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquesta funció s'utilitza tant que existeix una drecera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() { alert('Benvinguts a la pàgina JQuery ...'); });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Utilitzant CSS ===&lt;br /&gt;
Després que hem seleccionat els elements som capaços d'afegir i treure estils, classes, i més. &lt;br /&gt;
Exemple per obtenir un atribut css:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	var fontSize = $('#productes tbody tr:first').css('font-size');&lt;br /&gt;
	alert(fontSize);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Exemple per canviar un atribut css:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	$('#productes tbody tr:even').css('background-color','#dddddd');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però i si es vol canviar o afegir dos o més atributs?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#productes tbody tr:even').css('background-color','#dddddd');&lt;br /&gt;
$('#productes tbody tr:even').css('color', '#666666');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podem simplificar lo anterior amb una sola crida :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#productes tbody tr:even').css({&lt;br /&gt;
	'background-color': '#dddddd', &lt;br /&gt;
	'color': '#666666',&lt;br /&gt;
	'font-size': '11pt',&lt;br /&gt;
	'line-height': '2.5em' &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Utilitzant Events (Event handler) ===&lt;br /&gt;
Si volem afegir esdeveniments als diferents elements que apareixen a la pàgina web utilitzant Jquery podem fer-ho molt fàcilment:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#boton').click(function() {&lt;br /&gt;
	$('#missatge').show(); //es mostra el missatge&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però quan s'executa un element moltes vegades volem utilitzar l'element on està l'esdeveniment per tal de fer alguna cosa amb els seus valors. Jquery ens permet utilitzar la paraula reservada '''this'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#Boton').click(function() {&lt;br /&gt;
	$(this).hide(); // el botó desapareix&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''$(this)'''proporciona una manera més maca d'accedir al botó en comptes de tornar a seleccionar-ho.&lt;br /&gt;
Amb JQuery podem fer coses molt potents com el botó 'toggle':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#toggleBoto').click(function() {&lt;br /&gt;
	$('#missatge').toggle();&lt;br /&gt;
	if ($('#missatge').is(':visible')) {&lt;br /&gt;
		$(this).val('Amaga');&lt;br /&gt;
	} else {&lt;br /&gt;
		$(this).val('Mostra');&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Afegir elements al DOM ===&lt;br /&gt;
Podem afegir elements al HTMl utilitzant JQUERY:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;toggle&amp;quot; id=&amp;quot;toggleBoto&amp;quot;&amp;gt;').insertAfter('#missatge');&lt;br /&gt;
$('#toggleBoto').click(function() {&lt;br /&gt;
	$('#missatge').toggle();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Altres funcions per afegir elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('&amp;lt;strong&amp;gt;Començar!&amp;lt;/strong&amp;gt;').prependTo('#missatge');&lt;br /&gt;
$('&amp;lt;strong&amp;gt;Acabar!&amp;lt;/strong&amp;gt;').appendTo('#missatge');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fins i tot, podem esborrar elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#missatge').remove();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Canviar el text d'un element ===&lt;br /&gt;
Si volem canviar el text d'un element tenim dos maneres:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('p').html('&amp;lt;strong&amp;gt;Alerta!&amp;lt;/strong&amp;gt; hi ha etiquetes html... ');&lt;br /&gt;
$('h2').text('&amp;lt;strong&amp;gt;Alerta!&amp;lt;/strong&amp;gt; hi ha etiquetes html ...');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La funció '''$(selector).html(...)''' interpretarà les etiquetes html que s'introdueixin dintre del text a mostrar. En canvi, si no volem que s'interpretin les etiquetes html utilitzarem la funció '''$(selector).text(...)'''&lt;br /&gt;
Podem utilitzar aquestes funcions per obtenir el text en comptes de modificar-ho? Sí!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alert($('h2:first').text());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Afegir efectes i animacions ===&lt;br /&gt;
Hi ha diverses funcions de jquery que tenen la habilitat de poder-se animar. Com l'efecte toggle de l'exemple anterior:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#toggleBoto').click(function() {&lt;br /&gt;
	$('#missatge').toggle('slow');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Quan l'animació ha acabat podem programar que s'executi una funció automàticament (callback function):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#missatge').slideToggle('slow', function() {&lt;br /&gt;
	alert('s'ha acabat l'animació!')&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però potser, el que volem és que desaparegui el botó:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$('#missatge').slideUp('slow', function() {&lt;br /&gt;
	$('#toggleBoto').fadeOut();&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Molt més ===&lt;br /&gt;
Com ja heu vist, amb JQuery podeu fer moltes coses de manera ràpida i fàcil. Us recomano aquests llibres : &amp;lt;p&amp;gt; Earle Castledine,  Craig Sharkie, &amp;quot;jQuery: Novice to Ninja&amp;quot;, Ed. Sitepoint, 2010, ISBN 978-0-9805768-5-6 &amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Bear Bibeault, Yehuda Katz, &amp;quot;JQuery in Action Second Edition&amp;quot;, Ed. Manning, 2010, ISBN 978-935182-32-0 &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ubilabs.github.io/geocomplete/&lt;br /&gt;
&lt;br /&gt;
==Exercicis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Exercici Botons Celestials amb jQuery===&lt;br /&gt;
Crea una pàgina web amb dos botons amb el text:&lt;br /&gt;
*Text boto 1: 'Angelet'&lt;br /&gt;
*Text boto 2: 'Diablet'&lt;br /&gt;
El comportament ha de ser el següent:&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Angelet' es creen ''n'' botons més, on ''n'' és un número aleatori entre 1 i 10 i aquests botons poden ser 'Angelets o Diablets'.&lt;br /&gt;
Cada vegada que es clica sobre un botó 'Diablet' s'eliminen ''n'' botons, on ''n'' és un número aleatori entre 1 i 20.&lt;br /&gt;
&lt;br /&gt;
:[[solució botons-celestials-jquery]]&lt;br /&gt;
&lt;br /&gt;
:[[solució botons-celestials-jquery-II]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exercici Web Dinámica amb jQuery ===&lt;br /&gt;
a) Crea un HTML amb els següents camps:&lt;br /&gt;
Input text1 : Que demani la etiqueta que es vol crear&lt;br /&gt;
Input text2 : Que demani On es vol crear (una altre etiqueta que ja hauria d'existir)&lt;br /&gt;
Boto crear: Crea el node del input text1 com a fill de input text2.&lt;br /&gt;
b)Creació automática:&lt;br /&gt;
Crea automàticament una Web via DOM que contingui:&lt;br /&gt;
Tants paràgrafs com text trobis a la web http://www.lipsum.com/&lt;br /&gt;
&lt;br /&gt;
:[[solució web-dinamica-jquery]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Fitxer:programador.gif]]&lt;br /&gt;
&lt;br /&gt;
https://cybmeta.com/comprobar-sin-un-checkbox-esta-seleccionado-con-jquery&lt;/div&gt;</summary>
		<author><name>Jnoguera</name></author>	</entry>

	</feed>