Está en la página 1de 58

Laravel 5

Framework PHP

Laravel.com
Laravel.com
¿Qué es un framework?

Laravel.com
¿Por qué utilizar un framework?

 Agilización del proceso de  Requiere tiempo para aprender y


desarrollo. dominar.
 Refuerza buenos hábitos de diseño.  Te fuerza a usar la semántica
 Código limpio y ordenado. propia del framework.
 Seguridad.
 Código mantenible.
 Amplia comunidad de
desarrolladores.
 Plugins, componentes e integración
con otras herramientas.

Laravel.com
Framework mas utilizados

Laravel.com
¿PHP como lenguaje de desarrollo web?

Laravel.com
Principales características de PHP
 Mas rápido que ASP
 Es el mas sencillo de aprender
 Acceso a mas de 20 tipos de bases de datos
 Diseño modular y de fácil ampliación
 Gran extensión de documentación
 Gran cantidad de framework, cms, etc.
 Multiplataforma
 Licencia abierta

Laravel.com
Sistema de control de versiones

GitHub

Laravel.com
Sistema de control de versiones

Laravel.com
Sistema de control de versiones
 Principales comandos git
GIT CODE
> git init
> git add FILE.txt
> git commit –m “mi primer commit”
> git branch dev
> git checkout dev
> git merge dev
> git remote add origin https://github.com/user/Project.git
> git push –u origin master

Laravel.com
¿La mejor herramienta para programar?

Laravel.com
LARAVEL 5
Laravel radica en su integración, escalabilidad y facilidad de
mantenimiento. Elegante, simple y rápido

 Blade
 Eloquent ORM
 Routing
 Middlewares
 Accesibilidad para el desarrollo FULL STAK
 Pensada para API REST
 Código abierto publicada bajo la licencia MIT
 Comunidad y documentación

Laravel.com
¿Cómo funciona Laravel?

Laravel.com
Configuración del entorno de trabajo
 Git
https://git-scm.com/downloads

 PhpStorm
https://www.jetbrains.com/phpstorm/download/
https://www.sublimetext.com/3

 Composer
https://getcomposer.org/download/

 Servidor local
https://bitnami.com/stack/wamp/installer

Laravel.com
Instalando y configurando Laravel
 Documentación
https://laravel.com/docs/5.5
COMPOSER
> composer create-project --prefer-dist laravel/laravel blog "5.5.*"

 Requerimientos
 PHP >= 7.0.0
 OpenSSL PHP Extension
 PDO PHP Extension
 Mbstring PHP Extension
 Tokenizer PHP Extension
 XML PHP Extension

Laravel.com
Rutas
 Documentación
https://laravel.com/docs/5.5/routing
 Directorio

Route::get('/saludar', function () {
return 'Hello World';
Route::get('/user/profile',
});
'UserController@showProfile')->name('profile');
Route::get('/saludar/{id}', function ($id) {
Route::get($uri, $callback);
return 'hola '.$id;
Route::post($uri, $callback);
});
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::get('/user', 'UserController@index');
Route::delete($uri, $callback);
Route::options($uri, $callback);
Route::group(['middleware' =>
['admin'],'namespace' => 'Admin'],function() {
Route::resource('/user', 'UserController');
//code
});
Laravel.com
Controlador
 Documentación
https://laravel.com/docs/5.5/controllers
 Directorio

ARTISAN
php artisan make:controller EstudianteController
php artisan make:controller Estudiante\EstudianteController
php artisan make:controller Estudiante\EstudianteController --resource

CONTROLLER
return 'Hola mundo';
return response()->json($data);
return view('saludar');
return view('saludar',$data);

Laravel.com
Vista
 Documentación
https://laravel.com/docs/5.5/views
https://laravel.com/docs/5.5/blade
 Directorio

BLADE BLADE
<!-- Stored in resources/views/layouts/app.blade.php --> <!-- Stored in resources/views/child.blade.php -->
<html>
<head> @extends('layouts.app')
<title>App Name - @yield('title')</title> @section('title', 'Page Title')
</head>
<body> @section('sidebar')
@section('sidebar') @parent
This is the master sidebar. <p>This is appended to the master sidebar.</p>
@show @endsection
<div class="container"> @section('content')
@yield('content') <p>This is my body content.</p>
</div> @endsection
</body>
</html>
Laravel.com
Modelo
 Documentación
