Erstellen Sie eine Aufgabe für einen Remote-Befehl auf Laravel

Gruß, Chabrowsk. Der folgende Artikel wurde von einem unserer regelmäßigen Leser geschrieben und behauptet definitiv nicht, Hardcore-Material zu sein, kann aber durchaus als Tutorial für Anfänger dienen. Wir freuen uns auf Ihre Meinung zu dem Artikel in den Kommentaren und laden Sie für weitere Hardcore-Kenntnisse zu unserem Framework Laravel- Kurs ein .




Hallo alle zusammen! Heute, in einer so „abgelegenen“ Zeit für alle, möchte ich die Erstellung einer einfachen Aufgabe erkennen, in der Sie Ihre eigenen Aufgaben erstellen können. Es klingt wie das, was in der offiziellen Laravel-Dokumentation geschrieben steht und wie es ist - ich verwende ihre Aufgaben als Basis, transformiere sie ein wenig, und der Großteil meiner Geschichte wird sich damit befassen, wie man eine Administratorrolle erstellt und einen weiteren lächerlichen Klon erstellt Trello scheint sehr inkonsistent zu sein .

Erstellen Sie das Fundament




Wie gesagt, wir werden den nächsten Leitfaden als Grundlage nehmen . Es ist sehr einfach und konzentriert sich mehr auf die Arbeit mit Migrationen und Routing als auf die Programmierung von Controllern und Modellen. Leider wurde es nicht von Version 5.1 aktualisiert, und wenn Sie gerade mit dem Programmieren in Laravel auf der letzten 7-Version beginnen (es war erst am 3. März frisch), müssen Sie das Routing nicht auf schreiben app/Http/routes.php, sondern auf routes/web.php(dies hat sich bereits seit Version 6 geändert ), und im Allgemeinen endet der ganze Unterschied hier. Am Ende sollten Sie so etwas bekommen:



Ich habe auch das Layout-Framework von Bootstrap auf Bulma geändert. Erstens gefällt es mir besser, aber zweitens hatte ich bereits die Codebasis der Blade-Registrierungsvorlagen (obwohl das Erstellen der Registrierungs- und Autorisierungsseiten sehr einfach ist, werde ich zeigen, wie).

Diese Version des Projekts kann hier im Hauptzweig heruntergeladen werden (und im neuen Zweig können Sie die fertige Anwendung herunterladen). Sie können es mit den folgenden Befehlen aktivieren, sofern Sie bereits Composer und Laravel installiert haben:

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

Wir erstellen Autorisierung und Registrierung

Die Standardberechtigungen wurden von Version 6 geändert. Für eine schnelle Erstellung müssen Sie jetzt ein Paket installieren, mit dem Controller und Blade-Vorlagen schnell generiert werden können:

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

In Ihrem Projekt sollten mehrere neue Dateien angezeigt werden: Im

Ordner " resourses " wird ein Auth- Unterordner angezeigt , in dem sich Blade-Vorlagendateien für Autorisierung und Kennwörter befinden. Ursprünglich wurden die Blade-Vorlagen in Bootstrap erstellt , aber ich habe sie ein wenig in Bulma umgewandelt , um das im Projekt übliche CSS- Framework beizubehalten . Um die Website bequem nutzen zu können, benötigen wir jedoch eine Navigationsleiste. In den Ressourcen habe ich den Includes- Ordner erstellt , in dem ich die Zusatzdateien - Header und Navi - abgelegt habe . Um nicht viel Platz in Anspruch zu nehmen, werde ich sagen, dass ich in der Kopfzeile nur einen Kopf mit einer Bulma-Verbindung hatte und darin nav.blade.phpFolgendes war:

<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>
 

Wir beginnen unsere Architektur zu schaffen


Es ist Zeit, die Struktur unseres Projekts bereits zu diskutieren. Dann kann der Leser die Anwendung an seine Bedürfnisse anpassen, aber jetzt möchte ich, dass die Anwendung einen Administrator (z. B. einen Projektmanager) hat, der Aufgaben festlegen und löschen kann, und eine Art Team, das diese Befehle sehen kann. Natürlich wäre es sehr schön, wenn jemand Aufgaben übernehmen und darauf hinweisen könnte, dass er sie ausgeführt hat, aber dazu später mehr.

