انشاء نظام تسجيل دخول يدوي في لارافل باستخدام دالة attempt

انشاء نظام تسجيل دخول يدوي في لارافل باستخدام دالة attempt

يأتي اطار عمل لارافل بالكثير من الأنظمة الجاهزة للاستخدام دون الحاجة الى الكثير من العمل , فبمجرد سطر بسيط في سطر الأوامر قد تجد أنك قمت بانشاء ما كنت تحتاج سابقاً ساعات لانشائه باستخدام لغة ال PHP وحدها , وهذه هي الميزة الأساسية من استخدام أطر العمل المتقدمة كلارفل , وكي نبقى ضمن سياق مقالنا فسنأخذ مثال بسيط على كيفية تسهيل لارافل للأمور , يأتي لارافل بنظام أعضاء متكامل جاهز للاستخدام , وعند الحديث عن الأنظمة المتكاملة فنحن نقصد جميع خواص النظام , فنظام لارافل للأعضاء يمكن تمكينه عبر أمر واحد في سطر الأوامر و هو :

php artisan make:auth

نعم , الأمر فعلاً بهذه البساطة ! بعد أن تقوم بكتابة هذا الأمر سيقوم اطار عمل لارافل تلقائياً بانشاء جميع الملفات التي يحتاجها موقعك لعملية تسجيل الدخول وحفظ الأعضاء بالموقع من ملفات Views و Controller و حتى Models و Migrations ! 

اذاً تأتي الخطوة التالية بتفعيل ال Migrations عبر الأمر التالي : 

php artisan migrate

الآن , أصبح لديك نظام أعضاء متكامل يشمل عملية تسجيل الدخول و الخروج , انشاء أعضاء واعادة تعيين كلمة المرور , لكن هناك أيضاً طريقة أخرى لعمل ذلك ! يمكنك عمل ذلك يدوياً عبر دالة attempt.

مقال مرتبط : ما هو لارفل Laravel ؟ تعرف على أهم اطار عمل ل لغة php

استخدام دالة attempt لانشاء نظام أعضاء يدوي في لارافل

لنبدأ من الصفر , سنقوم بانشاء مشروع لارافل جديد , ستكون الفكرة منه تجربة دالة attempt فقط , يمكنك استخدام مشروع موجود مسبقاً أيضاً فالأمر يعود لك في النهاية , لانشاء مشروع جديد فلنكتب الأمر التالي في سطر الأوامر

laravel new ProjectName

سيقوم هذا الأمر بانشاء مشروع لارافل, لاحظ أننا نعتمد على أنك قمت مسبقاً بتنصيب لارافل على جهازك ويمكنك الان استخدام الأمر laravel new , لو ظهر لك أي خطأ يمكنك تنصيب لارافل على جهازك بشكل عمومي عبر الأمر التالي:

"composer global require "laravel/installer=~1.1

اما ان كنت لا ترغب بتنصيب لارافل على جهازك , فعليك اذاً انشاء مشروع لارافل جديد مباشرة عبر كمبوزر Composer عبر الأمر التالي في سطر الأوامر:

composer create-project --prefer-dist laravel/laravel blog

مقال مرتبط : ما هو Composer ؟ تعرف عليه و على طرق استعماله

بعد الانتهاء من تنصيب المشروع سنبدأ الآن العمل الحقيقي , سنبدأ بانشاء كونترولر ليدير نظام الأعضاء كاملاً ولنسميه AuthController عبر الأمر التالي في سطر الأوامر :

php artisan make:controller AuthController

الآن لنجهز ال Model الخاص بالمستخدمين , لنسميه Users , لاحظ أنه قد تجد Model جاهز يأتي مع تنصيب المشروع يمكنك استخدامه بالتأكيد , اما ان لم تجده وهو أمر مستبعد يمكنك انشائه عبر سطر الأوامر , سننشئ Model و اضافة اليه Migration لادارة جدول قاعدة البيانات و انشائه , يمكننا ذلك عبر الأمر التالي في سطر الأوامر :

php artisan make:model Users -m

وكما الأمر بالنسبة لل Model , غالباً يوجد Migration جاهزة لجدول المستخدمين يمكنك التعديل عليها , في حال وجدت Model و Migration فالخطوة السابقة لا داع لها.

ولنتوجه أيضاً الى ملف التوجيهات Routes الموجود في المسار التالي في مشروعك : routes/web.php وقم بانشاء مسار جديد لعرض صفحة انشاء مستخدم جديد , ومسار اخر لعرض صفحة تسجيل الدخول , كما سنقوم بانشاء مسارات من نوع POST لادارة العمليات خلف الكواليس

Route::view('/signup' , 'your.view.path')->name('auth.signup');
Route::post('/signup' , '[email protected]')->name('auth.signup.post');
Route::view('/login' , 'your.view.path')->name('auth.login');
Route::post('/login' , '[email protected]')->name('auth.login.post');

أما بخصوص ال Views فهي فكرة تصميمية بحتة , يمكنك فعلياً وضع ما تريد هناك بالنسبة للتصميم , لكن من المهم ادراك نقطة واحدة وهي وضع عنصر