https://laravel.com/docs/5.5
 Directorio

ARTISAN
php artisan make:model Estudiante
php artisan make:model Model\Estudiante
php artisan make:model Model\Estudiante -m

use Illuminate\Notifications\Notifiable; MODEL MODEL


// continue code
use Illuminate\Database\Eloquent\SoftDeletes;
protected $table = 'estudiantes';
protected $primarykey = 'id';
class Estudiante extends Model
public $timestamps = true;
{
protected $fillable = [
use Notifiable;
'id', 'imagen', 'paterno', 'materno', 'nombres',
use SoftDeletes;
'telefono', 'direccion', 'fecha_nac',
// continue code
];
}

Laravel.com
Trabajando con bases de datos
 Configurar el archivo .env
CMD
copy .env.example .env
php artisan key:generate

.ENV .ENV
APP_NAME=Laravel
APP_NAME=Laravel
APP_ENV=local
APP_ENV=local
APP_KEY=base64:HMU5/JkS1MEqh3n2+GRBpp+hm95Yl
APP_KEY=
QhtqZdw/BMbwfE=
APP_DEBUG=true
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_LOG_LEVEL=debug
APP_URL=http://localhost
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_HOST=127.0.0.1
DB_PORT=3306
DB_PORT=3306
DB_DATABASE=homestead
DB_DATABASE=db_opencode
DB_USERNAME=homestead
DB_USERNAME=root
DB_PASSWORD=secret
DB_PASSWORD=system

Laravel.com
Tablas de ejemplo
Ejemplo 1 Ejemplo 2

Laravel.com
Migraciones
 Documentación
https://laravel.com/docs/5.5/migrations
 Directorio

php artisan make:migration create_estudiantes2_table ARTISAN


php artisan migrate
php artisan migrate:refresh
php artisan migrate:rollback
php artisan migrate:reset
public function up() MIGRATIONS //continue code
MIGRATIONS
{
$table->string('imagen',150)->nullable();
Schema::create('estudiantes', function (Blueprint $table) {
$table->string('paterno',25);
$table->increments('id');
$table->string('materno',25)->nullable();
//continue code
$table->string('nombres',50);
$table->integer('telefono')->nullable();
$table->timestamps();
$table->text('direccion');
});
$table->date('fecha_nac');
}
$table->timestamps();
$table->softDeletes();

Laravel.com
Migraciones
 Llaves foráneas en migraciones

MIGRATIONS
$table->foreign('estudiante_id')->references('id')->on('estudiantes')->onDelete('set null');
$table->foreign('estudiante_id')->references('id')->on('estudiantes')->onDelete('cascade');

Laravel.com
Migraciones Error
 Directorio

PROVIDER

use Illuminate\Support\Facades\Schema;

public function boot()


{
Schema::defaultStringLength(150);
}

Laravel.com
Seeders
 Documentación
https://laravel.com/docs/5.5/seeding
 Directorio

php artisan make:seeder EstudianteTableSeeder ARTISAN


php artisan db:seed
php artisan migrate:refresh --seed

SEEDER // continue code


SEEDER
\App\Model\Estudiante::create([
public function run() 'imagen' => 'perfil.jpg',
{ 'paterno' => 'Rocabado',
// continue code 'materno' => 'Valdez',
} 'nombres' => 'Lucho',
'telefono' => '69854785',
'direccion' => 'la paz el alto, av. juan pablo II',
'fecha_nac' => '2018-02-12',
]);

Laravel.com
Autenticación de usuarios
 Documentación
https://laravel.com/docs/5.5/authentication#authentication-quickstart
php artisan make:auth ARTISAN
php artisan migrate:refresh --seed
php artisan serve --host=192.168.0.20 --port=8282

Laravel.com
Integración de plantillas AdminLTE
 Documentación
