تحية ، خابروفسك. تم كتابة المقالة التالية من قبل أحد قرائنا العاديين وبالتأكيد لا تدعي أنها مادة فاضحة ، ولكنها قد تكون بمثابة برنامج تعليمي للمبتدئين. نحن نتطلع لسماع رأيك حول المقالة في التعليقات ، ولمعرفة أكثر المتشددين ، ندعوك إلى دورة 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">
</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.