Instalación de lo necesario

Instalar Composer

En Linux o Mac:curl -sS https://getcomposer.org/installer | php

Si somos usuarios de linux o Mac, podemos mover composer.phar a la ruta usr/local/bin para tenerlo disponible para todo el proyecto.
sudo mv composer.phar /usr/local/bin/composer

En Windows: Contamos con un instalador que podemos descargar en:
https://getcomposer.org/Composer-Setup.exe

Instalar GIT

Enlace a diapositivas

Instalar Mcrypt PHP extensión (necesaria para instalar Laravel)

Comprobamos si está instalado lanzando la función phpinfo(); de php en el navegador.

Si no lo está, lo instalamos:
sudo apt-get install php5-mcrypt

Si está instalado pero no activado: sudo php5enmod mcrypt

Para aplicar los cambios: sudo /etc/init.d/apache2 restart

Instalar Laravel

	composer create-project laravel/laravel firstapp --prefer-dist

La aplicación deberá tener los permisos de lectura, escritura y ejecución necesarios.

Trazas: app/storage/logs/laravel.log
Debug mode: config/app.php → "debug" => true

MVC

modelo vista controlador

Error in exception handler

Debemos dar permisos de lectura y escritura (777) a la carpeta storage.

routes.php

app/Http/routes.php//Redirige a resources/views/hello.php
Route::get('/', function(){ return view('hello');});

//Otros redireccionamientos:
Route::get('about', function(){ return view('hello2');});
Route::get('about/pag', function(){ return view('hello3');});

Route::get('about/{param}', function($param){
	return view("contacto")->with('mi_parametro', $param)
});

Posible error al montar rutas

Si todas las páginas menos la de inicio arrojan un error 404 es probable que toque revisar el .htaccess o montar las rutas con este formato:

/index.php/hello

Es probable que podamos arreglar esto activando el módulo mod_rewrite (comando sudo a2enmod rewrite) o configurando los siguientes permisos en el fichero /etc/apache2/apache2.conf

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride All
	Require all granted
</Directory>

Ejercicio

Hacer una ruta de tal forma que cuando en la url escribamos las siguientes url's:

salutation/Juan
salutation/Pepe
salutation/Roberto

Obtengamos las siguientes vistas:
Hola Juan
Hola Pepe
Hola Roberto

Uso de formularios y etiquetas HTML en Blade

En Laravel 5.0, las etiquetas de Form y HTML ya no están incluidas por defecto. Para incluirlas, seguiremos los siguientes pasos:

  1. Añadimos la siguiente línea a la sección require dentro del fichero composer.json:
    "illuminate/html": "5.*"
  2. Ejecutamos desde la terminal el comando 'composer update'
  3. En el fichero config/app.php...
    añadimos este código al providers array
     'Illuminate\Html\HtmlServiceProvider' 
    	
    añadimos este código al aliases array 
    'Form'=> 'Illuminate\Html\FormFacade', 
    'HTML'=> 'Illuminate\Html\HtmlFacade'

Formularios con Blade

app/views/signup.blade.php{!! Form::open(array("url" => "thanks")) !!} 
	{!! Form::label("email", "Email address")!!}
	{!! Form::text("email") !!} <br>

	{!! Form::label("password", "Password")!!}
	{!! Form::password("password") !!} 

	{!! Form::text("direccion", "direccion",array('style'=>'width:400px')) !!} 
{!! Form::label("os", "Sistema operativo") !!} {!! Form::select("os", array( "linux" => "Linux", "max" => "Mac OS X", "windows" => "Windows" ))!!} <br> {!! Form::label("comment", "Comments")!!} {!! Form::textarea("comment", "", array("placeholder"=>"dime algo"))!!} <br> {!! Form::checkbox("agree", "yes", false) !!} {!! Form::label("agree", "Acepto tus condiciones")!!} <br> <input type="hidden" name="_token" value="{{ csrf_token() }}"> {{ Form::hidden('post_id', $post->id) }} {!! Form::submit("Sign up") !!} {!! Form::close() !!}
app/routes.phpRoute::post("thanks", function(){
	$theEmail = Input::get("email");
	return view("thanks")->with("theEmail", $theEmail);
});
//Route::get('thanks', 'MiController@procesa_thanks');
//Route::any('thanks', 'MiController@procesa_thanks');