Okay, wir werden also zwei Benutzergruppen haben und uns einig sein, dass nur autorisierte Benutzer, denen Zugriff gewährt wurde, unser Task Board sehen können und einige Superadministratoren Aufgaben hinzufügen können. Lass uns anfangen.

Zur Vereinfachung habe ich beschlossen, die Anwendung in zwei Seiten aufzuteilen: eine, auf der wir nur Aufgaben haben, die nicht bearbeitet werden können, und die zweite, die nur dem Superadministrator zur Verfügung steht. Ich habe beschlossen, die dem Team zur Verfügung stehende Seite zu benennen 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>

Diese Seite listet nur die Aufgaben auf. Um es anzuzeigen, füge ich einen neuen Pfad in web.php hinzu:

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

Eine Vorlage, in der wir dieselbe Liste haben, die jedoch bearbeitet und hinzugefügt werden kann, wird aufgerufen task.blade.php. Es ist zu groß, also werde ich es unter den Spoiler legen:

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



Und diese Vorlage erweitert sich wie das ursprüngliche Tutorial auf app/layouts.blade.php:

@include('includes.header')

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

    @yield('content')

</body>

</html>

Fein! Wir haben uns für das Erscheinungsbild entschieden, jetzt können wir mit dem Routing und Erstellen unseres fortfahren middlewares.

Lassen Sie uns zunächst in das Benutzermodell gehen und neue Benutzertypen hinzufügen:

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

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

Wechseln Sie als Nächstes zur letzten Migration der Benutzertabelle (Datenbank- / Migrationsordner) und fügen Sie eine Spalte mit unserem neuen Datentyp hinzu:

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

Als nächstes gehen Sie durch app/Http/Controllers/Auth/RegisterController.phpund bearbeiten die Erstellungsfunktion ein wenig (sie sah auch in Version 5 etwas anders aus):

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


Ok, dann müssen wir unsere Middleware für den Administrator erstellen. Der einfachste Weg, dies zu tun, ist mit dem folgenden Befehl:

php artisan make:middleware IsAdmin

Ich hoffe es ist dir gelungen. In dem Ordner HTTP/middlewaresollten Sie erschienen sein isAdmin.php, in dem die Handle-Funktion wie folgt bearbeitet werden muss:

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

Als nächstes müssen wir unsere registrieren Middleware in app/HTTP/KernelOrdnung , es zu benutzen:

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

Wir transformieren den Strichpfad in web.php, der nur den Superadministrator sehen sollte:

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

Es bleibt noch ein benutzerdefinierter Controller für unseren Administrator zu erstellen:

php artisan make:controller AdminController

Bearbeitung:

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

Vergessen Sie nicht, die Weiterleitung RouteServiceProvider.phpzu korrigieren, um die Registrierung aller verdienten genau zu korrigieren , app/HTTP/Providersda sie ursprünglich für das Home-Muster entwickelt wurde:

public const HOME = '/';

Jetzt kann der Administrator nur noch mit Hilfe unseres Assistenten im Bastelterminal erscheinen:

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

Das ist alles. Wenn Sie die fertige Anwendung ausprobieren möchten, wiederhole ich den Link. Natürlich kann unsere Anwendung derzeit nicht in der Produktion verwendet werden, da jeder, der sich in der Ressource registriert hat, Ihre Aufgaben sehen kann. Aber wie werden Sie den Zugang einschränken?

Möglicherweise haben Sie Firmenpost, und dann können Sie den Zugriff auf das Team mithilfe von Stammkunden bei der E-Mail-Validierung einschränken. Oder Sie können auf die gleiche Weise wie der Administrator einen Scheck für die Mitgliedschaft im Team hinzufügen, nachdem Sie ähnliche Manipulationen vorgenommen haben. Traditionell werde ich einige nützliche Links für diejenigen bereitstellen, die gerade erst anfangen, Laravel zu beherrschen:

Ein etwas ausführlicherer Artikel als in der Dokumentation über Migrationen nach Laravel
→ Ein guter Artikel über Medien zu Rollen in Laravel
Laravel 7



« » Forge/Envoyer.



All Articles