اكتشف إطار PHP Laravel


الدرس: الموارد (1/2)


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

المعطيات


الترحيل
ابتداءا من Laravel فارغ ، سنبدأ بتكوين قاعدة البيانات كما رأينا في الفصل السابق وبتثبيت الترحيل لإنشاء جدول الترحيل في قاعدة البيانات:

php artisan migrate:install
Migration table created successfully.
عند تثبيت Laravel ، ينتهي بك الحال مع وجود ترحيلين موجودين بالفعل:
framework Laravel MVC
الترحيلات الموجودة في التثبيت.
في الوقت الحالي ، سنحتفظ فقط بالترحيل الأول الذي يتعلق بإنشاء جدول المستخدم. نحن بصدد تعديله قليلاً مثل هذا:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return  void
     */
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->boolean('admin')->default(false);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return  void
     */
    public function down()
    {
        Schema::drop('users');
    }

}
سيكون لدينا الحقول:
  • id  : عدد صحيح متزايد ذاتي والذي سيكون المفتاح الرئيسي للجدول ،
  • name  : نص (varchar 255) للاسم ( unique) ،
  • email  : نص (varchar 255) للبريد الإلكتروني ( unique) ،
  • password  : نص مكون من 60 حرفًا لكلمة المرور (لا يعني ذلك أنه يمكن أن تحتوي كلمة المرور على 60 حرفًا لأننا سنخزن هنا نسخة مشفرة من كلمة المرور هذه) ،
  • admin  : قيمة منطقية للإشارة إلى ما إذا كان مسؤولًا لديه false القيمة التلقائية ،
  • remember_token : نص حرف يستخدم للمصادقة والذي سنراه في فصل لاحق ،
  • created_at و updated_at: التي أنشأتها الطريقة timestamps،
ثم نطلق الترحيل:

php artisan migrate
Migrated: 2014_10_12_000000_create_users_table
ويجب أن ينتهي بنا إلى إنشاء الجدول:
framework Laravel MVC
جدول المستخدمين
لاحظ أن المُجسم User  موجود بالفعل في المجلد app  عند تثبيت Laravel لأنه مميز بعض الشيء كما سنرى عندما نتحدث عن المصادقة. في الوقت الحالي ، سنكون راضين عن حقيقة أنه موجود بالفعل دون الحاجة إلى القلق بشأن محتواه.

مورد


الانشاء
سنقوم الآن بإنشاء مورد مع Artisan:

php artisan make:controller UserController --resource
Controller created successfully

app/Http/Controllers/UserController
:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return  \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return  \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param    \Illuminate\Http\Request  $request
     * @return  \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param    int  $id
     * @return  \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param    int  $id
     * @return  \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param    \Illuminate\Http\Request  $request
     * @param    int  $id
     * @return  \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param    int  $id
     * @return  \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
تغطي الأساليب السبعة التي تم إنشاؤها الإدارة الكاملة للمستخدمين:
  1. index  : لعرض قائمة المستخدمين ،
  2. create  : لإرسال النموذج لإنشاء مستخدم جديد ،
  3. store  : لإنشاء مستخدم جديد ،
  4. show  : لعرض بيانات المستخدم ،
  5. edit  : لإرسال النموذج لتعديل المستخدم ،
  6. update  : لتعديل بيانات المستخدم ،
  7. destroy  : لحذف المستخدم. 
الطرق
لإنشاء جميع المسارات ، فقط سطر الشفرة الوحيد هذا:

<?php
Route::resource('user', 'UserController');
لمعرفة الطرق التي تم إنشاؤها بهذه الطريقة ، سنواصل استخدام Artisan :

php artisan route:list
framework Laravel MVC
طرق الموارد
ستجد 7 طرق ، لكل منها عنوان url ، والذي يشير إلى الطرق السبعة لوحدة التحكم الخاصة بنا. لاحظ أيضًا أن كل مسار له أيضًا اسم يمكن استخدامه على سبيل المثال لإعادة التوجيه. سننظر الآن في كل من هذه المسارات وننشئ الإدارة اللازمة للبيانات وطرق العرض والكود على مستوى وحدة التحكم.
وحدة التحكم
الآن نحن بحاجة إلى كود وحدة تحكم. للبقاء في عملية التنظيم الجيد للفصول ، سأستمر في قصر وحدة التحكم على تلقي الطلبات وإرسال الردود. لذلك سيتعين علينا حقن:
  • التحقق من صحة
  • إدارة البيانات.