View - Assets

resources/views/hello.php{!! HTML::style('css/main.css') !!}
{!! HTML::script('js/ckeditor.js') !!}
public/css/main.cssbody{
	background: blue
}

Ejercicio

Hacer tres vistas (inicio, servicios y contacto) con una hoja de estilos común que ponga su fondo rosa.

De momento no usaremos una botonera para navegar, sino introduciendo los valores en la url.

Crear links – varias maneras

<a href="<?= URL::to("pagina2/Juan/23");?>">enlace</a>

<?= URL::current(); ?>				//url dónde estoy ahora

<?= HTML::link("pagina2/Juan/23", "enlace")?>

<?= HTML::link("pagina2/Juan/23", "enlace", array("title"=>"link title"))?>

<?= HTML::mailto("pablomonteserin@pablomonteserin.com", "Mándame un mail"); ?>

Ejercicio

Añadir un barra de navegación a la página anterior.

Podemos usar:
<a href="<?= URL::to("pagina2/Juan/23");?>">enlace</a> o cualquier otro tipo.

Controlador

Es posible hacer aplicaciones pequeñas prescindiendo de él, metiendo su código en el routes.php

app/Http/routes.phpRoute::get('/', 'HomeController@showWelcome');
app/Http/controllers/HomeControllernamespace App\Http\Controllers;
class HomeController extends Controller {
	public function showWelcome(){
		return view('hello');
	}
}
Nota:Para llamar a un método del propio controlador: 
return $this->showWelcome();

Controlador, uso como en CodeIgniter

app/Http/routes.phpRoute::controller('/salutation', 'SalutationController');
app/Http/SalutationController.php<?php
class SalutationController extends Controller {
//		public/salutation
	public function getIndex(){
		...
	}
//		public/salutation/metodo1	
	public function getMetodo1(){
		...
	}
//		public/salutation/metodo2/Juan
	public function getMetodo2($nombre){
		...
	}
//		public/salutation/metodo3/Juan/Roberto
	public function getMetodo3($nombre1, $nombre2){
		...
	}
}

Ejercicio

Crear un controlador "salutation" en el que las siguientes URL's ejecuten las funcionalidades indicadas:

salutation→ muestra el texto "inicio"
salutation/saludar1 → Muestra el texto "hola"
salutation/saludar2/Juan → Muestra el texto "hola Juan"
salutation/saludar3/Juan/Roberto → Muestra el texto "hola Juan y Roberto"

Cargar vista desde controlador

app/Http/controllers/account.php
public function action_bienvenido(){
	return view("bienvenido");
}
resources/views/bienvenido.php<h1>Hello!</h1>

Para probarlo:
account/bienvenido

Dynamic Views (le pasamos parámetros a las vistas)

app/Http/controllers/account.phppublic function action_bienvenido(){
	return view("bienvenido")
	->with("name","Juan")
	->with("place", "Asturies");
}

	o

public function action_bienvenido(){
		$data = array("name"=>"Juan", "place"=>"Asturies");
		return view("bienvenido", $data);
}
resources/views/bienvenido.php<h1>Welcome to <?= $place?>, <?= $name?></h1>

Ejercicio

Calculadora.

Para enviar los datos a un controlador usaremos:

Route::get('calculator', 'CalculatorController@calcula');
Route::post('calculator', 'CalculatorController@calcula');
Route::any('calculator', 'CalculatorController@calcula');

Para recojer los datos usaremos:

use Input;
...
$n1 = Input::get("n1");

Blade Templates

Para habilitarlas; la extensión de nuestras vistas (carpeta app/views) será blade.php en lugar de .php.

hello.php → hello.blade.php

App/Http/routes.phpRoute::get("proba", function(){
	return view("hello", array("data"=>"<b>hola</b>"))
});
resources/views/hello.blade.php{{$data}}<br>
{!!$data!!}<br>
{!!$data or “valor por defecto”!!}<br>
{!!date("M d, Y")!!} <br>
{!!URL::asset('css/main.css')!!} <br>
@if($data=="hola")
	buenos días
@else
	buenas tardes
@endif

Ejercicio

Realizar el ejercicio de la calculadora pero utilizando blade.