ووضع action يؤدي الى المسار الصحيح , مع مراعاة تسمية الحقول تماماً كما اسميت الحقول في قاعدة البيانات كي نستطيع استخدام دالة create على ال Model لتسهل علينا عملية انشاء مستخدم جديد , ولا تنسى طبعاً اضافة حقل لل CSRF Token حتى لا تواجه صفحة خطأ 419 في لارافل , يمكنك اضافة هذا الحقل عبر كتابة @csrf في ال form بالشكل التالي :

@csrf

انشاء مستخدم جديد في لارافل

لنبدأ بتفعيل عملية انشاء مستخدم جديد , سنستخدم الدالة create التي تأتي مع ال Model مضمنة تلقائياً , ولنستطيع استخدام هذه الميزة علينا تفعيل ميزة في ال Model تسمى Mass Assigment , يمكننا ذلك عبر اضافة الكود التالي الى ال Model الخاص بنا :

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model{
    protected $fillable= ['email' , 'password' , 'name' , 'username' , '..' , '..']; //This Allow only this Fields to be Mass Assigned
    protected $guarded= []; //Or This : Allow All Fields to be Mass Assigned
}

الان نستطيع استخدام دالة create على هذا ال Model , سنبدأ الآن بكتابة الأوامر اللازمة لتفعيل عملية انشاء حساب جديد , قبل البدء تأكد من أنك قد نصبت قاعدة البيانات وربطتها بالتطبيق بشكل صحيح وقمت بعمل Migrate للملفات لديك , سنبدأ الان بكتابة الأكواد المخصصة لانشاء مستخدم جديد , وسنفترض أن قاعدة البيانات الخاصة بي تحتوي جدول للمستخدمين فيه بريد الكتروني و كلمة سر و اسم للمستخدم فقط لتسهيل الأمور , لكن يمكنك اضافة ما تشاء من الحقول بنفس الفكرة و الطريقة تماماً.

في ملف App/http/controllers/AuthController.php سنكتب الكود التالي : 

<?php

namespace App\Http\Controllers; //Namespace The File
use Validator; //Use The Validator Facade to validate the request
use Hash; // Use The Hash Facade to hash the password
use Illuminate\Http\Request; // Use The Request Facade to handle form requests
use App\User; //Use The User Model

class AuthController extends Controller{

    //Proccess The signup
    public function postSignup(Request $r){
        //Validate the request
        $NewsletterEmailRules = [
            'name' => 'required|min:2|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required',
        ];
        $ValidatorErros = [
            'name.required' => 'يرجى ادخال اسم المستخدم' ,
            'name.min' => 'يجب أن يكون الاسم حرفين على الأقل',
            'name.max' => 'لا يمكن أن يزيد الاسم عن 255 حرف',
            'email.required' => 'يرجى ادخال بريدك الإلكتروني' ,
            'email.email' => 'يجب أن تدخل بريد الكتروني صحيح',
            'email.unique' => 'البريد الإلكتروني مسجل مسبقاً , جرب تسجيل الدخول ',
            'password.required' => 'لا يمكن لحقل كلمة المرور أن يكون فارغاً',
        ];
        $validatedData = Validator::make( $r->all(), $NewsletterEmailRules, $ValidatorErros );
        if($validatedData->fails()){
            return back()->withErrors($validatedData->errors()->all());
        }else{
            $HashedPassword = Hash::make($r->password); //Make The Password Hashed
            $User = User::create($r->except('_token'));
            return back()->withSuccess('تم انشاء المستخدم بنجاح!');        
        }
    }

}

كما نجد في الكود السابق , لا يوجد الكثير من الأمور الغريبة هنا معظمها أساسيات لارافل , ربما هناك 3 نقاط مثيرة للاهتمام في الكود السابق وهي :

1- تشفير كلمة المرور

يستخدم لارافل Facade يسمى Hash لانشاء كلمات مرور مشفرة , فعلياً يستخدم لأغراض التشفير عموماً , ولكي نستطيع استخدامه قمنا باستدعائه في بداية الملف باستخدام الكود : use Hash , اما الاستخدام الفعلي له كان في السطر التالي :

$HashedPassword = Hash::make($r->password);

بفضل هذا السطر , يحتوي الآن المتغير $HashedPassword كلمة المرور التي أدخلها المستخدم لكنها مشفرة بشكل صحيح لنستطيع استخدمها في تسجيل الدخول , كما انه يعتبر شيئ ممتاز حفظ كلمات المرور بشكل مشفر في قاعدة البيانات بدلاً من حفظها كنصوص مباشرة.

2- التأكد من أن المدخلات صحيحة

يمكننا ذلك دائماً عبر استخدام Validator في بداية الكود use Validator ومن ثم استخدامه في فلترة المدخلات , ومن الأمور المميزة في لارافل أنه يمكنك ادخال قاعدة تقضي بأن لا يتكرر البريد الإلكتروني وهي عبر السطر التالي :

'email' => 'required|email|unique:users,email',

