اكتشف إطار PHP Laravel


الدرس: الضوابط والمساعدين


الصفحة السابقة
في الفصول السابقة ، اضطررنا إلى إنشاء عمليات ترحيل ، ومجموعات (population) ، وأجهزة تحكم ، ونماذج عدة مرات ... لدى Artisan أوامر لتنفيذ بعض هذه العمليات ، لكنها لا تذهب بعيدا وكان علينا إنشاء الكثير من الكود الذي من الواضح أنه يمكن أن يكون آليا أو أكثر سهولة.
من الممكن تحسين أوامر Artisan أو حتى إنشاء أوامر جديدة. هناك أيضًا مساعدين لمساعدتنا في هذه المهام الشاقة أو المتكررة إلى حد ما. 

تحسين الطلب


يوجد أمر في Artisan لإنشاء مُجسم:

php artisan make:model MonModele
هنا هو ما نحصل عليه:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MonModele extends Model
{
    //
}
إنه ليس كثيرًا ولكنه بالفعل مُجسم فارغ إلى حد ما.
ومع ذلك ، يقوم هذا الأمر بإنشاء عملية ترحيل باستخدام خيار --migration  .
إذا كنا نخطط لوضع المُجسمات في مجلد معين ، فما عليك سوى ملء مساحة الاسم عند الطلب:

php artisan make:model App\Models\MonModele
لقد رأينا أنه من العملي امتلاك خاصية $fillable  لسرد الأعمدة التي يمكن تحديثها دون المخاطرة. ما سيكون لطيفا سيكون لديك خيار لإضافة هذه الخاصية.
إذا نظرت إلى مجلد أوامر "وحدة التحكم" ، نرى أن هناك بالفعل واحدًا:
framework Laravel MVC
أوامر "وحدة التحكم"
هذا مثال يمكن أن يرشدك لوضع طلب.
نظرًا لأن الطلب موجود بالفعل في Artisan ، فلن نعيد اختراعه ولكن نوسع إمكانياته فقط. يجب عليك البحث قليلاً في الإطار للعثور على هذا الأمر:
framework Laravel MVC
الامر ModelMakeCommand في Laravel
مع هذا الكود:

<?php

namespace Illuminate\Foundation\Console;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;

class ModelMakeCommand extends GeneratorCommand
{
    /**
     * The console command name.
     *
     * @var  string
     */
    protected $name = 'make:model';

    /**
     * The console command description.
     *
     * @var  string
     */
    protected $description = 'Create a new Eloquent model class';

    /**
     * The type of class being generated.
     *
     * @var  string
     */
    protected $type = 'Model';

    /**
     * Execute the console command.
     *
     * @return  void
     */
    public function fire()
    {
        if (parent::fire() !== false) {
            if ($this->option('migration')) {
                $table = str_plural(snake_case(class_basename($this->argument('name'))));

                $this->call('make:migration', ['name' => "create_{$table}_table", '--create' => $table]);
            }
        }
    }

    /**
     * Get the stub file for the generator.
     *
     * @return  string
     */
    protected function getStub()
    {
        return __DIR__.'/stubs/model.stub';
    }

    /**
     * Get the default namespace for the class.
     *
     * @param    string  $rootNamespace
     * @return  string
     */
    protected function getDefaultNamespace($rootNamespace)
    {
        return $rootNamespace;
    }

    /**
     * Get the console command options.
     *
     * @return  array
     */
    protected function getOptions()
    {
        return [
            ['migration', 'm', InputOption::VALUE_NONE, 'Create a new migration file for the model.'],
        ];
    }
}
يستخدم الأمر قالبًا (stub) موجودًا هنا:
framework Laravel MVC
ترتيب stub 
مع هذا الكود:

<?php

namespace DummyNamespace;

use Illuminate\Database\Eloquent\Model;

class DummyClass extends Model
{
    //
}
يسمح "Dummy" بتحديد المواقع ذات البيانات المتغيرة ، وهنا اسم مساحة الاسم واسم الفئة.
في الإصدار 5.0 كان لدينا بناء جملة آخر يتكون من الأقواس مثل Blade .
سنبدأ بإنشاء فئتنا عن طريق توسيع فئة Laravel . لذلك دعونا ننشأ الأمر الجديد مع Artisan :

php artisan make:console ModelMakeCommand
نجدها هنا:
framework Laravel MVC
نظامنا
مع هذا الكود الذي تم إنشاؤه:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class ModelMakeCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var  string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var  string
     */
    protected $description = 'Command description.';

    /**
     * Create a new command instance.
     *
     * @return  void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return  mixed
     */
    public function handle()
    {
        //
    }
}
نحن نحفظه في app\Console\Kernel.php :

<?php
protected $commands = [
    Commands\Inspire::class,
    Commands\ModelMakeCommand::class,
];
سنقوم أيضًا بإنشاء stub :
framework Laravel MVC
stub 
باستخدام هذا الكود لإضافة الخاصية $fillable  :

<?php

namespace DummyNamespace;

use Illuminate\Database\Eloquent\Model;

class DummyClass extends Model  {

    /**
     * Attributes that should be mass-assignable.
     *
     * @var  array
     */
    protected $fillable = [DummyFillable];

}
يبقى لنا فقط تعديل التعليمات البرمجية التي تم إنشاؤها تلقائيًا لتوسيع فئة Laravel من ناحية ، ومن ناحية أخرى ، تأكد من أن الخيار يعمل fillable :

<?php

namespace App\Console\Commands;

use Illuminate\Foundation\Console\ModelMakeCommand as BaseModelCommand;
use Symfony\Component\Console\Input\InputOption;
use Illuminate\Support\Facades\Schema as Schema;

class ModelMakeCommand extends BaseModelCommand
{

    protected $exclude = ['id', 'password', 'created_at', 'updated_at'];

    protected function getStub()
    {
        return __DIR__.'/stubs/model.stub';
    }

    protected function buildClass($name)
    {
        $stub = $this->files->get($this->getStub());

        return $this->replaceNamespace($stub, $name)
        ->replaceFillable($stub)
        ->replaceClass($stub, $name);
    }

    protected function replaceFillable(&$stub)
    {
        if($this->input->getOption('fillable'))
        {
            // On construit le nom de la table à partir du nom du modèle
            $table = str_plural(strtolower($this->getNameInput()));
            // On récupère le nom des colonnes
            $columns = Schema::getColumnListing($table);
            // On exclut les colonnes non désirées 
            $columns = array_filter($columns, function($value)
            {
              return !in_array($value, $this->exclude);
            });
            // On ajoute des apostrophes
            array_walk($columns, function(&$value) {
                $value = "'" . $value . "'";
            });
            // CSV format
            $columns = implode(',', $columns);
        }

        $stub = str_replace('DummyFillable', isset($columns)? $columns : '', $stub);

        return $this;
    }

    protected function getOptions()
    {
        return [
            ['migration', 'm', InputOption::VALUE_NONE, 'Create a new migration file for the model.'],
            ['fillable', null, InputOption::VALUE_NONE, 'Set the fillable columns.', null]
        ];
    }
}
لن أفسّر بالتفصيل كود هذا الأمر ، اسمح لك بتحليله إذا كنت تريد أن تفهم كيف يعمل. الهدف هو مجرد إظهار أنه من الممكن تحقيق ذلك بمثال ملموس.
سنختبر هذا الطلب مع الجدول posts  الذي استخدمناه للمدونة الصغيرة:

php artisan make:model Post --fillable
نحصل على هذا المُجسم:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model  {

    /**
     * Attributes that should be mass-assignable.
     *
     * @var  array
     */
    protected $fillable = ['titre','contenu','user_id'];

}
لقد انشأنا الخاصية وملأنا الجدول مع استبعاد الأعمدة المقدمة.

Laravel Schema Designer


مصمم المخططات(Schema Designer) االذي يمكنك العثور عليه هنا هو نهج مرئي وفعال. عليك فقط رسم الجداول وملء الحقول والعلاقات ومن ثم يتم إنشاؤها بالنسبة لنا:
  • الترحيل
  • population
  • المُجسمات.