Database setup

Está en:
config/database.php

El fichero .env en la raíz tiene estas variables que son las que se utilizan por defecto cuando estamos trabajando en local para conectarnos a la base de datos.

Este fichero está incluido en el .gitignore; cuando hacemos la subida al server no se sube y es una buena forma de que la base de datos funcione en ambos sitios

APP_ENV=local
APP_DEBUG=true
APP_KEY=GoSdTpGB5tt2ANRSLJhKqz5DAQgCkj41

DB_HOST=localhost
DB_DATABASE=the_room
DB_USERNAME=root
DB_PASSWORD=pp

CACHE_DRIVER=file
SESSION_DRIVER=file

CRUD

En computación CRUD es el acrónimo de Crear, Obtener, Actualizar y Borrar (del original en inglés: Create, Read, Update and Delete). Se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software.

CRUD con el Schema Builder

app/Http/routes.phpRoute::get("rqr", function(){
	//Creo la tabla art
	Schema::create("art", function($table)
	{
		$table->increments("id");
		$table->string("artist");
		$table->string("title", 500);
		$table->text("description");
		$table->date("created");
		$table->date("exhibition_date");
		$table->timestamps();	
	});
	//Añado un campo y elimino otro de la tabla art
	Schema::table("art", function($table)
	{
		$table->boolean("alumni");	
		$table->dropColumn("exhibition_date");
	});
});

increments() → Añade un ID autoincremental a la tabla. ¡La mayoría de tus tablas lo tendrán!
string() → Crea un campo VARCHAR. string suena mejor, ¿verdad?
integer() → Añade un campo del tipo entero a la tabla.
float() → Añade un campo del tipo float a la tabla.
boolean() → Añade un campo del tipo booleano a la tabla.
date() → Añade un campo de tipo fecha a la tabla.
timestamp() → Añade un campo de tipo timestamp a la tabla.
timestamps() → Añade los campos created_at y updated_at a la tabla para indicar cúando se creó y actualizó
(respectivamente) el registro.
text() → Añade un campo de tipo texto a la tabla.
blob() → Añade un campo de datos blob a la tabla.

CRUD con Fluent Query Builder (sin orientación a objetos)

Construye consultas protegidas contra inyección SQL.

$arrayUsuarios = DB::table('users')
→ where('username','=','Pablo')
→ or_where(function($query))
{
	$query → where('age', '>', '25');
	$query → where('votes', '>', '100') 
}
→ get(); //trigger

Conditions
where()
or_where()
where_in()
where_not_in()
or_where_in()
or_where_not_in()
where_null()
where_not_null()
or_where_null()
or_where_not_null()

Ordening
DB::table('shoes') → OrderBy('size', 'asc') → get();
Para ordenar de acuerdo a varios criterios, añadiremos más métodos OrderBy() a la cadena.

Limiting
DB::table('shoes') → take(10) → get();
//Para no cojer los 5 primeros resultados:
DB::table('shoes') → skip(5) → get();

Agregattes
$val = DB::table('shoes') → avg('size') → get();
$val = DB::table('shoes') → min('size') → get();
$val = DB::table('shoes') → max('size') → get();
$val = DB::table('shoes') → sum('size') → get(); br $val = DB::table('shoes') → count();

get() → devuelve todos los objetos.
first() → devuelve sólo el primer objeto.
find($id) → devuelve el objeto cuya propiedad 'id' vale el valor especificado.
only($fieldname) → devuelve los valores para una sola columna.
get(array()) → devuelve los valores para el array de columnas especificado.

Ver la última consulta ejecutada

$queries = DB::getQueryLog();
$lastquery = end($queries);
var_dump($lastquery);

Operaciones

Update
DB::table('zapatos')
->where('id', '=', $id)
->update(array('tipo'=> 'botines'));
//Incrementa el campo especificado.
$val = DB::table('shoes') → increment('size');

Delete
DB::table('no_zapatos')->where('textura', '=', 'peluda')->delete();
DB::table('zapatos')->delete($id);

Insert
DB::table('zapatos')->insert(array(
'color' => 'rosa fucsia',
'tipo' => 'tacón',
'tamano' => '12'
));
//Para recuperar la id del elemento recién insertado
$id = DB::table('zapatos')->insert_get_id(array(
'color' => 'rosa fucsia',
'tipo' => 'tacón',
'tamano' => '12'
));

