在Laravel上为远程命令创建待办事项

敬礼,哈布罗夫斯克。下面的文章是由我们的一位普通读者撰写的,并且绝对不声称它是硬核材料,但是它很适合作为初学者的教程。我们希望能在评论中听到您对本文的看法,有关更多核心知识的信息,我们邀请您参加我们的Framework Laravel课程




大家好!今天,在每个人都处于“远程”时间的情况下,我想创建一个简单的待办事项,您可以在其中创建自己的任务。这听起来像是Laravel官方文档中写的内容,以及它的方式-我以他们的待办事项为基础,对其进行了一些转换,而我的故事大部分将涉及如何创建管理员角色并创建另一个荒谬的克隆。特雷洛似乎很矛盾

建立基础




正如我所说,我们将以下一个指南为基础。它非常简单,比起对控制器和模型进行编程,它更侧重于处理迁移和路由。不幸的是,它没有从5.1版本进行更新,并且如果您刚刚开始在Laravel的最后7个版本上编程(它仅在3月3日才刚刚发布),则您不必将路由写入app/Http/routes.php,而是routes/web.php(在版本6之后已经改变了)。 ),总的来说,整个区别到此结束。最后,您应该获得如下内容:



我也将布局框架从引导程序更改为bulma。首先,我比较喜欢它,但是第二,我已经拥有刀片注册模板的代码库(尽管,另一方面,建立注册和授权页面非常简单,我将展示如何操作)。

该项目的版本可以下载这里的主分支(在新的分支,你可以下载完成的应用程序)。您可以使用以下命令激活它,前提是您已经安装了composer和laravel:

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

我们创建授权和注册

开箱即用的授权已从版本6更改。现在,为了快速创建,您需要安装一个可以快速生成控制器和刀片模板的软件包:

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

项目中应出现几个新文件:auth子文件夹将出现

resourses文件夹中,其中将包含专用于授权和密码的刀片模板文件。最初,刀片模板是由bootstrap组成的,但是,为了使CSS框架在项目中通用,我将它们稍微转换成bulma。但是,为了舒适地使用该网站,我们需要一个导航栏。在资源中,我创建了include文件夹,在其中放置了辅助文件headernav。为了不占用太多空间,我会说在标头中我只有一个带有bulma连接的头,并且在下面是: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>
 

我们开始创建我们的架构


现在该讨论我们项目的结构了。然后读者将能够将应用程序转换为他的需求,但是现在让我说,我希望该应用程序具有一个可以设置和删除任务的管理员(例如项目经理)以及可以查看这些命令的某种团队。当然,如果有人可以执行任务并指出是由他来执行任务,那将是非常不错的选择,但是稍后会介绍更多。

好的,所以我们将有两组用户,并同意只有获得访问权限的授权用户才能看到我们的任务板,并且某些超级管理员可以添加任务。让我们开始吧。

为了简化起见,我决定将应用程序分为两页:第一页上我们只能执行没有编辑功能的任务,第二页上只有超级管理员可以使用。我决定命名该团队可用的页面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>

此页面仅列出任务。为了显示它,我将在web.php中添加一个新路径:

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

我们将具有相同列表但具有编辑和添加功能的模板称为task.blade.php它太大了,所以我将它放在扰流板下面:

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



并且该模板与原始教程一样,扩展为app/layouts.blade.php

@include('includes.header')

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

    @yield('content')

</body>

</html>

精细!我们决定了外观,现在可以继续进行布线和创建我们的外观了middlewares

首先,让我们进入“ 用户”模型并添加新类型的用户:

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

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

接下来,转到用户表的最后一次迁移(数据库/ migrations文件夹),并添加具有我们新数据类型的列:

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

接下来,app/Http/Controllers/Auth/RegisterController.php仔细编辑一下create函数(在版本5中看起来也有所不同):

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


好的,那么我们需要为管理员创建中间件。最简单的方法是使用以下命令:

php artisan make:middleware IsAdmin

我希望你成功了。在该文件夹中,HTTP/middleware您应该已经出现isAdmin.php,其中的handle函数需要进行如下编辑:

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

接下来,我们需要注册的中间件app/HTTP/Kernel为了使用它:

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

我们将破折号路径转换为web.php,该路径只能看到超级管理员:

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

仍然需要为我们的管理员创建自定义控制器:

php artisan make:controller AdminController

编辑:

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

为了让所有获得准确的登记,不要忘了修复重定向RouteServiceProvider.phpapp/HTTP/Providers,因为它最初是专为家庭模式:

public const HOME = '/';

现在,只有在助手的帮助下,管理员才能出现在修补匠终端中:

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

就这样。如果您想尝试完成的应用程序,我将重复该链接。当然,我们的应用程序现在不能在生产中使用,因为在资源上注册的每个人都可以看到您的任务。但是您将如何限制访问?

也许您有公司邮件,然后可以在邮件验证中使用常规人员来限制对团队的访问。或者,您也可以通过类似的操作,以与管理员相同的方式添加团队成员资格检查。按照传统,我将为那些刚要精通Laravel的人提供一些有用的链接:

比关于迁移到Laravel的文档中的文章要详细得多
关于Laravel角色的有关Medium很好的文章
Laravel 7



« » Forge/Envoyer.



All Articles