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">
</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.php
e 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/middleware
você 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/Kernel
fim 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.php
a app/HTTP/Providers
porque 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.