Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FERNEY OSMA
Al ser un Lenguaje Dinámico que solo funciona en servidores, podemos crear tareas
muy complejas y avanzadas como:
Operaciones CRUD como crear, Leer, Actualizar y Eliminar registros o datos
de una base de datos en el servido
Controlar sesiones de usuarios
Gestionar cookies
Trabajar conversaciones de chat con web Sockets
Entre otras cosas más
Hoy en día son muchas las empresas que tiene sus aplicaciones web hechas en
PHP en su totalidad o parcialmente, entre las empresas tenemos:
WordPress CMS
Joomla CMS
Facebook
Moodle CMS
Entre otras
En ocasiones se necesita realizar aplicaciones web de manera rápida y comenzar
a estructurarla desde cero puede ser muy traumático, para eso están los
Frameworks que son un conjunto de módulos que tienen como objetivos el
desarrollo ágil de aplicaciones mediante la aportación de librerías y/o
funcionalidades ya creadas para ser utilizadas.
Para el desarrollo de este informe se hará una aplicación web utilizando el lenguaje
de programación PHP y Laravel como Framework.
¿QUÉ ES LARAVEL?
Descargar e instalar el programa Xampp. Este programa que incluye PHP y MySQL.
https://www.apachefriends.org/es/index.html
Descargar e instalar el manejador de dependencias de PHP llamado Composer.
https://getcomposer.org/download/
Ahora toca conectar nuestra aplicación con la base de datos. Para este ejemplo
nuestra base de datos se va a llamar blog, accedemos a la consola o cmd de
Windows y lo ejecutamos como administrador, cuando abra escribimos el
siguiente comando “mysql -u -p”, luego nos pedirá una contraseña, le damos enter
porque no tiene contraseña la base de datos, en caso de que tenga contraseña
debe escribirse.
Debe de salir este mensaje, ahora, escribo el siguiente comando “create database
blog;”, ojo el comando debe terminar en punto y coma “;” este comando me crea
la base de datos.
La base de datos ya está creada, luego nos toca configurar nuestra aplicación
para conectarla a la base de datos, en la carpeta raíz hay un archivo .env, este
archivo contiene las variables de entorno y hay vanos a configurar la conexión a la
base de datos.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=clave => clave si no tiene se deja vacío
Ahora nos toca crear las tablas, pero esa tarea nos las hace Laravel, con las
migraciones que se crearon anteriormente. Para ejecutar estar migraciones se
escribe el comando “php artisan migrate”.
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
*
*/
public function potst(): HasMany
{
return $this->hasMany(Post::class, 'user_id');
}
}
Después editamos la clase Post
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
*
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
/**
*
*/
public function category():BelongsTo
{
return $this-> belongsTo(Category::class, 'category_id');
}
}
Y por último editamos la clase Category
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
*
*/
public function post(): HasMany
{
return $this->hasMany(Post::class, 'category_id');
}
}
Una vez terminado de editar las clases, vamos a crear la autenticación del usuario,
Laravel a partir de su versión 6 separo la funcionalidad del front-end a un nuevo
paquete de Composer llamado laravel\ui, asi que primero toca instalarlo
escribiendo en la terminal de comando “composer require laravel\ui”
Luego copio los siguientes enlaces y los pego en el archivo app.blade.php que está
ubicado en la carpeta resources > view > layouts > app.blade.php.
Dentro de la etiqueta head y debajo del comentario “Styles” pegar el link copiado,
esto le dará el estilo al sitio
<!-- Styles -->
<link rel="stylesheet" href="https://stackpath.bootstra
pcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="
sha384-
ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2
MZw1T" crossorigin="anonymous">
Y por último agregamos los archivos .js para la interactividad del sitio. Estos enlaces
van antes de cerrar la etiqueta body
<script src="https://code.jquery.com/jquery-
3.3.1.slim.min.js" integrity="sha384-
q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi
6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pop
per.js/1.14.7/umd/popper.min.js" integrity="sha384-
UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHN
Dz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstr
ap/4.3.1/js/bootstrap.min.js" integrity="sha384-
JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B
07jRM" crossorigin="anonymous"></script>
</body>
Ahora la interfaz de usuario tendrá un cambio radical.
Una vez se crea la cuenta la aplicación nos redirige a una página autenticada
Creamos las rutas de nuestra aplicación editando el archivo routes > web.php
use App\Post;
Route::get('/', function () {
$posts = Post::with('user')->get();
return view('welcome')->with('posts', $posts);
});
Auth::routes();
// rutas para el crud de categorias
Route::resource('categories', 'CategoryController');
// rutas para el crud de posts
Route::resource('posts', 'PostController');
Route::get('/home', 'HomeController@index')->name('home');
Al crear las rutas de tipo resource automáticamente laravel crea las rutas para
crud.
use App\Category;
use Illuminate\Http\Request;
return View('category.index')
->with('categories', $categories);
}
return redirect()->route('categories.index');
}
return redirect()->route('categories.index');
}
return redirect()->route('categories.index');
}
}
<?php
// Controlador de las publicaciones
namespace App\Http\Controllers;
use App\Category;
use App\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
return View('post.edit')
->with('post', $post)
->with('categories', $categories);
}
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<div class="clearfix">
<h6 class="float-left">Categorias</h6>
<a
href="{{ route('categories.create') }}"
class="btn btn-sm btn-primary float-right">
Crear categoria
</a>
</div>
</div>
<div class="card-body">
<table class="table">
<thead>
<tr>
<th>Codigo</th>
<th>Nombre</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach ($categories as $category)
<tr>
<td>{{ $category->id }}</td>
<td>{{ $category->name }}</td>
<td>
<a href="{{ route('categories.edi
t', $category) }}" class="btn btn-sm btn-info">Editar</a>
<button
class="btn btn-sm btn-danger"
onclick='event.preventDefault(
);
document.getElementBy
Id("category{{$category->id}}").submit();'>
Eliminar
</button>
<form id="category{{$category-
>id}}" action="{{ route('categories.destroy', $category) }}" method="POST"
style="display: none;">
@csrf
@method('DELETE')
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection
{{-- Vista que muestra el formulario para crear la categoría --}}
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h6
class="float-left">
Crear categoría
</h6>
</div>
<div class="card-body">
<form
method="POST"
action="{{route('categories.store')}}">
@csrf
<div class="form-group">
<label>Nombre de la categoria</label>
<input
class="form-control"
name="name" type="text" required />
</div>
<div class="form-group">
<button
class="btn btn-block btn-primary"
>Crear categoria</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
{{-- Vista que muestra el formulario para editar la categoría --}}
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h6
class="float-left">
Editar categoria - {{ $category->name }}
</h6>
</div>
<div class="card-body">
<form
method="POST"
action="{{route('categories.update', $ca
tegory)}}">
@csrf
@method('PUT')
<div class="form-group">
<label>Nombre de la categoria</label>
<input
class="form-control"
name="name" type="text"
required
value="{{ $category->name }}" />
</div>
<div class="form-group">
<button
class="btn btn-block btn-primary">
ACtualizar categoría
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@extends('layouts.app') {{-- Vista que muestra todas las publicaciones --}}
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-10">
<div class="card">
<div class="card-header">
<div class="clearfix">
<h6 class="float-left">Publicaciones</h6>
<a href="{{ route('posts.create') }}" class="btn btn
-sm btn-primary float-right">Crear publicación</a>
</div>
</div>
<div class="card-body">
<table class="table">
<thead>
<tr>
<th>Codigo</th>
<th>Titulo</th>
<th>Categoria</th>
<th>Fecha de creación</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach ($posts as $post)
<tr>
<td>{{ $post->id }}</td>
<td>{{ $post->title }}</td>
<td>{{ $post->category->name }}</td>
<td>{{ $post->created_at }}</td>
<td>
<a href="{{ route('posts.edit', $po
st) }}" class="btn btn-sm btn-info">Editar</a>
<button
class="btn btn-sm btn-danger"
onclick='event.preventDefault();
document.getElementById
("post{{$post->id}}").submit();'>
Eliminar
</button>
<form id="post{{$post-
>id}}" action="{{ route('posts.destroy', $post) }}" method="POST" style="dis
play: none;">
@csrf
@method('DELETE')
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection
{{-- Vista que muestra el formulario para crear una publicación --}}
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-9">
<div class="card">
<div class="card-header">
<h6 class="float-
left">Crear publicación</h6>
</div>
<div class="card-body">
<form method="POST" action="{{ route('posts.
store') }}">
@csrf
<div class="form-group">
<label>Titulo</label>
<input class="form-
control" name="title" type="text" required />
</div>
<div class="form-group">
<label>Categoria</label>
<select name="category_id" class="fo
rm-control">
<option>Seleccione una opcion</optio
n>
@foreach ($categories as $catego
ry)
<option value="{{ $category-
>id }}">{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>Descripción</label>
<textarea class="form-
control" name="description"></textarea>
</div>
<div class="form-group">
<button class="btn btn-block btn-
primary">Crear publicación</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
{{-- Vista que muestra el formulario para editar una publicación --}}
@extends('layouts.app')
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-9">
<div class="card">
<div class="card-header">
<h6 class="float-left">Crear publicación</h6>
</div>
<div class="card-body">
<form
method="POST"
action="{{route('posts.update', $post) }}">
@csrf
@method('PUT')
<div class="form-group">
<label>Titulo</label>
<input class="form-
control" name="title" type="text" value="{{ $post->title }}" required />
</div>
<div class="form-group">
<label>Categoria</label>
<select name="category_id" class="form-control">
<option>Seleccione una opcion</option>
@foreach ($categories as $category)
@if($category->id == $post->category_id)
<option value="{{ $category-
>id }}" selected>{{ $category->name }}</option>
@else
<option value="{{ $category-
>id }}">{{ $category->name }}</option>
@endif
@endforeach
</select>
</div>
<div class="form-group">
<label>Descripción</label>
<textarea class="form-
control" name="description">{{$post->description}}
</textarea>
</div>
<div class="form-group">
<button class="btn btn-block btn-
primary">Crear publicación</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Se les agrega el middleware a los controladores de las categorías y las
publicaciones, este middleware se coloca en el constructor de la clase.
// PostController.php
public function __construct()
{
$this->middleware('auth')->except('show');
}
// CategoryController.php
public function __construct()
{
$this->middleware('auth');
}
Por último, modificamos la página principal listando todas las publicaciones creadas.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-10">
@foreach ($posts as $post)
<div>
<a href="{{ route('posts.show', $post) }}">
<h2>{{ $post->title}}</h2>
</a>
<span class="text-muted">
<i>Publicado por</i>
{{$post ->user->name}} –
{{$post->created_at->diffForHumans()}}
</span>
</div>
@endforeach
</div>
</div>
</div>
@endsection
En este informe se observó como se desarrolla una ampliación desde cero utilizando
el Framework Laravel utilizando sus componentes.
Gracias a su interfaz de línea de comando (CLI) Laravel te permite crear archivos
con estructuras predefinidas en cuestión de segundo, lo que ayuda
exponencialmente la productividad del desarrollo.
Laravel al traer soporte para varios gestores de base de datos te evita de que tu
aplicación contenga consultas especificas para cierto gestor de base de datos,
además Laravel te permite crear una base de datos relacional directamente desde
el Framework gracias a su sistema de migraciones.
Al optar por un modelo MVC (Modelo-Vista-Controlador) Laravel fomenta a ser un
poco mas ordenado, separando los procesos del back-end y el front-end.
Laravel al ser un Framework genera muchos archivos y requiere de mucha
configuración lo cual no es recomendable para utilizarlo para proyectos demasiados
pequeños, ya que ocuparía paquetes que no se utilizarían.
WEBGRAFÍA