Bucles con blade

@foreach ($usuarios as $usuario)
	<div class="usuario">{{ $usuario->nombre }}</div>
@endforeach

@for ($i =0; $i < 100 - 1; $i++)
	Número {{ $i }}<br />
@endfor

@forelse ($usuarios as $usuario)
	{{ $user->nombre }}
@empty
	<p>No hay usuarios.</p>
@endforelse

Ejercicio - Hospital

Tener en cuenta que cuando consultamos con Fluent Query Builder, obtendremos un array de objetos que no se lo podremos pasar directamente al motor blade:
{{ Form::select("os", $array)}}
Deberemos recorrer el array de objetos e ir metiendolo en un array de arrays o usar directamente html en lugar de blade.

Transacciónes

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

Si queremos gestionar manualmente lo que ocurre si la transacción no llega a ejecutarse, podemos usar:

DB::beginTransaction();

try {
    DB::insert(...);
    DB::insert(...);
    DB::insert(...);

    DB::commit();
    // all good
} catch (\Exception $e) {
    DB::rollback();
    // something went wrong
}

Modelo

Las tablas deberían tener una clave primaria llamada id.

Cada tabla debería ser nombrada con el plural de su correspondiente modelo. Si no fuese así podemos añadir una variable estática al modelo definiendo el nombre de las tablas.

app/User.phpnamespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model{
	public $table = 'my_users';
}
app/Http/controllers	
use App\User;
...
public function crea_usuario(){
	$user = new User();
	$user->name = "Pepe";
	$user->age =32;
	$user->save();	
}

Añadir propiedades al modelo que no están definidas en la base de datos

protected $appends = array('fotos');

public function getFotosAttribute(){
	return $this->title;    
}

public function setFotosAttribute($fotos){
	$this->title = $fotos;    
}

CRUD con Eloquent ORM (con orientación a objetos)

$users = User::all();		//SELECT * FROM "users"
$user = User::find(1); 		//SELECT * FROM "users" WHERE "id" = 1
$user = User::where('email', '=', $email)->first();
$user = User::where('name', '=', $name)->where("pass", '=', $pass)->first();
$user = User::where_email($email)->first();
$users = User::whereIn('id', array(1, 2, 3))->or_where('email', '=', $email)->get();
$users = User::OrderBy('votes', 'desc')->take(10)->get();

$min = User::min('id');
$max = User::max('id');
$avg = User::avg('id');
$sum = User::sum('id');
$count = User::count();
$count = User::where('id', '>', 10)->count();

$job = Job::find(Input::get("id"));
$job->delete();

//El siguiente método sirve tanto para insertar ($user = new User;) como para actualizar ($user = User::find(1);)
$user->save();
//El siguiente método devuelve la instancia que inserta
$user = User::create(array('email' => 'example@gmail.com'));  

Nota: 
Si no hay resultados para devolver, el método first() devolverá NULL, mientras que los métodos all y get devolverán un array vacío.

Update con Eloquent ORM

Es probable que nos dé el siguiente error:
Column not found: … Unknown column 'updated_at' …

Esto es debido a que tal como cree la base de datos no tengo una columna con esa información. Puedo desactivar la modificación de esa columna en el update:

$paciente = Paciente::find(Input::get("id_paciente"));
$paciente->nombre = "Juan";
$paciente->timestamps = false;
$paciente->save();

Ejercicio Hospital II

Repetir el ejercicio del hospital usando Eloquent ORM en lugar de Fluent Query Builder.

Uso de templates

resources/views/layouts/master.blade.php<html>
<head>
	<title>@yield('titulo')</title>
</head>
<body>
	<div class="header">
		<ul>
			<li><a href="#">Inicio</a></li>
			<li><a href="#">Blog</a></li>
		</ul>
	</div>
	<div id="content">
		@yield('contenido')
	</div>
</body>
</html>
resources/views/bienvenido.blade.php
@extends('layouts.master')

@section('titulo')
Monteserín Page
@stop

@section('contenido')
<h1>¡Bienvenido!</h1>
<p>¡Bienvenido a la página de Monteserín!!</p>
@stop