كما ترى , يقصد بهذا السطر أن حقل ال email حقل لا يسمح بتكراره , فلو فرضاً تم ادخال بريدك الكتروني موجود مسبقاً سيظهر رسالة خطأ :

'email.unique' => 'البريد الإلكتروني مسجل مسبقاً , جرب تسجيل الدخول ',

3- استخدام دالة create في ال Model

من أكثر الدوال المميزة في لارافل ربما , ببساطة تعمل كالتالي : تقوم بمقارنة ال Request بحقول قاعدة البيانات وتضيف كل حقل الى الحقل المناسب له بطريقة سحرية , كل ما عليك هو تسمية الحقول بنفس أسماء الحقول في قاعدة البيانات وستتم المطابقة تلقائياً , على الرغم من ذلك لا بد من التأكد بالسماح بعملية ال Mass Assigment و الا سيظهر لك رسالة خطأ.

اذاً , لقد قمنا بانشاء عملية انشاء مستخدم جديد بنجاح ! يمكنك أن تطور من النظام الخاص بك بكل حرية فمثلاً يمكنك اضافة فكرة ارسال بريد الكتروني ترحيبي للمستخدم الجديد مباشرة بعد حفظه في قواعد البيانات , أو يمكنك ارسال اشعار لمدير الموقع بوجود مستخدم جديد , الأفكار لا تنتهي و التنفيذ يعتمد على متطلبات مشروعك.

انشاء عملية تسجيل الدخول اليدوية في لارافل

الآن , بعد أن قمنا بانشاء مستخدم جديد علينا البدء بالسماح له بتسجيل الدخول الى موقعنا , هنا يأتي دور الدالة attempt وسنشرح طريقة استخدمها الآن...

في ملف App/http/controllers/AuthController.php سنكتب الكود التالي : 

public function postLogin(Request $r){
    if(auth()->attempt(['email' => $r->email , 'password' => $r->password] , true)){
            return redirect()->route('admin.home');
    }else{
           return back()->withErrors('معلومات الدخول غير صحيحة');
     }
 }

تتطلب دالة attempt بريد الكتروني و كلمة المرور لتسجيل الدخول , لاحظ هنا أنه يجب أن يكون اسم الحقول في قاعدة البيانات email , password , أما بالنسبة للقسم الثاني من الدالة و هو true , ,الهدف منه هو حفظ تسجيل الدخول , القيمة التلقائية له هي False ويعني أنه بمجرد انتهاء الجلسة سيتم تسجيل خروج المستخدم , اما في حالة true فسيقى المستخدم مسجلاً للدخول حتى يقوم بتسجيل الخروج يدوياً , و ملاحظة مهمة هنا , لاحظ أننا قمنا بارسال قيمة كلمة السر دون أن نقوم بتشفيرها كما فعلنا في عملية انشاء مستخدم جديد , وذلك لأن الدالة attempt تقوم بتشفير كلمة المرور تلقائياً , وملاحظة أخرى مهمة هنا من الضروري أن يكون اسم حقل كلمة المرور password , لا يمكنك تغيير الاسم الى passcode أو اي اسم آخر الا اذا كنت ترغب في التعمق في اعدادت لارافل الجوهرية وتغييرها لما يناسبك.

بالنسبة لمخرجات الدالة , ففي حالة أن المعلومات صحيحة دالة attempt ستعيد قيمة true , و العكس صحيح.

يمكنك تحديد المزيد من الشروط في دالة attempt

يمكنك استخدام مزيد من الشروط , و سنأخذ مثال مباشرة من موقع لارافل الرسمي واليك الكود : 

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.
}

لنبدأ أولاً بملاحظة مهمة , قمنا هنا باستخدام Facade Auth لذلك علينا استدعائه في بداية الصفحة عبر الكود : use Auth; .

كما ترى في الكود , يقارن هذا الشرط ثلاث معلومات في قاعدة البيانات وبناءً على النتائج يتم تسجيل الدخول أو لا , ويمكنك اضافة ما تريد من الحقول هنا لكن تأكد من أن يكون اسم حقل كلمة المرور password !

انشاء عملية تسجيل الخروج اليدوية في لارافل

لن يحتاج هذا الجزء الكثير من الكلام و التفاصيل , فهو أبسط من أن يتم اهدار أكثر من 3 ثوان في شرحه :)

// We Must Include The Auth Facade Here
Auth::logout();
// or this
auth()->logout(); // The auth() helper method is global , we done have to include Auth Facade if we use the helper method

 

في النهاية ...

تعتبر الطريقة السابقة طريقة يدوية تماماً وقابلة للتوسع حسب حاجات مشروعك , و نود أن نوضح نقطة مهمة هنا , يمكنك تعديل الأكواد الأساسية التي تأتي مع لارافل لاضافة ما تريد من التفاصيل و الشروط في تسجيل الدخول و تسجيل حسابات جديدة ولا تضطر الى استخدام الطريقة السابقة حصراً , لكن هناك بعض منا من يحب أن يمتلك السيطرة الكاملة على الكود الخاص به وربما أنا أحد هؤلاء الأشخاص D: