Skip to content

Latest commit

 

History

History
280 lines (219 loc) · 14.4 KB

views.md

File metadata and controls

280 lines (219 loc) · 14.4 KB

الواجهات (Views)

مقدمة

بالطبع ، ليس من العملي إرجاع سلاسل مستندات HTML بالكامل مباشرةً من المسارات (paths) والمتحكمات الخاصة بك (controllers). لحسن الحظ ، توفر الواجهات طريقة مناسبة لوضع كل HTML في ملفات منفصلة. تفصل الواجهات منطق وحدة التحكم / منطق التطبيق عن منطق عرضك التقديمي (presentation logic) ويتم تخزين الواجهات في المجلد resources/view. قد تشبه الواجهة البسيطة المثال التالي:

<!-- الواجهات المُخزّنة في resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

نظراً لأن هذه الواجهة مخزنة في resources/views/greeting.blade.php ، يمكننا ارجاعها باستخدام المساعد العام view مثل:

    Route::get('/', function () {
        return view('greeting', ['name' => 'James']);
    });

ملاحظة: هل تبحث عن مزيد من المعلومات حول كيفية كتابة قوالب Blade؟ ألق نظرة على توثيق Blade الكامل للبدء.

إنشاء وتقديم الواجهات

يمكنك إنشاء واجهة عن طريق وضع ملف بامتداد .blade.php في مجلد resources/views في تطبيقك. يخبر الامتداد .blade.php إطار العمل (framework) بأن الملف يحتوي على قالب Blade. تحتوي قوالب الBlade على HTML بالإضافة إلى مجلدات Blade التي تتيح لك محاكاة القيم بسهولة وإنشاء عبارات "if" والتكرار على البيانات والمزيد.

بمجرد إنشاء واجهة ، يمكنك إرجاعها من أحد مسارات أو متحكمات في تطبيقك باستخدام المساعد العام view:

    Route::get('/', function () {
        return view('greeting', ['name' => 'James']);
    });

يمكن أيضاً إرجاع الواجهة عبر الواجهة الساكنة `View`:

    use Illuminate\Support\Facades\View;

    return View::make('greeting', ['name' => 'James']);

كما ترى، يُوافق المّتغيّر الوسيط الأوّل المُمرّر إلى المُساعد view اسم ملف الواجهة في المجلّد resources/views. المتغيّر الوسيط الثاني هو مصفوفة البيانات التي يجب أن تُتاح للواجهة. نقوم في هذه الحالة بتمرير المتغيّر name الذي يُعرض في الواجهة باستخدام صيغة Blade.

مجلدات الواجهة المتداخلة(Nested)

يمكن أيضاً تضمين (nesting) الواجهات ضمن مُجلّدات فرعية من المُجلّد resources/views. يمكن استخدام الترميز "نقطة" للإشارة للعروض المتداخلة (nested). مثلا، إن خُزّن عرضك في resources/views/admin/profile.blade.php، يمكن ارجاعه من أحد مسارات/ متحكمات تطبيقك على النحو التالي:

    return view('admin.profile', $data);

ملاحظة: يجب ألا تحتوي مجلدات الواجهة على نقطة .

إنشاء أوّل واجهة متاحة

يمكنك إنشاء الواجهة الأولى في مصفوفة معيّنة من الواجهات باستخدام التابع first. يُفيدك هذا إن سمح تطبيقك أو حزمتك بتخصيص الواجهات أو إعادة تعريفها (overwritten):

use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

تحديد إن كانت الواجهة موجودة

إن كنت بحاجة لتحديد إن كانت الواجهة موجودة، يمكنك استخدام الواجهة الساكنة View (أي View facade). سيرد التابع exists بالقيمة true إن وُجدت الواجهة:

    use Illuminate\Support\Facades\View;

    if (View::exists('emails.customer')) {
        //
    }

تمرير البيانات للواجهات

كما رأيت في الأمثلة السابقة، يمكنك تمرير مصفوفة من البيانات للواجهات لجعل تلك البيانات متوفرة للواجهة:

    return view('greetings', ['name' => 'Victoria']);

عند تمرير المعلومات بهذه الطريقة ، يجب أن تكون البيانات مصفوفة من الأزواج مفتاح / قيمة (key/value). بعد تمرير البيانات للواجهة يمكنك الوصول لكل قيمة باستخدام مفتاحها المُوافق داخل واجهتك، مثل <?;php echo $key ?>. كبديل لتمرير مصفوفة كاملة من البيانات إلى دالّة المُساعد view، يمكنك استخدام التابع with لإضافة أجزاء منفردة من البيانات للواجهة. يرجع التابع with نسخة من كائن الواجهة (view object) بحيث يمكنك متابعة تسلسل التوابع قبل إرجاع الواجهة:

    return view('greeting')
                ->with('name', 'Victoria')
                ->with('occupation', 'Astronaut');

مشاركة البيانات مع جميع الواجهات

في بعض الأحيان ، قد تحتاج إلى مشاركة البيانات مع جميع واجهات تطبيقك. يمكنك استخدام التابع share من واجهة العرض الساكنة (view facade) للقيام بذلك. عادة، عليك وضع نداءات التابع share داخل تابع مقدّم الخدمات boot. لك حريّة إضافتها إلى App\Providers\AppServiceProvider class أو إنشاء مُقدّم خدمة منفصل لإيوائها:

    <?php

    namespace App\Providers;

    use Illuminate\Support\Facades\View;

    class AppServiceProvider extends ServiceProvider
    {
        /**
         * تسجيل أي خدمة تطبيق
         *
         * @return void
         */
        public function register()
        {
            //
        }

        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            View::share('key', 'value');
        }
    }