Ejercicio

Aplicar templates al hospital.

Validación → Controller Class

use Redirect;
use Response;
use Illuminate\Routing\Controller;
use App\Http\Requests\ValidaNoticia;

class HomeController extends Controller {
	public function insert(ValidaNoticia $request){
		…
		$notice->save();
	}
}

Validación → Validator Class

<?php namespace App\Http\Requests;
use Response;
use Illuminate\Foundation\Http\FormRequest;

class ValidaNoticia extends FormRequest{
	public function rules(){
		return [
		'featured_image' => 'required',
		];
	}

	public function authorize(){
		return true;
	}
}
?>

Validación → Vista

<div style="color:red">
	@foreach($errors->all() as $error)
		<p class="alert alert-danger">{{$error}}</p>
	@endforeach
</div>

Validación

$input = Input::all();
//alpha evalua que el valor introducido sólo contiene letras
$rules = array(
	"name"=>"required|min:3|max:32|alpha",
	"age"=>"required|integer|min:16");

$v = Validator::make($input, $rules);

if($v -> fails()){ // también podía haber usado if($v->passes())
	$errors = $v->errors;//obtenemos un array de errores para un campo específico
//el método first(), del array de mensajes de errores, me devuelve el primer elemento
	echo $errors->first("name"); //El texto del error se genera automáticamente
	echo $errors->first("name", '<span class=”error”>:message</span>'); 
	print_r($errors->all()); //me devuelve todos los errores
	$arrayDeErroresDeColor = $errors->get("name");
	echo $arrayDeErroresDeColor[1];
}else{

}

Validation - rules

required → es requerido
alpha → solo pueden ser letras
alpha_num → sólo pueden ser letras y números
alpha_dash → sólo pueden ser letras, números, dashes or underscores
size:5 → debe tener 5 caracteres exactamente
between: 5, 10 → debe tener entre 5 y 10 caracteres
min → debe tener como mínimo 5 caracteres
max → debe tener como máximo 5 caracteres
numeric: debe ser un número
integer: debe ser un entero
in: red, green, blue → debe estar entre esta lista de valores
not_in → no debe estar entre esta lista de valores
confirmed → el valor debe coincidir con el del campo confirmación del formulario
accepted → el valor debe ser true o 1.
match:age → el valor debe coincidir con el del campo indicado
different:age → el valor no debe coincidir con el del campo indicado
match:[a-z]+/ → el valor debe satisfacer la expresión regular
unique:users → el valor no debe coincidir con el campo del mismo nombre de la tabla users (muy útil para evitar valores repetidos). Acepta varios parámetros, separados por ,. Podemos evitar una id pasándola también como parámetro
exists: colors → al contrario que unique, comprueba que el dato ya existe en la base de datos
before: 1984-12-12 → la fecha introducida debe ser anterior a la indicada.
after:1984-12-12 → similar a la anterior
email → debe ser una dirección de mail válida
url → debe ser una url válida
active_url → debe ser una url válida y activa
mimes:png, mp3 → debe ser un $_FILE del tipo especificado
Image → debe ser un $_FILE del tipo especificado

Custom Error Messages

Modificaremos application/language/en/validation.php

Si queremos modificar los mensajes para un formularion concreto:

$messages = array('same'=>'The :attribute and :other must much, fool!', 'size', 'The :attribute must be exactly :size, like duh!')
$v = Validator::make($input, $rules, $messages);

Ejercicio

Añadir validación de todos los cuadros de texto del hospital.

Idiomas

app/lang/es/textos.php<?php
return array(
    "bienvenido" => "Bienvenido a Codehero",
    "iniciar"    => "Iniciar Sesión",
    "cancelar"   => "Cancelar",
);

Uso:
<?= Lang::get('textos.bienvenido');?>
{{ Form::label("nombre", Lang::get('textos.name'))}}


Cambio de idioma:
//El idioma seleccionado no quedará almacenado para la próxima vez que haga una petición. Deberé usar variables de sesión.
App::setLocale('en'); 

Textos con parámetros:
'bienvenido' => 'Bienvenido a Codehero, :nombre',
echo Lang::get('textos.bienvenido', array('nombre'=>'Pedro Perez') );

