PHP Modelo - Vista - Controlador

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introdución

  • Existen moitos frameworks PHP que nos permiten programar seguindo o patrón de deseño de software Model-View-Controller.


  • Nota: Como editor de texto para manexar os arquivos do proxecto no framework Laravel recomendo instalar Brackets.


Instalación

  • Primeiro vídeo: basicamente fala de instalar composer e con el instalar Laravel. Para instalar Laravel necesitamos ter php instalado.
  • Os pasos para instalar php os tedes na wiki.
  • Os pasos para instalar composer os tedes na wiki.
  • Os pasos para instalar Mysql, un xestor de bases de datos, os tedes na wiki.


  • Para instalar Laravel, dende consola escribiremos: composer create-project laravel/laravel nome_proxecto "5.1.*"
Sendo 5.1 a versión de Laravel a utilizar
Para lanzar o servidor web do proxecto creado, estando no cartafol raíz de dito proxecto, escribiremos: php artisan serve
Aparecerá unha mensaxe informando de que o servidor web está levantado e escoitando no porto 8000. Escribiremos na URL do navegador: http://localhost:8000


  • Artisan é un comando de Laravel. Podedes consultalo neste enlace.
  • Para executar un comando de artisan temos que escribir: php artisan comando dende o raíz do sitio web creado.
  • Cando creamos un modelo coa orde: php artisan make:model Note
Isto crea un arquivo de nome Note.php no cartafol /app no raíz do proxecto.


Primeiros pasos

Nesta parte imos usar diferentes 'verbos' do protocolo HTTP.
Instalaremos o complemento de firefox HttpRequester para simular o envío utilizando os verbos (get, post, put,...).
Exercicios: Unha vez lido os puntos anteriores deberedes facer diferentes rutas utilizando diferentes verbos có complemento.
EXEMPLO:
Php laravel 1.jpg
Exemplo de envío utilizando o método POST a url http://localhost:8000/testpost, sendo 'testpost' unha ruta previamente definida:
1 Route::post('/testpost',function() {
2    echo "Isto é un post a /testpost"; 
3 });
  • Durante o manual fala de utilizar un controlador para recibir un parámetro.
Se queredes facer a proba teredes que definir un arquivo php no cartafol: /proxecto/app/Http/Controllers/ControladorProba.php
O nome ControladorProba.php é un exemplo.
O código de dito arquivo pode ser algo parecido a isto:
 1 <?php
 2 
 3 namespace App\Http\Controllers;
 4 
 5 use App\User;
 6 use App\Http\Controllers\Controller;
 7 
 8 class ControladorProba extends Controller {
 9     
10     public function procedementoControlador($id){
11         return "Esta información ven dun controlador especifico. Recibido o dato $id";
12     }
13     
14 }


Como se pode ver, o nome da clase é igual ao nome do arquivo php. Deriva da clase Controller.
Leva un procedemento de nome 'procedementoControlador' cun parámetro.
Agora debemos crear a ruta que vai facer uso de esta clase controladora:
Modificamos o arquivo routes.php.
Route::get('controlador/{identificador}','ControladorProba@procedementoControlador');
Como vemos, agora en vez de ter unha función anónima, temos o nome da clase controladora (ControladorProba) e o nome do procedemento almacenado ao que vai chamar (procedementoControlador). Dito procedemento vai levar un parámetro que está definido na parte Get da orde route ({identificador}).
Agora podemos poñer unha URL da forma: http://localhost:8000/controlador/1000
Enviaremos o dato 1000 á clase controladora.


  • Recurso:
  • Páxina web para verificar unha expresión regular: regex101.com.


  • Exercicios:
  • Crea unha ruta con dous parámetros que sexan opcionais. Dalle un valor por defecto a cada un deles.
  • Crea unha ruta que acepte como parámetro unha expresión regular de 5 números do 0 ao 7.
  • Crea outra ruta que acepte como parámetro unha expresión regular que acepta un número-letras (número guión letras)


Solucións:
 1 Route::get('/opcionais/{param1?}/{param2?}',function($par1=1,$par2='valor defecto'){
 2    echo "O param1 ten valor $par1 e o param2 ten valor $par2"; 
 3 });
 4 
 5 Route::get('/rutaNumeros/{numero}',function($numero){
 6    echo "5 números de 0 ao 7: $numero";    
 7 })->where(array('numero' => '[0-7]{5}'));
 8 
 9 Route::get('/rutaNumerosCadea/{dato}',function($dato){
10    echo "Dato numérico-texto: $dato";    
11 })->where(array('dato' => '[0-7]+-[a-z|A-Z]+'));