https://adminlte.io/
ASSETS MENU
{{URL::asset(‘script.js')}}
{{URL::asset(‘style.css')}} <li class="@if(request()->is('home')) open @endif ">
{{URL::asset(‘img/perfil.jpg')}} <a href="{{url('home')}}"></a>
{{URL::asset(‘multimedia/play.mp4')}} </li>

Laravel.com
CRUD – Listar
 Documentación
https://laravel.com/docs/5.5/responses#other-response-types

ROUTE
Route::get('/estudiantes',‘Estudiante\EstudianteController@index');

// App\Http\Controllers\Estudiante; CONTROLLER VIEW


@foreach($estudiante as $estudiantes)
<tr>
public function index(){
<td>{{$estudiantes->nombres}}</td>
$estudiante = Estudiante::all();
<td>{{$estudiantes->paterno}}</td>
// return response()->json($estudiante);
<td>{{$estudiantes->materno}}</td>
// return view('pages.estudiante');
</tr>
return view('pages.estudiante' ,compact('estudiante')); @endforeach
}

Laravel.com
Paginación
 Documentación
https://laravel.com/docs/5.5/pagination

ROUTE
Route::get('/estudiantes',‘Estudiante\EstudianteController@index');

CONTROLLER VIEW
// App\Http\Controllers\Estudiante;

public function index() </table>
{ <div class="text-center">
// $estudiante = Estudiante::select('*')- {!!$estudiante->links()!!}
>orderBy('id','desc‘)->paginate(3); </div>
$estudiante = DB::table('estudiantes')->paginate(3);
return view('pages.estudiante',compact('estudiante'));
}

Laravel.com
CRUD – Crear
 Documentación
https://laravel.com/docs/5.5/queries#inserts
https://laravel.com/docs/5.5/eloquent-relationships#the-save-method
https://laravel.com/docs/5.5/eloquent-relationships#the-create-method
ROUTE
Route::post('/estudiantes',‘Estudiante\EstudianteController@store');

CONTROLLER VIEW
Estudiante::insert([
'nombres' => $request->input('nombres'),
]); // app/resources/views/pages/estudiante.blade.php

$estudiante = new Estudiante(); <form action="{{url('estudiantes')}}" method="POST">


$estudiante->nombres = $request->input('nombres'); {{csrf_field()}}
$estudiante->save(); <input type="text" name="nombres">
<button type="submit"> Registrar</button>
DB::table('estudiantes')->insert([ </form>
'nombres' => $request->input('nombres'),
]);

Laravel.com
Validaciones en el servidor
 Documentación
https://laravel.com/docs/5.5/validation
$this->validate($request, [ CONTROLLER VIEW
'nombres' => 'required|min:5‘, @if ($errors->any())
]); <div class="alert alert-danger">
<ul>
$this->validate($request, [ @foreach ($errors->all() as $error)
'nombres' => 'required|min:5', <li>{{ $error }}</li>
], [ @endforeach
'nombres.required' => 'El campo nombre es obligatorio. ', </ul>
'nombres.min' => 'El nombre debe tener al menos 5 </div>
caracteres. ', @endif
]);

public static $rules =[ MODEL


'nombres' => 'required|min:5',
];
public static $messages =[
'nombres.required' => 'El campo nombre es Obligatorio',
];

Laravel.com
Cambiando el idioma a español
 Documentación
https://github.com/Laraveles/spanish
 Directorio

 Configurar el idioma

app.php

'locale' => 'en', 'locale' => 'es',

Laravel.com
Validaciones en el front
 Documentación
http://www.formvalidator.net/
BLADE BLADE
<script src="{{URL::asset('jquery.form-validator.js')}}">
</script>
<div class="form-group">
<script> <label for="nombres">Nombres: </label>
$(window).load(function () { <input type="text" name="nombres" id="nombres"
$.validate({ class="form-control" data-sanitize="trim upper" data-
lang : 'es', validation="required, length" data-validation-
modules : 'sanitize, date, security, file, html5', length="min3">
}); </div>
});
</script>

Laravel.com
Mensajes Flash
 Documentación
https://laravel.com/docs/5.5/session#using-the-session

CONTROLLER VIEW
@if(Session::has('success'))
use Session; {{Session::get('success')}}
@endif
Session::flash('success', 'Registro agregado con exito!!!');
Session::flash('error', 'Error al insertar!!!'); @if(Session::has('error'))
{{Session::get('error')}}
@endif

Laravel.com
CRUD – Actualizar
 Documentación
https://laravel.com/docs/5.5/queries#updates
ROUTE
Route::get('/estudiantes/{id}/edit ','Estudiante\EstudianteController@edit');
Route::post('/estudiantes/{id} ','Estudiante\EstudianteController@update');

public function edit($id) CONTROLLER VIEW


{
$estudianteUpdate = Estudiante::find($id); <form action="{{ !isset($estudianteUp) ? url('/estudiantes') :
$estudiante = Estudiante::all(); url('/estudiantes/'.$estudianteUp->id) }}" method="POST">
return {{csrf_field()}}
view('pages.estudiante',compact('estudianteUp','estudiante' <input type="text" name="nombres" id="nombres"
)); class="form-control" value="{{ isset($estudianteUp) ?
} $estudianteUp->nombres : '' }}" data-sanitize="trim upper"
data-validation="required, length" data-validation-
public function update(Request $request, $id) length="min3">
{ </form>
DB::table('estudiantes')->where('id',$id)->update(array(
'nombres' => $request->input('nombres'), <td><a href="{{url('/estudiantes/'.$estudiantes-
'paterno' => $request->input('paterno'), >id.'/edit')}}">Editar</a></td>
'materno' => $request->input('materno'),
));
}

Laravel.com
CRUD – Eliminar
 Documentación
https://laravel.com/docs/5.5/queries#deletes
ROUTE
Route::get('/estudiantes/{id}/eliminar','Estudiante\EstudianteController@destroy');

CONTROLLER VIEW

public function destroy($id)


{ <td>
$estudiante = Estudiante::findOrFail($id); <a href="{{url('/estudiantes/'.$estudiantes-
$estudiante->delete(); >id.'/eliminar')}}"> Eliminar</a>
return redirect()- </td>
>action('Estudiante\EstudianteController@listarEstudiante')
->with('success','eliminado con exito');
}

Laravel.com
 Documentación
Middlewares
https://laravel.com/docs/5.5/middleware
 Directorio

ROUTE
Route::get('/estudiantes','Estudiante\EstudianteController@index')->middleware('auth');

public function __construct(){


CONTROLLER
$this->middleware('auth');
}

ARTISAN
php artisan make:middleware NameMiddleware

Laravel.com
Redireccionando a un usuario según su rol
ARTISAN
php artisan make:middleware AdminMiddleware

MIDDLEWARE Kernel.php
protected $routeMiddleware = [
public function handle($request, Closure $next) 'admin' =>
{ \App\Http\Middleware\AdminMiddleware::class,
if(auth()->user()->name == 'admin'){ ];
return $next($request);
}else{
return redirect('/home');
} ROUTE
Route::group(['middleware' =>
}
['auth','admin'],'namespace' => 'Estudiante'],function() {
Route::get('/estudiantes','EstudianteController@index');
});

Laravel.com
CRUD con AJAX - Listar
ROUTE
Route::get('estudiantes/estudianteDataAll','Estudiante\EstudianteController@estudianteDataAll');

public function estudianteDataAll(){


CONTROLLER JQUERY
$estudiante = Estudiante::select('*')- $('#estudiante-content').on('click','.pagination li
>orderBy('id','desc')->paginate(3); a',function(e){
return e.preventDefault();
view('pages.estudiante_data',compact('estudiante')); $.ajax({
} type: 'get',
url: $(this).attr('href'),
success: function (data) {
var listarEstudiante = function () { JQUERY $('#estudiante-content').empty().html(data);
$.ajax({ }
type: 'get', });
url: '/estudiantes/estudianteDataAll', });
dataType: 'html',
success: function (data) {
$('#estudiante-content').empty().append(data);
}
});
};

Laravel.com
CRUD con AJAX - Crear
ROUTE
Route::post('/estudiantes','Estudiante\EstudianteController@store')->name('estudiante.store');

CONTROLLER
public function store(Request $request)
{
if ($request->ajax())
{
$estudiante = new Estudiante();
$estudiante->nombres = $request->input('nombres');
$estudiante->paterno = $request->input('paterno');
$estudiante->materno = $request->input('materno');
$result = $estudiante->save();
if ($result) {
return response()->json(['success' => 'true']);
}else {
return response()->json(['success' => 'false']);
}
}
}

Laravel.com
CRUD con AJAX - Crear
SCRIPT

datatype: 'json',
$('#form-estudiante').submit(function (e) { processData: false,
e.preventDefault(); contentType: false,
$form = $(this); success: function (data) {
var route = "{{ route('estudiante.store') }}"; if (data.success) {
var token = $('input[name=_token]').val(); $('#form-estudiante').trigger('reset');
var data = new FormData(); listarEstudiante();
data.append('nombres', $('#form-estudiante console.log('insertado correctamente');
input:text[name=nombres]').val()); }
data.append('paterno', $('#form-estudiante },
input:text[name=paterno]').val()); error: function (data) {
data.append('materno', $('#form-estudiante $.each(data.responseJSON.errors, function (index,
input:text[name=materno]').val()); error) {
$.ajax({ console.log(error);
url: route, });
headers: {'X-CSRF-TOKEN': token}, }
type: 'post', });
data: data, });

};

Laravel.com
CRUD con AJAX - Actualizar
ROUTE
Route::get('/estudiantes/{id}/edit ','Estudiante\EstudianteController@edit');
Route::post('/estudiantes/{id}','Estudiante\EstudianteController@update');

public function edit($id)


CONTROLLER CONTROLLER
public function update(Request $request, $id)
{ {
$estudiante = Estudiante::find($id); if ($request->ajax())
return view('estudiante',compact('estudiante')); {
} $result = DB::table('estudiantes')->where('id',$id)-
>update(array(
'nombres' => $request->input('nombres'),
var editarEstudiante = function (id) {
SCRIPT 'paterno' => $request->input('paterno'),
var route = "{{url('/estudiantes')}}/"+id+'/edit'; 'materno' => $request->input('materno'),
$.get(route, function (data) { ));
$.each(data, function (i, full) { if ($result) {
$('#form-estudiante #updateEstudiante-id').val('update'); return response()->json(['success' => 'true']);
$("#form-estudiante input:hidden[name=estudiante-
}else {
id]").val(full.id);
return response()->json(['success' => 'false']);
$("#form-estudiante input:text[name=nombres]").val(full.nombres);
$("#form-estudiante input:text[name=materno]").val(full.materno); }
$("#form-estudiante input:text[name=paterno]").val(full.paterno); }
}); }
});
};

Laravel.com
CRUD con AJAX – Actualizar (CODIGO MEJORADO)
$('#form-estudiante').submit(function (e) { SCRIPT SCRIPT
else {
e.preventDefault();
var route = "{{ route('estudiante.store') }}";
$form = $(this);
$.ajax({
if (!$form.isValid()) return false;
url: route,
var token = $('input[name=_token]').val();
headers: {'X-CSRF-TOKEN': token},
if ($('#updateEstudiante-id').val()){
type: "POST",
var route = "{{ route('estudiante.update') }}";
data: new FormData($form[0]),
$.ajax({
dataType: 'json',
url: route,
processData: false,
headers: {'X-CSRF-TOKEN': token},
contentType: false,
type: "POST",
success: function (data) {
data: new FormData($form[0]),
if (data.success = true) {
dataType: 'json',
$('#estudianteModal').trigger('reset');
processData: false,
}
contentType: false,
},
success: function (data) {
error: function (data) {
if (data.success) {
$.each(data.responseJSON.errors, function (index, error) {
$('#updateEstudiante-id').val('');
console.log(error);
$('#form-estudiante').trigger('reset');
});
}
}
},
});
error: function (data) {
}
$.each(data.responseJSON.errors, function (index, error) {
});
console.log(error);
});
// if (data.status == 422) {
// console.clear();
// }
}
});

Laravel.com
}
CRUD con AJAX - Eliminar
ROUTE
Route::delete('/estudiantes/{id?}','Estudiante\EstudianteController@destroy')->name('estudiante.destroy');

var eliminarEstudiante = function (id) { SCRIPT CONTROLLER


var route = "{{url('estudiantes')}}/"+id;
var token = $('input[name=_token]').val();
$.ajax({
url:route, public function destroy($id)
headers: {'X-CSRF-TOKEN':token},
{
type: 'DELETE',
dataType : 'json', $estudiante = Estudiante::findOrFail($id);
success: function(data) $result = $estudiante->delete();
{ if ($result) {
if (data.success){ return response()->json(['success' => 'true']);
listarEstudiante(); }else {
}
return response()->json(['success' => 'false']);
},
error: function (data) }
{ }
if (data.error){
console.log('error al eliminar '+error);
}
}
});
};

Laravel.com
Plugins para el tratamiento de mensajes
 Documentación
https://kamranahmed.info/toast
https://craftpip.github.io/jquery-confirm/

Laravel.com
Subiendo una imagen con AJAX
 Documentación
http://image.intervention.io/
if ($request->file('imagen')) CONTROLLER
{
$this->validate($request,[
'imagen' => 'image|mimes:jpeg,bmp,png|max:2048',
],[
'imagen.image' => 'el archivo no tiene un formato valido de una imagen. ',
'imagen.max' => 'la imagen debe tener como maximo 2 MegaBytes. ',
'imagen.mimes' => 'el archivo debe tener formato tipo imagen, jpg, jpeg, png.
',
]);

$random = str_random(20);
$extension = $request->file('imagen')->getClientOriginalExtension();
$file_name = 'estudiante-'.$random.'.'.$extension;
$path = public_path('upload/images/'.$file_name);
Image::make($request->file('imagen'))->fit(300,300)->save($path);
}

if(data.imagen_portada_path){ SCRIPT
$('.image-profile').attr('style',"background: url({{url('images')}}/"+data.imagen_portada_path+"?"+
new Date().getTime()+")");
} Laravel.com
Discos en laravel (storage)
 Documentación
https://laravel.com/docs/5.5/filesystem
 Directorio

Filesystem.php
'disks' => [
'imagen' => [
'driver' => 'local',
'root' => storage_path('app/opencode/imagen'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
]

Laravel.com
Subiendo multimedia al Storage
$imagen_perfil = $request->file('imagen_perfil');
CONTROLLER
if ($imagen_perfil) {
$this->validate($request, [
'imagen_perfil' => 'image|mimes:jpeg,bmp,png|max:5120',
], [
'imagen_perfil.image' => 'El archivo no tiene un formato valido de una
imagen. ',
'imagen_perfil.max' => 'La imagen debe tener como maximo 5 MegaBytes. ',
'imagen_perfil.mimes' => 'El archivo debe tener formato tipo imagen, jpg,
jpeg, png. ',
]);

$random = str_random(20);
$extension = $imagen_perfil->getClientOriginalExtension();
$imagen_perfil_path = 'perfil_' . $random . '.' . $extension;
$image_fit = Image::make($imagen_perfil)->fit(240,240)->encode();
Storage::disk('images')->put($imagen_perfil_path, $image_fit);
}

Laravel.com
 Documentación
Helpers
https://laravel.com/docs/5.5/helpers
 Directorio

EstudiantePublic.php App.php
<?php 'aliases' => [
namespace App\Helpers; 'EstudiantePublic' =>
class PublicData App\Helpers\EstudiantePublic::class,
{ ]
public static function show()
{
$data = \App\Model\Estudiantes::first();
if(isset($data)){ BLADE
return $data;
}else return 'no data';
{{EstudiantePublic::show()->nombres}}
}
}

Laravel.com
Manejo de errores 404
 Documentación
https://laravel.com/docs/5.5/errors
 Directorio

Handler.php
public function render($request, Exception $exception)
{
if($this->isHttpException($exception)){
switch ($exception->getStatusCode()) {
case 404:
return response()->view('errors.404',[],404);
break;
case '500':
return response()->view('errors.500',[],500);
break;
default:
return $this->renderHttpException($exception);
break;
}
}
return parent::render($request, $exception);
}

Laravel.com
Eventos en laravel
 Documentación
https://laravel.com/docs/5.5/events
 Directorio

ARTISAN
php artisan make:event SessionEvent

Laravel.com
Manejo de roles y privilegios con spatie
 Documentación
https://github.com/spatie/laravel-permission

Laravel.com
DataTables
 Documentación
https://datatables.net/
http://yajrabox.com/docs/laravel-datatables/master
COMPOSER
composer require yajra/laravel-datatables-oracle:^8.0

CONTROLLER

return datatables()->of($data)->toJson();

Laravel.com
Restablecimiento de password
 Documentación
https://laravel.com/docs/5.5/passwords

.ENV

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

Laravel.com
Homestead
 Documentación
https://laravel.com/docs/5.5/homestead

Laravel.com
Las API REST
 Documentación
https://lumen.laravel.com/docs/5.7

Laravel.com
Subiendo proyecto laravel a un hosting
 Documentación
https://www.000webhost.com/

Laravel.com
GRACIAS

Laravel.com
Por: Clynroje
Email: roje.xdd@gmail.com
Wsp: 69888707

Laravel.com

También podría gustarte