Crie um todo para um comando remoto no Laravel

Saudação, Khabrovsk. O artigo a seguir foi escrito por um de nossos leitores regulares e definitivamente não afirma ser um material explícito, mas pode muito bem servir como um tutorial para iniciantes. Esperamos ansiosamente sua opinião sobre o artigo nos comentários e, para um conhecimento mais aprofundado, convidamos você para o curso Framework Laravel .




Olá a todos! Hoje, em um momento tão "remoto" para todos, gostaria de criar a criação de um simples trabalho em que você pode criar suas próprias tarefas. Parece o que está escrito na documentação oficial do Laravel, e do jeito que está - eu uso o todo como base, o transformo um pouco, e a maior parte da minha história será sobre como criar uma função de administrador e criar outro clone ridículo O Trello parece muito inconsistente .

Crie a fundação




Como eu disse, tomaremos o próximo guia como base . É muito simples e se concentra mais em trabalhar com migrações e roteamento do que em programar controladores e modelos. Infelizmente, ele não foi atualizado a partir da versão 5.1 e, se você está apenas começando a programar no Laravel na última versão 7 (foi atualizada apenas em 3 de março), não precisará gravar o roteamento para app/Http/routes.php, mas para routes/web.php(isso já mudou desde a versão 6 ) e, em geral, toda a diferença termina aqui. No final, você deve obter algo parecido com isto:



Também mudei a estrutura de layout do bootstrap para o bulma. Em primeiro lugar, eu gosto mais, mas em segundo lugar, eu já tinha a base de código dos modelos de registro blade (embora, por outro lado, a criação das páginas de registro e autorização seja muito simples, mostrarei como).

Esta versão do projeto pode ser baixada aqui na ramificação principal (e na nova ramificação você pode baixar o aplicativo finalizado). Você pode ativá-lo usando os seguintes comandos, desde que você já tenha o composer e o laravel instalados:

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

Criamos autorização e registro

As autorizações prontas para uso foram alteradas da versão 6. Agora, para criação rápida, você precisa instalar um pacote que possa gerar rapidamente controladores e modelos de blade:

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

Vários novos arquivos devem aparecer no seu projeto: uma subpasta auth aparecerá

na pasta resourses , na qual haverá arquivos de modelo blade dedicados à autorização, senhas. Inicialmente, os modelos de blade foram criados no bootstrap , no entanto, eu os transformei em bulma para manter a estrutura css comum no projeto. No entanto, para se sentir confortável usando o site, precisamos de uma barra de navegação. Em recursos, criei a pasta includes , na qual coloquei os arquivos auxiliares - cabeçalho e nav . Para não ocupar muito espaço, direi que no cabeçalho eu tinha apenas uma cabeça com uma conexão bulma, e havia o seguinte: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>
 

Começamos a criar nossa arquitetura


É hora de discutir a estrutura do nosso projeto já. O leitor poderá transformar o aplicativo de acordo com suas necessidades, mas agora, digamos, quero que o aplicativo tenha um administrador (por exemplo, um gerente de projeto) que possa definir e excluir tarefas, e algum tipo de equipe que possa ver esses comandos. Claro, seria muito bom se alguém pudesse assumir tarefas e indicar que era ele quem as executaria, mas mais sobre isso mais tarde.

Tudo bem, teremos dois grupos de usuários e concordamos que apenas usuários autorizados que receberam acesso poderão ver nosso quadro de tarefas, e alguns superadministradores podem adicionar tarefas. Vamos começar.

Para simplificar, decidi dividir o aplicativo em duas páginas: uma na qual teremos apenas tarefas sem a capacidade de editar e a segunda, que estará disponível apenas para o superadministrador. Decidi nomear a página disponível para a equipe 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 lista apenas as tarefas. Para exibi-lo, adicionarei um novo caminho no web.php:

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

Um modelo no qual temos a mesma lista, mas com a capacidade de editar e adicionar, é chamado task.blade.php. É muito grande, então vou colocá-lo sob o 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



E este modelo, como o tutorial original, se expande para app/layouts.blade.php:

@include('includes.header')

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

    @yield('content')

</body>

</html>

Bem! Decidimos a aparência, agora podemos prosseguir com o roteamento e criar a nossa middlewares.

Primeiro, vamos entrar no modelo Usuários e adicionar novos tipos de usuários:

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

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

Em seguida, vá para a última migração da tabela de usuários (pasta banco de dados / migrações) e adicione uma coluna com nosso novo tipo de dados:

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

Em seguida, percorra app/Http/Controllers/Auth/RegisterController.phpe edite um pouco a função de criação (também parecia um pouco diferente na versão 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, precisamos criar nosso middleware para o administrador. A maneira mais fácil de fazer isso é com o seguinte comando:

php artisan make:middleware IsAdmin

Espero que você tenha conseguido. Na pasta HTTP/middlewarevocê deveria ter aparecido isAdmin.php, na qual a função de identificador precisa ser editada da seguinte maneira:

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

Em seguida, é preciso registrar o nosso middleware no app/HTTP/Kernelfim de usá-lo:

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

Transformamos o caminho do traço em web.php, que deve ser capaz de ver apenas o superadministrador:

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

Resta criar um controlador personalizado para nosso administrador:

php artisan make:controller AdminController

Edição:

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

A fim de ter o registro de todas ganhou exatamente, não se esqueça de corrigir o redirecionamento no RouteServiceProvider.phpa app/HTTP/Providersporque ele foi originalmente concebido para o padrão de casa:

public const HOME = '/';

Agora, o administrador pode aparecer apenas com a ajuda do nosso assistente no terminal do funileiro:

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

Isso é tudo. Se você quiser experimentar o aplicativo finalizado, repetirei o link. Naturalmente, nosso aplicativo não pode ser usado na produção no momento, porque todos os que se registraram no recurso poderão ver suas tarefas. Mas como você restringirá o acesso?

Talvez você tenha correio corporativo e, em seguida, você pode restringir o acesso à equipe usando regulares na validação de correio. Ou você pode adicionar uma verificação de participação na equipe da mesma maneira que o administrador, tendo feito manipulações semelhantes. Por tradição, fornecerei alguns links úteis para quem está começando a dominar o Laravel:

Um artigo um pouco mais detalhado do que na documentação sobre migrações para o Laravel
→ Um bom artigo no Medium sobre funções no Laravel
Laravel 7



« » Forge/Envoyer.



All Articles