Vistas

Exemplo 1 do manual anterior. Creación dunha vista

  • Lembrar que as vistas é onde se atopa o código que vai amosarse ao usuario (html,css,javascript).
A vista foi creada previamente no cartafol: /raiz_proxecto/resources/views
Arquivo: algo.blade.php
 1 <!DOCTYPE html>
 2 <html lang="es">
 3 <head>
 4 	<meta charset="UTF-8">
 5 	<title>Isto é unha vista de proba</title>
 6 </head>
 7 <body>
 8 	<h1>Vista "algo"</h1>
 9 	<p>Esta é a miña primeira vista en Laravel</p>
10 </body>
11 </html>
Un exemplo de código dunha ruta (routes.php) cun if condicional para preguntar se a vista existe dende .
1 Route::get('vistas',function(){
2    if(view()->exists("algo")){
3         return view('algo');
4    }else {
5        echo "A vista non existe";
6    }
7 });

Exemplo 2 do manual anterior. Creación dunha vista nun cartafol e paso de parámetros á vista dende a ruta

  • Seguindo o exemplo do manual, imos crear unha vista no cartafol /sitio_raiz/resources/views/outro.
Arquivo: index.blade.php
 1 <!DOCTYPE html>
 2 <html lang="es">
 3 <head>
 4 	<meta charset="UTF-8">
 5 	<title>Isto é unha vista de proba dentro dun cartafol</title>
 6 </head>
 7 <body>
 8 	<h1>Vista "algo" dentro dun cartafol</h1>
 9     <p>Benvido {{$nomeVista}}. Xa vexo que tes {{$idadeVista}} anos :)</p>
10 </body>
11 </html>
  • Liña 9: Como vemos imos facer uso de dúas variables que van vir dende a ruta (poderían vir da mesma forma dende o controlador). Como estamos nun arquivo blade.php podemos facer uso da sintaxe das plantillas, no que para 'imprimir as variables' utilizamos {{ }}
Arquivo: routes.php
 1 Route::get('vistas',function(){
 2    if(view()->exists("outro.index")){
 3        $nome='Angel';
 4        $idade=45;
 5        return view('outro.index',[
 6             'nomeVista' => $nome,
 7             'idadeVista' => $idade
 8         ]);
 9    }else {
10        echo "A vista non existe";
11    }
12 });
  • Como vemos no return view enviamos en forma de array as variables que imos utilizar na vista (nomeVista e idadeVista) cos valores das variables definidas na ruta ($nome e $idade).
  • Exercicio proposto: Modifica a ruta anterior para que reciba dous parámetros e sexan os que se envíen á vista (Nota: podemos ter as dúas vistas á vez)
Solución:
 1 Route::get('vistas/{nome}/{idade}',function($nome,$idade){
 2    if(view()->exists("outro.index")){
 3        return view('outro.index',[
 4             'nomeVista' => $nome,
 5             'idadeVista' => $idade
 6         ]);
 7    }else {
 8        echo "A vista non existe";
 9    }
10 });

HTTP Request

Exemplo 1 do manual anterior. Uso de Http request

  • Neste exemplo imos ver como a partires dun formulario no que se pide login-password imos recibir có método 'post' os datos do mesmo noutra vista.
Partimos do formulario.
Arquivo: /proxecto_raiz/resources/views/formulario/Formulario.blade.php
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 2     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
 4     <head>
 5         <meta charset="utf-8" />
 6         <title>Formulario</title>
 7         <style>
 8             .formularios{
 9                 width: 30%;
10                 margin: 0px auto;
11             }
12             .etiqueta{
13                 float: left;
14                 width: 190px;
15             }
16             .botonesformularios{
17                 width: 50%;
18                 margin: 30px auto;
19                 text-align: center;
20             }
21             select {
22                 width:50%;
23             }
24         </style>
25     </head>
26     <body>
27         <form id="frmValidacion" class="formularios" method="post" action="/controlador">
28             <div>    
29                 <div class='etiqueta'>Login:</div>
30                 <input type="text" size="15" maxlength="15" name="txtLogin" />
31             </div>                
32             <div>
33                 <div class='etiqueta'>Password:</div>
34                 <input type="password" size="15" maxlength="15" name="txtPassword" />
35             </div>                
36             <div class="botonesformularios">
37                 <input type='submit' value="ENVIAR" />
38             </div>
39         </form>
40 
41     </body>    
42 </html>


Liña 27: Como vemos na action do formulario imos invocar un controlador a través dunha ruta definida no arquivo routes.php.
  • Definimos unha ruta para cargar a vista do formulario:
