Créer une tâche pour une commande à distance sur Laravel

Salut, Khabrovsk. L'article suivant a été écrit par l'un de nos lecteurs réguliers et ne prétend certainement pas être du matériel hardcore, mais il pourrait bien servir de tutoriel pour un débutant. Nous sommes impatients d'entendre votre avis sur l'article dans les commentaires, et pour plus de connaissances hardcore, nous vous invitons à notre cours Framework Laravel .




Bonjour à tous! Aujourd'hui, dans un temps si «lointain» pour tout le monde, je voudrais distinguer la création d'une simple tâche dans laquelle vous pouvez créer vos propres tâches. Cela ressemble à ce qui est écrit dans la documentation officielle de Laravel, et la façon dont il est - j'utilise leur todo comme base, le transforme un peu, et l'essentiel de mon histoire sera de savoir comment créer un rôle d'administrateur et créer un autre clone ridicule Trello semble très incohérent .

Créer la fondation




Comme je l'ai dit, nous prendrons le prochain guide comme base . Il est très simple et se concentre davantage sur l'utilisation des migrations et du routage que sur la programmation des contrôleurs et des modèles. Malheureusement, il n'a pas été mis à jour depuis la version 5.1, et si vous commencez tout juste à programmer dans Laravel sur la dernière version 7 (il n'était récent que le 3 mars), vous n'aurez pas à écrire le routage vers app/Http/routes.php, mais vers routes/web.php(cela a déjà changé depuis la version 6 ), et en général, toute la différence se termine ici. En fin de compte, vous devriez obtenir quelque chose comme ceci:



J'ai également changé le cadre de mise en page de bootstrap à bulma. Premièrement, je l'aime mieux, mais deuxièmement, j'avais déjà la base de code des modèles d'enregistrement de lame (bien que, d'autre part, la création des pages d'enregistrement et d'autorisation soit très simple, je montrerai comment).

Cette version du projet peut être téléchargée ici dans la branche master (et dans la nouvelle branche vous pouvez télécharger l'application terminée). Vous pouvez l'activer en utilisant les commandes suivantes, à condition que vous ayez déjà installé composer et laravel:

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

Nous créons l'autorisation et l'enregistrement

Les autorisations prêtes à l'emploi ont changé par rapport à la version 6. Maintenant, pour une création rapide, vous devez installer un package capable de générer rapidement des contrôleurs et des modèles de lame:

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

Plusieurs nouveaux fichiers devraient apparaître dans votre projet: un sous-dossier d' authentification apparaîtra

dans le dossier resourses , dans lequel il y aura des fichiers de modèle de lame dédiés à l'autorisation, des mots de passe. Initialement, les modèles de lames étaient constitués en bootstrap , cependant, je les ai transformés un peu en bulma pour garder le framework css commun dans le projet. Cependant, pour être à l'aise avec l'utilisation du site Web, nous avons besoin d'une barre de navigation. Dans les ressources, j'ai créé le dossier includes , dans lequel j'ai placé les fichiers auxiliaires - en- tête et nav . Afin de ne pas prendre beaucoup de place, je dirai que dans l'en-tête je n'avais qu'une tête avec une connexion bulma, et était la suivante: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>
 

Nous commençons à créer notre architecture


Il est déjà temps de discuter de la structure de notre projet. Le lecteur pourra alors transformer l'application en fonction de ses besoins, mais maintenant, disons, je veux que l'application ait un administrateur (par exemple, un chef de projet) qui peut définir et supprimer des tâches, et une sorte d'équipe qui peut voir ces commandes. Bien sûr, ce serait bien que quelqu'un puisse prendre des tâches et indiquer que c'est lui qui les exécute, mais plus à ce sujet plus tard.

D'accord, cela signifie que nous aurons deux groupes d'utilisateurs et que nous convenons que seuls les utilisateurs autorisés qui ont été autorisés à accéder à notre tableau des tâches, et certains super administrateurs peuvent ajouter des tâches. Commençons.

Pour une petite simplification, j'ai décidé de diviser l'application en deux pages: une sur laquelle nous n'aurons que des tâches sans possibilité de modification, et la seconde, qui ne sera disponible que pour le super administrateur. J'ai décidé de nommer la page disponible pour l'équipe 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>

Cette page répertorie uniquement les tâches. Pour l'afficher, j'ajouterai un nouveau chemin dans web.php:

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

Un modèle dans lequel nous avons la même liste, mais avec la possibilité de modifier et d'ajouter, est appelé task.blade.php. Il est trop grand, je vais donc le placer sous le 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



Et ce modèle, comme le didacticiel d'origine, se développe comme suit app/layouts.blade.php:

@include('includes.header')

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

    @yield('content')

</body>

</html>

Bien! Nous avons décidé de l'apparence, nous pouvons maintenant procéder au routage et à la création de la nôtre middlewares.

Tout d'abord, passons au modèle Utilisateurs et ajoutons de nouveaux types d'utilisateurs:

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

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

Ensuite, accédez à la dernière migration de la table des utilisateurs (dossier base de données / migrations) et ajoutez une colonne avec notre nouveau type de données:

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

Ensuite, parcourez app/Http/Controllers/Auth/RegisterController.phpet modifiez un peu la fonction de création (elle avait également l'air un peu différente dans la version 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, alors nous devons créer notre middleware pour l'administrateur. Pour ce faire, la méthode la plus simple consiste à utiliser la commande suivante:

php artisan make:middleware IsAdmin

J'espère que vous avez réussi. Dans le dossier que HTTP/middlewarevous auriez dû apparaître isAdmin.php, dans lequel la fonction de poignée doit être modifiée comme suit:

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

Ensuite, nous devons inscrire notre middleware en app/HTTP/Kernelvue de l' utiliser:

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

Nous transformons le chemin du tiret en web.php, qui ne devrait pouvoir voir que le super administrateur:

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');

Il reste à créer un contrôleur personnalisé pour notre administrateur:

php artisan make:controller AdminController

Montage:

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

Pour que l'enregistrement de tous gagné exactement, ne pas oublier de fixer la redirection dans RouteServiceProvider.phpla app/HTTP/Providersparce qu'il a été conçu à l' origine pour le modèle de la maison:

public const HOME = '/';

Maintenant, l'administrateur ne peut apparaître qu'avec l'aide de notre assistant dans le terminal de bricolage:

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

C'est tout. Si vous voulez essayer l'application terminée, je vais répéter le lien. Bien sûr, notre application ne peut pas être utilisée en production pour le moment, car tous ceux qui se sont inscrits sur la ressource pourront voir vos tâches. Mais comment allez-vous restreindre l'accès?

Peut-être que vous avez du courrier d'entreprise, puis vous pouvez restreindre l'accès à l'équipe en utilisant des habitués dans la validation du courrier. Ou vous pouvez ajouter une vérification de l'appartenance à l'équipe de la même manière que l'administrateur, après avoir effectué des manipulations similaires. Par tradition, je fournirai quelques liens utiles pour ceux qui vont commencer à maîtriser Laravel:

Un article un peu plus détaillé que dans la documentation sur les migrations vers Laravel
→ Un bon article sur Medium sur les rôles dans Laravel
Laravel 7



« » Forge/Envoyer.



All Articles