Idiomas cómo persistirlos a través de las peticiones

app/routes.php
Route::get('lang/{lang}', function($lang)
{
    Session::put('my.locale', $lang);
    return Redirect::to('/');
});
app/start/global.php
App::setLocale(Session::get('my.locale', Config::get('app.locale')));		
	

Ejercicio

Añadir Internacionalización al hospital.

Ejercicio

Quitar la carpeta public de la ruta.

1 – Copiaremos el contenido de la carpeta public en la raíz del proyecto.

2 – Modificamos las rutas en el index.php:
require __DIR__.'/framework/bootstrap/autoload.php';
$app = require_once __DIR__.'/framework/bootstrap/start.php';

3 – Nos aseguramos de tener este fichero .htaccess en la raíz del proyecto:
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Relaciones

Relaciones One-To-One

class User extends Model{
	public function vida(){
		return $this->hasOne("Vida");
		//return $this->hasOne("Vida", "id", "vida_id");	}
	}
}

class Vida extends Model {
	function user(){
		return $this->belongsTo("User");
	}		
}
echo User::find(1)->vida->duracion;


echo Vida::find(1)->user->nombre;

Nota: el nombre del método no debe coincidir con el nombre de ningún campo de la tabla.

users
idnombre
vidas
idduracionuser_id

Esta es la relación multitabla en la línea comentada

users
idnombrevida_id
vidas
idduración

Relaciones One-To-Many

class User extends Model{
	public function boletos(){
		return $this->hasMany("App\Boleto");
	}
}

class Boleto extends Model {
	public function user(){
		return $this->belongsTo("App\User");
	}
}
echo User::find(1)->boletos[0]->numero;

echo Boleto::find(1)->user->nombre;
users
idnombre
boletos
idnumerouser_id

Relaciones Many-To-Many

class User extends Model{
	public function bibliotecas(){
		return $this->belongsToMany("App\Biblioteca");
	}
}

class Biblioteca extends Model {
	public function users(){
		return $this->belongsToMany("App\User");
	}
}
echo User::find(1)->bibliotecas[0]->nombre;


echo Biblioteca::find(1)->users[0]->nombre;
Para insertar datos en la tabla biblioteca_user:$nuevo_usuario->bibliotecas()->attach(array(1,2,3,4,5), array("user_id"=>$nuevo_usuario->id));
Para insertar datos/modificar un campo extra de una tabla pivot (la tabla usada para relacionar dos tablas en una relación many to many), recomiendo hacerlo sin ORM:
DB::table('alumno_prueba')->where('alumno_id', '=', $alumno_id)->where('prueba_id', '=', $prueba_id)->update(array('notas' => $all_properties));

DB::table('alumno_prueba')->insert(array(
'alumno_id' => $alumno_id,
'prueba_id' => $prueba_id,
'notas' => $all_properties
));
users
idnombre
bibliotecas
idnombre
biblioteca_user
iduser_idbiblioteca_id

Ejemplo de consulta multitabla

$pedidos = Pedido::join( 'users', 'users.id', '=', 'idcliente')
        ->where('pedidos.descripcion', 'LIKE','%chocolate%')
        ->get();

Auth Class

Broma abuelita

Auth - User

<?php namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

	use Authenticatable, CanResetPassword;

	protected $table = 'users';

	protected $fillable = ['name', 'email', 'password'];

	protected $hidden = ['password', 'remember_token'];

}

Auth - UserController

<?php
use Auth;
class UserController extends Controller {
	public function login(){
		if (Auth::attempt(	array('email' => Input::get('email'),'password' => Input::get('password')))){
			echo "<br/><br/>login correcto<br/>";
		}else{
			echo "<br/><br/>login incorrecto<br/>";
		}
		return $this->carga_login();
	}

	public function carga_login(){
		if (Auth::check()){
			echo "Usuario autenticado: ".Auth::user()->nombre;
		}else{
			echo "Usuario no autenticado";
		}
		return view("hello");
	}
}
?>