خذ مثالاً على الكتب والمؤلفين وعلاقة 1:n بينهما.
أول شيء هو إنشاء حساب مجاني. ثم يمكنك إعطاء اسم لقاعدة البيانات الخاصة بك:
framework Laravel MVC
اسم القاعدة
إنشاء الجداول
ثم تضغط على الزر لإضافة جدول:
framework Laravel MVC
إنشاء جدول
ثم تملأ الحقول:
framework Laravel MVC
نموذج إنشاء الجدول
ثم يكون لديك الجدول الخاص بك بصريا على الشاشة:
framework Laravel MVC
جدول الكتب
قم بإنشاء جدول المؤلف بنفس الطريقة (يمكنك اللعب بالألوان لتمييز الجداول بوضوح ، وهو أمر مفيد عندما يكون هناك الكثير):
framework Laravel MVC
جدول المؤلفين
خلق المجال
سنقوم بعد ذلك بملء الحقول للجداول. لنبدأ مع المؤلفين. فقط اضغط على الزر مع علامة "+":
framework Laravel MVC
إضافة حقل
النموذج كامل للغاية ، فقط املأه:
framework Laravel MVC
نموذج لإنشاء حقل
بعد التحقق من الصحة ، نرى مجالنا الجديد في الجدول:
framework Laravel MVC
الحقل المضافة
يوجد زران لتعديله أو حذفه. سنقوم أيضًا بملء جدول الكتب بالعنوان والمفتاح الخارجي:
framework Laravel MVC
المفتاح الخارجي
لذلك ينتهي بنا المطاف بجدولنا وحقوله المملوءة:
framework Laravel MVC
تم إنشاء الجدولين بحقولهم المملوءة
انشاء العلاقات
يبقى فقط بالنسبة لنا تحديد العلاقات. لنبدأ مع المؤلفين. عليك أن تضغط على هذا الزر:
framework Laravel MVC
زر انشاء علاقة
لدينا هذا النموذج لإكماله:
framework Laravel MVC
نموذج إنشاء العلاقة
ثم مع قائمة العلاقات الحالية:
framework Laravel MVC
العلاقات الحالية
من الواضح أن لدينا واحدة فقط. تظهر العلاقة بشكل مرئي في شكل ارتباط مع ظهور اسم الطريقة عند المرور فوقها بالماوس:
framework Laravel MVC
العلاقة ممثلة بصريا
بنفس الطريقة ننشأ العلاقة التي تراها من جانب الكتب:
framework Laravel MVC
العلاقة التي تراها من جانب الكتب
لدينا أيضًا تمثيل مرئي باسم الطريقة التي تظهر على التحويم:
framework Laravel MVC
التمثيل المرئي للطريقة belongsTo
لإضافة population ، انقر على هذا الزر:
framework Laravel MVC
زر population
لدينا بعد ذلك نموذج لإكماله:
framework Laravel MVC
شكل population
تصدير الملفات
الآن انتهينا من الرسم البياني ، يبقى فقط تصدير الملفات:
framework Laravel MVC
قائمة التصدير
سنطلب كل شيء من خلال النقر مباشرة على "EXPORT ALL" . نتلقى ملفًا مضغوطًا بكل هذا:
framework Laravel MVC
الملفات المصدرة
لذلك لدينا الترحيلات ، على سبيل المثال بالنسبة للمؤلفين:

<?php

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

class CreateAuteursTable extends Migration {

    public function up()
    {
        Schema::create('auteurs', function(Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->string('nom', 100)->unique();
        });
    }

    public function down()
    {
        Schema::drop('auteurs');
    }
}
ترحيل محدد للمفاتيح الخارجية:

<?php

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

class CreateForeignKeys extends Migration {

    public function up()
    {
        Schema::table('livres', function(Blueprint $table) {
            $table->foreign('auteur_id')->references('id')->on('livres')
                        ->onDelete('restrict')
                        ->onUpdate('restrict');
        });
    }

    public function down()
    {
        Schema::table('livres', function(Blueprint $table) {
            $table->dropForeign('livres_auteur_id_foreign');
        });
    }
}
population التي فكرنا فيها لمؤلف:

<?php

class AuteurTableSeeder extends Seeder {

    public function run()
    {
        //DB::table('auteurs')->delete();

        // AuteurTableSeeder
        Auteur::create(array(
                'nom' => 'Dupont'
            ));
    }
}
مع DatabaseSeeder المحدثة:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder {

    public function run()
    {
        Model::unguard();

        $this->call('AuteurTableSeeder');
        $this->command->info('Auteur table seeded!');
    }
}
المُجسمات ، على سبيل المثال للمؤلفين:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Auteur extends Model {

    protected $table = 'auteurs';
    public $timestamps = true;
    protected $fillable = array('nom');

    public function livres()
    {
        return $this->hasMany('Livre');
    }

}
لدينا حتى عرض مع هيكل للنموذج ، على سبيل المثال للمؤلفين:

{!! Form::open(array('route' => 'route.name', 'method' => 'POST')) !!}
    <ul>
        <li>
            {!! Form::label('nom', 'Nom:') !!}
            {!! Form::text('nom') !!}
        </li>
        <li>
            {!! Form::submit() !!}
        </li>
    </ul>
{!! Form::close() !!}
يقوم هذا المولد أيضًا بإنشاء وحدات تحكم وسهل الاستخدام للغاية من خلال واجهته الرسومية.

في الخلاصة


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