للتحقق من الصحة ، سيكون لدينا حالتان:
  • إنشاء مستخدم مع التحقق من تفرد الاسم والبريد الإلكتروني ومطابقة كلمة المرور ،
  • تعديل مستخدم ، مع التحقق من التفرد نفسه ولكن باستثناء السجل الذي يجري تعديله. من ناحية أخرى ، لن ندرج كلمة المرور في هذا التعديل.
سنحتاج لذلك إلى طلبين نموذجيين: أحدهما للإنشاء والآخر للتعديل.
للإدارة فئة واحدة فقط    UserRepository  سوف تكفي.
إذا أخذنا بعين الاعتبار هذه الحقن هنا هو كود وحدة التحكم:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserCreateRequest;
use App\Http\Requests\UserUpdateRequest;

use App\Repositories\UserRepository;

use Illuminate\Http\Request;

class UserController extends Controller
{

    protected $userRepository;

    protected $nbrPerPage = 4;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function index()
    {
        $users = $this->userRepository->getPaginate($this->nbrPerPage);
        $links = $users->render();

        return view('index', compact('users', 'links'));
    }

    public function create()
    {
        return view('create');
    }

    public function store(UserCreateRequest $request)
    {
        $user = $this->userRepository->store($request->all());

        return redirect('user')->withOk("L'utilisateur " . $user->name . " a été créé.");
    }

    public function show($id)
    {
        $user = $this->userRepository->getById($id);

        return view('show',  compact('user'));
    }

    public function edit($id)
    {
        $user = $this->userRepository->getById($id);

        return view('edit',  compact('user'));
    }

    public function update(UserUpdateRequest $request, $id)
    {
        $this->userRepository->update($id, $request->all());
        
        return redirect('user')->withOk("L'utilisateur " . $request->input('name') . " a été modifié.");
    }

    public function destroy($id)
    {
        $this->userRepository->destroy($id);

        return back();
    }

}
من الواضح أننا سوف نحلل كل هذا بالتفصيل ولكن بشكل عام ترى أنه تم تحسين الكود بشكل كبير:
  • استلام الطلب ،
  • تفويض المعالجة إذا لزم الأمر (التحقق من الصحة والإدارة) ،
  • ارسال الرد.

التحقق من صحة


إنشاء مستخدم
سنقوم بإنشاء طلب نموذج لإنشاء مستخدم. لا أكرر عملية الإنشاء مع Artisan لأننا رأيناها بالفعل عدة مرات. هنا هو كود الفئة:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserCreateRequest extends Request
{

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|max:255|unique:users',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6'
        ];
    }

}
مع هذه القواعد:
  • name  : مطلوب ، الحد الأقصى لطول 255 حرفًا ، وفريد ​​في جدول المستخدمين ،
  • email  : مطلوب ، عنوان صالح ، الحد الأقصى لطول 255 حرفًا ، وفريد ​​من نوعه في جدول المستخدمين ،
  • password  : مطلوب ، الحد الأدنى لطول 6 أحرف ويجب أن يتوافق مع ما تم إدخاله في حقل تأكيد كلمة المرور.
تحرير مستخدم
لتعديل مستخدم ، سيكون لدينا مشكلة صغيرة. في الواقع ، نريد أن نحافظ على تفرد الاسم والبريد الإلكتروني في قاعدة البيانات ، لذلك من الحكمة توفير قاعدة "unique" . ولكن نظرًا لأن قيم الاسم والبريد الإلكتروني الحالية موجودة بالفعل في قاعدة البيانات ، فسنواجه فشل في التحقق من الصحة إذا لم يتم تعديل إحدى هاتين القيمتين ، وهو أمر محتمل بدرجة كبيرة. كيف نخرج منه؟ نظرًا لأن لدينا وظيفة ، يمكننا إجراء أي معالجة نريد. فيما يلي طلب النموذج لتعديل المستخدم:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserUpdateRequest extends Request
{

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        $id = $this->user;
        return [
            'name' => 'required|max:255|unique:users,name,' . $id,
            'email' => 'required|email|max:255|unique:users,email,' . $id
        ];
    }

}
نحصل على معرف المستخدم في عنوان url . ثم نستخدم إمكانية الاستبعاد من القاعدة "unique" . 
لذلك يجب أن يكون لديك هذين الملفين للتحقق من الصحة:
framework Laravel MVC
ملفات التحقق من الصحة
في الفصل التالي ، سنواصل دراسة هذا المورد من خلال إدارة البيانات و العرض.

في الخلاصة


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