مؤلّفو الواجهات (View Composers)

مُؤلّفو الواجهات هم عمليات نداء (callbacks) أو دوال أصناف (class methods) تُستدعى عند عرض الواجهة. إذا كانت لديك بيانات تريد ربطها بواجهة في كل مرة يتم فيها عرض هذا الواجهة ، فيمكن أن يساعدك مؤلف الواجهة في تنظيم هذا المنطق في مكان واحد. قد يكون مؤلفو الواجهة ذو فائدة بشكل خاص إذا تم إرجاع نفس الواجهة من خلال مسارات أو متحكمات متعددة داخل تطبيقك وتحتاج دائماً إلى جزء معين من البيانات. عادةً ، سيتم تسجيل مؤلفي الواجهات في أحد مزودي الخدمة لتطبيقك. في هذا المثال ، سنفترض أننا أنشأنا App\Providers\ViewServiceProvider جديدًا لإيواء هذا المنطق. سنستخدم التابع composer للواجهة الساكنة View لتسجيل مؤلف الواجهة تذكر أن Laravel لا يحتوي على مجلّد افتراضي لمؤلّفي الواجهات المعتمدة على الأصناف (class based). لديك حريّة تنظيمها كما شئت. على سبيل المثال ، يمكنك إنشاء دليل app/View/Composers لإيواء جميع مؤلفي واجهات تطبيقك:

    <?php

    namespace App\Providers;

    use App\View\Composers\ProfileComposer;
    use Illuminate\Support\Facades\View;
    use Illuminate\Support\ServiceProvider;

    class ViewServiceProvider extends ServiceProvider
    {
        /**
         * تسجيل أي خدمات تطبيق.
         *
         * @return void
         */
        public function register()
        {
            //
        }

        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            // استخدام المؤلّفين على أساس الصنف ...

            View::composer('profile', ProfileComposer::class);

            // Closure استخدام المؤلّفين على أساس 
            View::composer('dashboard', function ($view) {
                //
            });
        }
    }

ملاحظة: تذكر أنه إن أنشأت مقدّم خدمات جديد لاحتواء تسجيلات مؤلف واجهاتك ستحتاج لإضافة مُقدّم الخدمات إلى مصفوفة providers في ملف الإعدادات config/app.php..

بعد تسجيلنا للمؤلّف سيُنفّذ الآن سينفذ التابع compose من الصنف App\View\Composers\ProfileComposer في كل مرة يتم عرض واجهة profile. لذا فلنتعرف على صنف المؤلف:

   <?php

    namespace App\View\Composers;

    use App\Repositories\UserRepository;
    use Illuminate\View\View;

    class ProfileComposer
    {
        /**
         * The user repository implementation.
         *
         * @var \App\Repositories\UserRepository
         */
        protected $users;

        /**
         * profile أنشئ مؤلّف جديد من
         *
         * @param  \App\Repositories\UserRepository  $users
         * @return void
         */
        public function __construct(UserRepository $users)
        {
            // Dependencies are automatically resolved by the service container...
            $this->users = $users;
        }

        /**
         * إربط البيانات بالواجهة
         *
         * @param  \Illuminate\View\View  $view
         * @return void
         */
        public function compose(View $view)
        {
            $view->with('count', $this->users->count());
        }
    }

كما ترى، يُستبين كل مؤلّفو الواجهة عبر حاوي الخدمات، لذا تستطيع التلميح على نوع أي إعتماديّة تحتاجها داخل تابع بناء المؤلّف (composer's constructor).

إرفاق المُؤلّف مع عدّة واجهات

يمكنك إرفاق أحد مؤلّفي الواجهة بعدة واجهات مرّة واحدة بتمرير مصفوفة من الواجهات كالمُتغيّر الوسيط الأوّل للتابع composer:

    use App\Views\Composers\MultiComposer;

    View::composer(
        ['profile', 'dashboard'],
        MultiComposer::class
    );

يقبل التابع composer أيضاً الحرف * كحرف بدل خاص (wildcard)، مما يتيح لك إرفاق مُؤلّف لكل الواجهات:

    View::composer('*', function ($view) {
        //
    });

مُنشؤو الواجهات (View creators)

يشبه مُنشؤو الواجهات مؤلّفي الواجهات جداً؛ مع فارق أنّها تُنفّذ مباشرة بعد إنشاء نسخة (instantiating) الواجهة بدلاً من الانتظار حتى ينتهي عرضه. لتسجيل منشئ واجهة استخدم التابع creator:

    use App\View\Creators\ProfileCreator;
    use Illuminate\Support\Facades\View;

    View::creator('profile', ProfileCreator::class);

تحسين الواجهات

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

قد يكون ترجمة الواجهات أثناء الطلب تأثير سلبي بسيط على الأداء ، لذلك يوفر Laravel أمر view: cache Artisan لإجراء ترجمة مسبقة لجميع الواجهات التي يستخدمها تطبيقك. لزيادة الأداء ، قد ترغب في تشغيل هذا الأمر كجزء من عملية النشر الخاصة بك:

php artisan view:cache

يمكنك استخدام الأمر view: clear لمسح ذاكرة التخزين المؤقت للواجهة:

php artisan view:clear