Crear un todo para un comando remoto en Laravel

Saludo, Khabrovsk. El siguiente artículo fue escrito por uno de nuestros lectores habituales y definitivamente no pretende ser un material duro, pero puede servir como tutorial para un principiante. Esperamos con interés escuchar su opinión sobre el artículo en los comentarios, y para obtener más conocimientos, lo invitamos a nuestro curso de Framework Laravel .




¡Hola a todos! Hoy, en un momento tan "remoto" para todos, me gustaría distinguir la creación de una tarea simple en la que puedas crear tus propias tareas. Parece lo que está escrito en la documentación oficial de Laravel, y la forma en que está: uso su tarea como base, la transformo un poco, y la mayor parte de mi historia será sobre cómo crear un rol de administrador y crear otro clon ridículo Trello parece muy inconsistente .

Crea la base




Como dije, tomaremos la siguiente guía como base . Es muy simple y se centra más en trabajar con migraciones y enrutamiento que en controladores y modelos de programación. Desafortunadamente, no se actualizó desde la versión 5.1, y si recién está comenzando a programar en Laravel en la última versión 7 (solo estaba actualizada el 3 de marzo), no tendrá que escribir la ruta app/Http/routes.php, sino a routes/web.php(esto ya ha cambiado desde la versión 6 ), y en general, toda la diferencia termina aquí. Al final, deberías obtener algo como esto:



También cambié el marco de diseño de bootstrap a bulma. En primer lugar, me gusta más, pero en segundo lugar, ya tenía la base de código de las plantillas de registro de la hoja (aunque, por otro lado, construir las páginas de registro y autorización es muy simple, mostraré cómo).

Esta versión del proyecto se puede descargar aquí en la rama maestra (y en la nueva rama puede descargar la aplicación finalizada). Puede activarlo usando los siguientes comandos, siempre que ya tenga instalado Composer y Laravel:

composer install
//   .env,    .env example,     
php artisan key:generate //  
php artisan serve // 

Creamos autorización y registro

Las autorizaciones listas para usar han cambiado desde la versión 6. Ahora, para una creación rápida, necesita instalar un paquete que pueda generar rápidamente controladores y plantillas blade:

composer install laravel/ui
php artisan ui vue --auth
 

Deben aparecer varios archivos nuevos en su proyecto: aparecerá una subcarpeta de autenticación

en la carpeta de recursos , en la que habrá archivos de plantilla de hoja dedicados a autorizaciones, contraseñas. Inicialmente, las plantillas de la hoja estaban hechas en bootstrap , sin embargo, las transformé un poco en bulma para mantener el marco css común en el proyecto. Sin embargo, para estar cómodos usando el sitio web, necesitamos una barra de navegación. En recursos, creé el incluye carpeta , en la que puse los archivos auxiliares - cabecera y de navegación . Para no ocupar mucho espacio, diré que en el encabezado solo tenía una cabeza con una conexión bulma, y allí estaba lo siguiente:nav.blade.php

<nav class="navbar has-background-black-ter" role="navigation" aria-label="main navigation">
  <div class="navbar-brand">
    <a class="navbar-item has-text-white is-size-4" href="/">
      TODO
    </a>
    <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false">
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
    </a>
  </div>
  <div class="navbar-menu">
    <div class="navbar-start">
      @if (Auth::check())
      <button type="button" class="button is-primary">
        <!--   ,  ->   -->
        {{{ Auth::user()->name}}}
      </button>
      @else
      <!--    -->
      <a class="navbar-item has-text-danger" href="{{route('register')}}"></a>
      <a class="navbar-item has-text-danger" href="{{route('login')}}"></a>
      @endif
      @if (Auth::check())
      <!--  ,       -->
      <!--      -->

      <a class="navbar-item has-text-danger" href="{{url('/logout') }}" onclick="event.preventDefault();
                  document.getElementById('logout-form').submit();">
         </a>
      <form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
        {{ csrf_field() }}
      </form>

      @endif
      </ul>
    </div>

    <div class="navbar-end">
      <!-- navbar items -->
    </div>
  </div>
</nav>
 

Comenzamos a crear nuestra arquitectura.


Es hora de discutir la estructura de nuestro proyecto ya. Luego, el lector podrá transformar la aplicación a sus necesidades, pero ahora, digamos, quiero que la aplicación tenga un administrador (por ejemplo, un gerente de proyecto) que pueda establecer y eliminar tareas, y algún tipo de equipo que pueda ver estos comandos. Por supuesto, sería bastante bueno si alguien pudiera realizar tareas e indicar que fue él quien las realizó, pero más adelante eso.

Bien, entonces tendremos dos grupos de usuarios y aceptaremos que solo los usuarios autorizados a los que se les haya dado acceso puedan ver nuestro tablero de tareas, y algunos súper administradores pueden agregar tareas. Empecemos.

Para simplificar un poco, decidí dividir la aplicación en dos páginas: una en la que solo tendremos tareas sin la posibilidad de editar, y la segunda, que estará disponible solo para el súper administrador. Decidí nombrar la página disponible para el equipo welcome.blade.php:

@include('includes.header')

<body>
    @include('includes.nav')
    <div class="columns is-centered">
        <div class="column is-half">
            <div class="panel">
                <div class="panel-heading">
                     
                </div>

                <div class="panel-body">
                    @foreach ($tasks as $task)
                    <a class="panel-block">
                        <button class="button is-rounded">
                            <span>{{ $task->name }}</span>
                        </button>
                        @endforeach
                </div>
            </div>
        </div>
    </div>
<body>
</html>

Esta página solo enumera las tareas. Para mostrarlo, agregaré una nueva ruta en web.php:

Route::get('/', function () {
    return view('welcome', [
        'tasks' => Task::orderBy('created_at', 'asc')->get(),
    ]);
});

Se llama a una plantilla en la que tenemos la misma lista, pero con la capacidad de editar y agregar task.blade.php. Es demasiado grande, así que lo colocaré debajo del spoiler:

task.blade.php
@extends('layouts.app')

@section('content')
<div class="columns is-centered">
    <div class="column is-half">
        <div class="panel">
            <div class="panel-heading">
                 
            </div>
            <div class="panel-block">
                @include('common.errors')
                <!--     -->
                <form action="{{ url('task')}}" method="POST">
                    {{ csrf_field() }}

                    <div class="field">
                        <label for="task-name" class="label is-medium"></label>
                        <input type=" text" name="name" id="task-name" class="input is-medium"
                            value="{{ old('task') }}">
                    </div>

                    <div class="field">
                        <button type="submit" class="button is-success">
                            <span class="icon">
                                <i class="fa fa-btn fa-plus">
                            </span></i>
                            <span> </span>
                        </button>
                    </div>
                </form>
            </div>
        </div>

        <!-- Current Tasks -->
        @if (count($tasks) > 0)
        <div class="panel">
            <div class="panel-heading">
                 
            </div>

            <div class="panel-body">
                {{-- <table class="table table-striped task-table">
                    <thead>
                        <th></th>
                        <th> </th>
                    </thead>
                    <tbody> --}}
                @foreach ($tasks as $task)
                <a class="panel-block">
                    <button class="button is-rounded">
                    <span>{{ $task->name }}</span>
                </button>
                    <form action="{{ url('task/'.$task->id) }}" method="POST">
                        {{ csrf_field() }}
                        {{ method_field('DELETE') }}
                        <button type="submit" class="button is-danger">
                            <span class="icon is-small"> <i class="fa fa-btn fa-trash"></i></span>
                            <span>  </span>
                        </button>
                    </form>
                </a>
                @endforeach
            </div>
        </div>
        @endif
    </div>
</div>
@endsection



Y esta plantilla, como el tutorial original, se expande a app/layouts.blade.php:

@include('includes.header')

<body>
    @include('includes.nav')

    @yield('content')

</body>

</html>

¡Multa! Decidimos sobre la apariencia, ahora podemos proceder al enrutamiento y crear el nuestro middlewares.

Primero, veamos el modelo Usuarios y agreguemos nuevos tipos de usuarios:

const ADMIN_TYPE = 'admin';
const TEAM_TYPE = 'team';
#       :

public function isAdmin(){        
    return $this->type === self::ADMIN_TYPE;
    //        
}

A continuación, vaya a la última migración de la tabla de usuarios (base de datos / carpeta de migraciones) y agregue una columna con nuestro nuevo tipo de datos:

$table->string('type')->default('team');
//  ,         

A continuación, revise app/Http/Controllers/Auth/RegisterController.phpy edite un poco la función de creación (también se veía un poco diferente en la versión 5):

protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'type' => User::TEAM_TYPE,  
        ]);
    }


Ok, entonces necesitamos crear nuestro middleware para el administrador. La forma más fácil de hacer esto es con el siguiente comando:

php artisan make:middleware IsAdmin

Espero que hayas tenido éxito. En la carpeta HTTP/middlewareque debería haber aparecido isAdmin.php, en la que la función de manejo debe editarse de la siguiente manera:

public function handle($request, Closure $next)
    {
        if(auth()->user()->isAdmin()) {
            return $next($request);
        //   , .   -   
    }
        return redirect('/');
    }

A continuación, tenemos que registrar nuestro middleware en app/HTTP/Kernelel fin de utilizarlo:

protected $routeMiddleware = [
    #  ,      
        is_admin' => \App\Http\Middleware\IsAdmin::class,
];

Transformamos la ruta del guión en web.php, que solo debería poder ver el súper administrador:

Route::get('/dash', function () {
    return view('tasks', [
        'tasks' => Task::orderBy('created_at', 'asc')->get(),
    ]); 
})
->middleware('is_admin')    
->name('admin');

#       

Auth::routes();
Route::post('/logout', 'Auth\LoginController@logout')->name('logout');

Queda por crear un controlador personalizado para nuestro administrador:

php artisan make:controller AdminController

Edición:

public function __construct()
    {
        $this->middleware('auth');
    }
    public function admin()
    {
        return view('admin');
    }
 

Con el fin de obtener el registro de todas ganado exactamente, no se olvide de fijar la redirección en RouteServiceProvider.phpque app/HTTP/Providersya que fue diseñado originalmente para el patrón de la casa:

public const HOME = '/';

Ahora el administrador solo puede aparecer con la ayuda de nuestro asistente en la terminal de tinker:

php artisan tinker
use App\User;
User::where('email', 'admin@mail.com')->update(['type' => 'admin']);
//    

Eso es todo. Si desea probar la aplicación finalizada, repetiré el enlace. Por supuesto, nuestra aplicación no se puede usar en producción en este momento, porque todos los que se han registrado en el recurso pueden ver sus tareas. Pero, ¿cómo va a restringir el acceso?

Quizás tenga correo corporativo, y luego puede restringir el acceso al equipo utilizando clientes habituales en la validación de correo. O puede agregar un cheque para la membresía en el equipo de la misma manera que el administrador, después de haber hecho manipulaciones similares. Por tradición, proporcionaré algunos enlaces útiles para aquellos que solo van a comenzar a dominar Laravel:

Un artículo un poco más detallado que en la documentación sobre migraciones a Laravel
→ Un buen artículo sobre Medium sobre roles en Laravel
Laravel 7



« » Forge/Envoyer.



All Articles