Arquivo: proxecto_raiz/app/Http/routes.php
1 Route::get('formulario/',function(){
2     return view('formulario.Formulario');
3 });
Nota: Por practicar estamos amosando a vista directamente dende a ruta, cando deberíamos pasar por un controlador.
Se poñemos como url: http://localhost:8000/formulario aparecerá o formulario.
  • Indicamos no arquivo de routes.php que se ten que facer cando reciba unha chamada do formulario. Fixarse como o verbo da ruta é post.
Arquivo: proxecto_raiz/app/Http/routes.php
1 Route::post('controlador/','ControladorProba@mostrarUriUrl');


  • Agora creamos a clase controladora e método mostrarUriUrl dentro dela.
 1 <?php
 2 
 3 namespace App\Http\Controllers;
 4 
 5 use App\User;
 6 use App\Http\Controllers\Controller;
 7 use Illuminate\Http\Request;
 8 
 9 class ControladorProba extends Controller {
10     
11     public function procedementoControlador($id){
12         return "Esta información ven dun controlador especifico. Recibido o dato $id";
13     }
14     
15     public function mostrarUriUrl(Request $request){
16         echo $request->path();
17         echo "<br>";
18         echo $request->url();
19         echo "<br>";
20 
21         
22         var_dump($request->all());  // ou dd(($request->all())); ou print_r(($request->all()));
23         
24     }
25     
26 }
Nota:
  • $request->all(): Devolve todos os datos enviados polo formulario.
  • $request->input('txtLogin'): Devolve o texto do campo con name 'login' do formulario.


  • Dará como resultado:
controlador
http://localhost:8000/controlador

/home/angel/laravel/first_steps/app/Http/Controllers/ControladorProba.php:22:
array (size=2)
  'txtLogin' => string 'dfsdf' (length=5)
  'txtPassword' => string 'dsfds' (length=5)


Introdución aos modelos

Exemplo 1 do manual anterior

  • Temos que ter creada unha base de datos Mysql cun usuario e password que teña permiso sobre dita base de datos.
  • Os pasos para instalar Mysql, un xestor de bases de datos, os tedes na wiki.
Unha vez creada debemos editar o arquivo proxecto_raiz/app/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=homestead
DB_USERNAME=laravel
DB_PASSWORD=laravel

Unha vez cambiado debemos parar o servidor laravel e volvelo a iniciar coa orde:php artisan serve dende o raíz do proxecto.

  • Partindo que xa temos a táboa e a base de datos seguindo o manual...
  • Imos facer que se amosen os datos nunha vista en forma de lista.
  • Arquivo: proxecto_raiz/resources/views/basedatos/articles.blade.php
 1 <!DOCTYPE html>
 2 <html lang="es">
 3 <head>
 4 	<meta charset="UTF-8">
 5 	<title>Isto é unha vista de proba dunha táboa mysql</title>
 6 </head>
 7 <body>
 8     <ul>
 9         <?php
10             foreach($datos as $fila){
11                 printf("<li>%s--->%s",$fila->id,$fila->name);
12             }
13 
14         ?>
15         
16     </ul>
17 </body>
18 </html>
Liña 10: Nomeamos $datos á variable que vai vir do controlador cos datos da táboa. Segundo o manual isto non é necesario xa que podemos acceder dende calquera parte aos datos do modelo coa orde: \App\Article::all(); Pero desta forma practicamos o paso de datos dende o controlador e ademáis supoño que será a forma correcta :)
  • Arquivo: /proxecto_raiz/app/Http/Controllers/ArticulosController.php
 1 <?php
 2 
 3 namespace App\Http\Controllers;
 4 
 5 use App\User;
 6 use App\Http\Controllers\Controller;
 7 use Illuminate\Http\Request;
 8 
 9 class ArticulosController extends Controller {
10     
11     public function amosarArticulos(){
12         $datos=\App\Article::all();
13         return view('basedatos.articles',[
14             'datos' => $datos
15         ]);
16 
17     }
18     
19     
20 }
Liñas 13,14: Dende este método do controlador enviamos os datos da táboa á vista.


  • Arquivo: /proxecto_raiz/app/Http/routes.php
1 Route::get('articulos/','ArticulosController@amosarArticulos');
Cando na url poñamos: http://localhost:8000/articulos chamará ao método amosarArticulos do controlador ArticulosController.


  • Resultado:
    1--->Probando
    2--->Algo
    3--->Lindo





-- Ángel D. Fernández González -- (2016).