---
# System prepended metadata

title: Laravel
tags: [apuntes]

---

---
title: Laravel
tags: apuntes
description: Apuntes de Laravel.
---

# Laravel

## Instalación

Para instalar Laravel, necesitamos usar el programa Composer. Lo encontraremos en su página oficial https://getcomposer.org

1. Lo descargaremos e instalaremos.
2. Abriremos una terminal/cmd.
3. Usaremos el siguiente comando > `composer global require laravel/installer`
4. Ya tenemos Laravel instalado!

## Crear un projecto

1. Primero tenemos que abrir la terminal/cmd.
2. Nos ubicamos en la carpeta donde queramos crear el proyecto. Ojo, el projecto será una carpeta, no hace falta que le crees una carpeta al proyecto.
3. Una vez ubcados en la carpeta, normalmente htdocs o alguna de sus subcarpetas, usaremos el siguiente comando > `laravel new nombreproyecto`
4. Nos creara una carpeta "nombreproyecto" donde estará todo el proyecto, así de fácil!

## Controlador Central

El controlador central en Laravel se encuentra en `/routes/web.php`

El contenido incial es el siguiente:
```php=
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
```

Lo que hace esto es, cuando el usuario se conecta a la raiz, busca la vista welcome.php y la muestra. En este caso encuentra `/resources/views/welcome.blade.php`

Pero nos interesa que llame a un controlador, y no a la vista, será el controlador el que nos de la vista, para ello vamos a crear un conjunto de Modelo, Vista y Controlador!

## Vista

Para crear la vista nos iremos a `/resources/views` y crearemos un nuevo archivo, en nuestro caso vamos a utilizar el motor de vista **blade** para crear una página de chistes, `joke_page.blade.php`.

Pero antes, crearemos la plantilla de vista `template.blade.php`
```htmlmixed=
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="<?= asset('css/base_style.css') ?>">
    @yield('css')
    <title>@yield('title')</title>
</head>

<body>
    @yield('body')
</body>

</html>
```

Los @yield nos permitirán insertar código en esa parte desde las demas vistas.

`joke_page.blade.php`
```htmlmixed=
@extends('template') <!-- Extenderemos de template.blade.php -->

@section('css') <!-- En el @yield css meteremos el siguiente código -->
    <link rel="stylesheet" href="<?= asset('css/joke_style.css') ?>">
@endsection

@section('title', 'Jokes') <!-- El @yield title lo cambiaremos por una string -->

@section('body') <!-- En el @yield body meteremos el siguiente código -->
    <div class="container">
        <div class="jokes">
            <?php foreach ($jokes as $jk) { ?>
            <table>
                <tr>
                    <th class="col-2">ID</th>
                    <th class="col-8">Joke</th>
                </tr>
                <tr>
                    <td class="col-2"><?= $jk['id'] ?></td>
                    <td class="col-8"><?= $jk['joke'] ?></td>
                </tr>
            </table>
            <?php } ?>
        </div>
    </div>
@endsection
```

El resultado, es decir, lo que recibirá del motor blade, será:
```htmlmixed=
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="<?= asset('css/base_style.css') ?>">
    <link rel="stylesheet" href="<?= asset('css/joke_style.css') ?>">
    <title>Jokes</title>
</head>

<body>
    <div class="container">
        <div class="jokes">
            <?php foreach ($jokes as $jk) { ?>
            <table>
                <tr>
                    <th class="col-2">ID</th>
                    <th class="col-8">Joke</th>
                </tr>
                <tr>
                    <td class="col-2"><?= $jk['id'] ?></td>
                    <td class="col-8"><?= $jk['joke'] ?></td>
                </tr>
            </table>
            <?php } ?>
        </div>
    </div>
</body>

</html>
```

## Modelo

## Controlador

### Utilizar otro metodo en vez de \_\_invoke()

Controlador:
```php=
class JokesController extends Controller {

    public function __invoke() {
        return view('joke_page');
    }

    public function other_invoke() {
        return view('otherjoke_page');
    }

}
```

Para llamarlo en web.php
```php=
// Para el __invoke normal
Route::get('/jokes', JokesController::class);

// Para especificar otro metodo
Route::get('/otherjokes', JokesController::class, 'other_invoke');
```

## MVC

## Formularios

Los formularios de Laravel, para evitar formularios no deseados, o falsos, implementa un sistema de tokens, para verificar que el formulario viene de nuestra página. Para usarlo, necesitamos un input hidden:
```htmlmixed=
<form action="<?= Request::url() ?>" method="POST">
    <input type="hidden" name="_token" value="<?= csrf_token()?>">
    <input type="text" placeholder="texto" name="texto" id="">
    <input type="submit" value="enviar">
</form>
```

En blade es tan simple como:
```htmlmixed=
<form action="<?= Request::url() ?>" method="POST">
    @csrf
    <input type="text" placeholder="texto" name="texto" id="">
    <input type="submit" value="enviar">
</form>
```

## Request::query() > $\_GET & Rquest::post() $\_POST

Para acceder a los datos del $\_GET y $\_POST, accedemos con los metodos estáticos, que sanean los datos.

En vez de `$_GET["id"]`, usaremos `Request::query()["id"]`.

A su vez, en vez de `$_POST["nombre"]`, usaremos `Request::query()["nombre"]`

## Session > $\_SESSION

La sesion se usa de la siguiente manera:
```php=
Session::put('clave','valor'); // Almacenar un valor en la sesión
if (Session::has('clave')) { // Comprobar si existe la clave
    echo Session::get('clave'); // Recuperar un valor
}
Session::forget('clave'); // Borrar un valor
Session::flush(); // Borrar la sesión
```

## Cookie > $\_COOKIE

Similar a las sesiones, las cookies tienen su clase:
```php=
// Crear cookie
Cookie::queue('nombre_de_la_cookie','valor_c', 1000 /*Minutos*/);

// Borrar cookie
Cookie::queue(Cookie::forget('nombre_de_la_cookie'));

// Acceder a datos de la cookie
echo request()->cookie('nombre_de_la_cookie');
```

## Coger datos extra con la ruta en web.php

Podemos coger datos por la ruta en vez de por el GET.
```php=
Route::get('test/{$carpeta}', function ($carpeta) {
    return '<!DOCTYPE html><html><body><p>'.$carpeta.'</p></body></html>';
});
```

Para que sea opcional, tienes que añadir un ? y de paso un valor por defecto, aunque sea un string vacio.
```php=
// {$carpeta?} y $carpeta = ''
Route::get('test/{$carpeta?}', function ($carpeta = '') {
    return '<!DOCTYPE html><html><body><p>'.$carpeta.'</p></body></html>';
});
```

Para pasarselo al controlador, necesitamos añadir un parámetro al método \_\_invoke(), y simplemente llamar al controlador:
Controlador:
```php=
class TestController extends Controller {

    public function __invoke($carpeta = '') {
        return '<!DOCTYPE html><html><body><p>'.$carpeta.'</p></body></html>';
    }

}
```
web.php
```php=
Route::get('test/{$carpeta?}', TestController::class);
```


## Redireccionar rutas

```php=
return redirect()->to('/')->send();
return redirect()->to('https://www.google.es')->send();
```

## Clonar desde GIT

Necesitaras tener Composer instalado.

1. Usar el comando `git clone` normal, y descargar el proyecto/repositorio.
2. Dentro del projecto usar el comando `composer install`. Para insatalar las dependencias en el proyecto.
3. Copiar el `.env example` como `.env` y cambiar los datos necesarios.
4. Por último ejecutar el comando `php artisan key generate`


