قم بإنشاء todo لأمر بعيد على Laravel

تحية ، خابروفسك. تم كتابة المقالة التالية من قبل أحد قرائنا العاديين وبالتأكيد لا تدعي أنها مادة فاضحة ، ولكنها قد تكون بمثابة برنامج تعليمي للمبتدئين. نحن نتطلع لسماع رأيك حول المقالة في التعليقات ، ولمعرفة أكثر المتشددين ، ندعوك إلى دورة Framework Laravel الخاصة بنا .




تحية للجميع! اليوم ، في مثل هذا الوقت "البعيد" للجميع ، أود أن أقوم بإنشاء عمل بسيط يمكنك من خلاله إنشاء مهامك الخاصة. يبدو أن ما هو مكتوب في وثائق Laravel الرسمية ، والطريقة التي أعمل بها - أستخدم مهامهم كقاعدة ، وقم بتحويلها قليلاً ، وسيكون الجزء الأكبر من قصتي حول كيفية إنشاء دور مسؤول وإنشاء استنساخ آخر مثير للسخرية يبدو Trello غير متناسق للغاية .

إنشاء الأساس




كما قلت ، سنتخذ الدليل التالي كأساس . إنه بسيط للغاية ويركز على العمل مع عمليات الترحيل والتوجيه أكثر من التركيز على وحدات تحكم البرمجة والنماذج. لسوء الحظ ، لم يتم تحديثه من الإصدار 5.1 ، وإذا كنت قد بدأت للتو في البرمجة في Laravel على الإصدار 7 الأخير (كان حديثًا فقط في 3 مارس) ، فلن تضطر إلى كتابة التوجيه إلى app/Http/routes.php، ولكن إلى routes/web.php(هذا قد تغير بالفعل منذ الإصدار 6 ) ، وبشكل عام ، ينتهي الاختلاف كله هنا. في النهاية ، يجب أن تحصل على شيء مثل هذا:



لقد قمت أيضًا بتغيير إطار التخطيط من bootstrap إلى bulma. أولاً ، أنا أحب ذلك بشكل أفضل ، ولكن ثانيًا ، كان لدي بالفعل قاعدة التعليمات البرمجية لقوالب تسجيل الشفرة (على الرغم من أن بناء صفحات التسجيل والتفويض بسيط للغاية ، من ناحية أخرى ، سأوضح كيف).

يمكن تنزيل هذا الإصدار من المشروع هنا في الفرع الرئيسي (وفي الفرع الجديد يمكنك تنزيل التطبيق النهائي). يمكنك تنشيطه باستخدام الأوامر التالية ، بشرط أن يكون لديك مؤلفًا بالفعل وملحنًا مثبتًا:

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

نقوم بإنشاء التفويض والتسجيل

لقد تغيرت التفويضات خارج الصندوق من الإصدار 6. الآن للإنشاء السريع ، تحتاج إلى تثبيت حزمة يمكنها إنشاء وحدات تحكم وقوالب الشفرة بسرعة:

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

يجب أن تظهر العديد من الملفات الجديدة في المشروع: و المصادقة ستظهر فرعي

في resourses مجلد ، والتي سوف يكون هناك ملفات قالب شفرة مخصصة للترخيص، وكلمات السر. في البداية ، تم عمل قوالب الشفرة في bootstrap ، لكنني حولتها قليلاً إلى bulma للحفاظ على إطار css شائعًا في المشروع. ومع ذلك ، من أجل أن تكون مرتاحًا لاستخدام موقع الويب ، نحتاج إلى شريط تنقل. في الموارد، وما خلقت يتضمن مجلد ، والتي وضعت ملفات المساعدة - رأس و الملاحة . لكي لا تشغل مساحة كبيرة ، سأقول أنه في الرأس كان لدي رأس فقط مع اتصال بالما ، وكان ما يلي: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;
    //        
}

بعد ذلك ، انتقل إلى آخر عملية ترحيل لجدول المستخدمين (مجلد قاعدة البيانات / الترحيل) وأضف عمودًا بنوع البيانات الجديد لدينا:

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

بعد ذلك ، انتقل app/Http/Controllers/Auth/RegisterController.phpوتحرير وظيفة الإنشاء قليلاً (بدا أيضًا مختلفًا قليلاً في الإصدار 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في المجلد ، حيث تحتاج إلى تحرير وظيفة المقبض على النحو التالي:

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.phpإلى app/HTTP/Providersلأنه تم تصميمه في الأصل لنمط المنزل:

public const HOME = '/';

الآن يمكن للمسؤول أن يظهر فقط بمساعدة مساعدنا في محطة العبث:

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

هذا كل شئ. إذا كنت ترغب في تجربة التطبيق النهائي ، فسأكرر الرابط. بالطبع ، لا يمكن استخدام تطبيقنا في الإنتاج في الوقت الحالي ، لأن كل من سجل في المورد سيتمكن من رؤية مهامك. ولكن كيف ستقيد الوصول؟

ربما لديك بريد للشركات ، ومن ثم يمكنك تقييد الوصول إلى الفريق باستخدام النظامي في التحقق من صحة البريد. أو يمكنك إضافة شيك للعضوية في الفريق بنفس الطريقة التي يعمل بها المشرف ، بعد القيام بمعالجات مماثلة. بالتقليد ، سأقدم بعض الروابط المفيدة لأولئك الذين سيبدأون للتو في إتقان Laravel:

مقالة أكثر تفصيلًا قليلاً من الوثائق حول الترحيل إلى Laravel
مقال جيد عن الوسيط حول الأدوار في Laravel
Laravel 7



« » Forge/Envoyer.



All Articles