Auth - notas

  • La tabla contra la que vamos a autentificar debe llamarse users, para que el modelo se llame User. Esto está definido en el fichero auth.php.
  • La contraseña debe ser almacenada encriptada en la base de datos. Para ver una contraseña encriptada podemos usar:
    echo Hash::make('12345'); Cuidado con salvar la clave con un espacio en blanco al final.
  • El campo que almacene estas contraseñas debe tener una longitud mínima de 60 caracteres.
  • Lo más sencillo es modificar la petición home, que es la que se ejecuta por defecto si el login ha tenido éxito.

Paginación

vista.blade.php
{{ $notices->render()}}
Controlador.php
$notices = Notice::paginate(5);
Algunos servidores no interpretan bien la url generada por el render y habrá que usar:{{ str_replace('/?', '?', $notices->render()) }}
return view(“vista”)->with(“recetas”, $recetas);

Ajax

Para hacer una petición con Ajax, deberemos enviar el token para que funcione:

$.post("{{ URL::to('peticion')}}",{"id_alumno":{{ $alumno->id }}, "_token":"{{ csrf_token() }}"},function(data){
	alert(data);
});

Bundles

Un bundle es un paquete que puede tener sus propias vistas, controladores, modelos etc. La carpeta application podría verse como un bundle que ya viene con funcionalidad cargada.

Crear un bundle

Creamos la carpeta de nuestro bundle (monteserin_com_theme) dentro de la carpeta /bundles. Dentro de la carpeta de nuestro bundle creamos el fichero start.php. Este paso no es estrictamente necesario.

El bundle que crearemos en este caso, será una plantilla.

Registramos el bundle en application/bundles.php, introduciendo la linea roja al final del return array().

return array(
	'docs' => array('handles' => 'docs'),
	'monteserin_com_theme' => array('handles' => 'monteserin_com_theme'),
);

En application/routes.php cargo el bundle:

Route::get('/', function()
{
	Bundle::start('monteserin_com_theme'); // ejecuta start.php
	//return view('monteserin_com_theme::home'); //ejecuta la vista del bundle, dentro de la carpeta views del bundle
});

Migrar a un servidor remoto

A tener en cuenta:

  • Laravel debe ser instalado en un servidor con una versión de PHP a partir de 5.4.
  • En el .gitignore hay una referencia a la carpeta vendor. Deberemos comentarla si vamos a subir laravel al servidor usando git.

Evitar tener que poner public en la ruta

  1. Copiamos el contenido de la carpeta public en la raíz de nuestro proyecto (podemos borrar la carpeta public, que ha quedado vacía.)
  2. Accedemos al fichero index.php que antes estaba en la carpeta public y ahora a quedado en la raíz de la aplicación y cambiamos estas dos líneas:
    require __DIR__.'/../bootstrap/autoload.php';
    $app = require_once __DIR__.'/../bootstrap/start.php';
    Por estas otras dos:
    require __DIR__.'/bootstrap/autoload.php';
    $app = require_once __DIR__.'/bootstrap/start.php';
  3. El contenido de la carpeta upload, lo seguiremos dejando en la misma ruta, es decir en public/upload.

Migration

Una migración consiste en crear la estructura de la base de datos de manera automática a partir de código php

A partir de la ubicación de nuestro proyecto Laravel, ejecutaremos:

php artisan make:migration --create="coches" TablaCoches

Creará un fichero en database/migrations que nos permitirá hacer ciertas modificaciones en la base de datos.

		
//Para levantar la base de datos:
public function up(){
	Schema::create('coches', function(Blueprint $table){
		$table->increments('id');
		$table->string("matricula");
		$table->string("detalle_del_motor", 500);
		$table->text("descripcion_tecnica");
		$table->date("fecha_matriculacion");
		$table->integer("conductor_id")->unsigned();
		$table->foreign("conductor_id")->references('id')->on('users');
		$table->timestamps();
	});
}
//Para bajarla:
public function down(){
	Schema::drop("coches");
}

Para desplegar el contenido de la carpeta migrations:

php artisan migrate:install
php artisan migrate

Para volver a ejecutar la migración:

php artisan migrate:refresh

Otros comandos útiles por consola

php artisan make:controller Coches
php artisan make:model Coches

Habilitar peticiones crosdomain (CORS)

function __construct(){
	header("Access-Control-Allow-Origin: *");
	header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
}
icono de mandar un mail¡Contacta conmigo!
contacta conmigoPablo Monteserín

¡Hola! ¿En qué puedo ayudarte?