الفرق بين المراجعتين لصفحة: «Laravel/views»

من موسوعة حسوب
didn't finish yet
 
لا ملخص تعديل
 
(11 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:الواجهات (Views) في Laravel}}</noinclude>
== إنشاء الواجهات ==
== إنشاء الواجهات ==
ملاحظة: هل تبحث عن مزيد من المعلومات حول كيفية كتابة قوالب Blade؟ ألق نظرة على وثائق Blade الكاملة للبدء.
ملاحظة: هل تبحث عن مزيد من المعلومات حول كيفية كتابة قوالب Blade؟ ألق نظرة على [[Laravel/blade|توثيق Blade]] الكامل للبدء.


تحتوي الواجهات على HTML الذي يُقدّمه تطبيقك وتفصل منطق وحدة التحكّم/منطق التطبيق من منطق عرضك التقديمي (presentation logic). تُخزّن الواجهات في المُجلّد resources/views. قد تشبه الواجهة البسيطة المثال التالي:<syntaxhighlight lang="html">
تحتوي الواجهات على [[HTML]] الذي يُقدّمه تطبيقك وتفصل منطق وحدة التحكّم/منطق التطبيق من منطق عرضك التقديمي (presentation logic). تُخزّن الواجهات في المُجلّد resources/views. قد تشبه الواجهة البسيطة المثال التالي:<syntaxhighlight lang="html">
<! - الواجهات مُخزّنة في resources/views/greeting.blade.php ->
<! - الواجهات مُخزّنة في resources/views/greeting.blade.php ->


سطر 11: سطر 11:
     </body>
     </body>
</html>
</html>
</syntaxhighlight>كما ترى، يُوافق المّتغيّر الوسيط الأوّل المُمرّر إلى المُساعد view اسم ملف الواجهة في المجلّد resources/views. المتغيّر الوسيط الثاني هو مصفوفة البيانات التي يجب أن تُتاح للواجهة. نقوم في هذه الحالة بتمرير المتغيّر name الذي يُعرض في الواجهة باستخدام صيغة Blade.
</syntaxhighlight>كما ترى، يُوافق المّتغيّر الوسيط الأوّل المُمرّر إلى المُساعد <code>view</code> اسم ملف الواجهة في المجلّد resources/views. المتغيّر الوسيط الثاني هو مصفوفة البيانات التي يجب أن تُتاح للواجهة. نقوم في هذه الحالة بتمرير المتغيّر <code>name</code> الذي يُعرض في الواجهة باستخدام صيغة [[Laravel/blade|Blade]].


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


return view('admin.profile', $data);
return view('admin.profile', $data);
سطر 19: سطر 19:
</syntaxhighlight>
</syntaxhighlight>


==== تحديد إن كانت الواجهة موجودة ====
=== تحديد إن كانت الواجهة موجودة ===
إن كنت بحاجة لتحديد إن كانت الواجهة موجودة، يمكنك استخدام الواجهة الساكنة View (أي View facade). سيرد التابع exists بالقيمة true إن وُجدت الواجهة:<syntaxhighlight lang="php">
إن كنت بحاجة لتحديد إن كانت الواجهة موجودة، يمكنك استخدام الواجهة الساكنة View (أي View facade). سيرد التابع <code>exists</code> بالقيمة <code>true</code> إن وُجدت الواجهة:<syntaxhighlight lang="php">
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\View;


سطر 28: سطر 28:
</syntaxhighlight>
</syntaxhighlight>


==== إنشاء أوّل واجهة متاحة ====
=== إنشاء أوّل واجهة متاحة ===
يمكنك إنشاء الواجهة الأولى في مصفوفة معيّنة من الواجهات باستخدام التابع first. يُفيدك هذا إن سمح تطبيقك أو حزمتك بتخصيص الواجهات أو إعادة تعريفها (overwriting):<syntaxhighlight lang="php">
يمكنك إنشاء الواجهة الأولى في مصفوفة معيّنة من الواجهات باستخدام التابع <code>first</code>. يُفيدك هذا إن سمح تطبيقك أو حزمتك بتخصيص الواجهات أو إعادة تعريفها (overwriting):<syntaxhighlight lang="php">
return view()->first(['custom.admin', 'admin'], $data);
return view()->first(['custom.admin', 'admin'], $data);


</syntaxhighlight>يمكنك أيضا مناداة هذا التابع عبر الواجهة الساكنة View:<syntaxhighlight lang="php">
</syntaxhighlight>يمكنك أيضا مناداة هذا التابع عبر الواجهة الساكنة <code>View</code>:<syntaxhighlight lang="php">
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\View;


سطر 51: سطر 51:
قد تحتاج من حين لآخر إلى مشاركة جزء من البيانات مع جميع الواجهات
قد تحتاج من حين لآخر إلى مشاركة جزء من البيانات مع جميع الواجهات


التي يصيّرها تطبيقك. يمكنك استخدام التابع share من واجهة العرض الساكنة (view facade) للقيام بذلك. عادة، عليك وضع نداءات المشاركة داخل تابع مقدّم الخدمات boot. لك حريّة إضافتها إلى AppServiceProvider أو إنشاء مُقدّم خدمة منفصل لإيوائها:<syntaxhighlight lang="php">
التي يصيّرها تطبيقك. يمكنك استخدام التابع <code>share</code> من واجهة العرض الساكنة (view facade) للقيام بذلك. عادة، عليك وضع نداءات المشاركة داخل تابع مقدّم الخدمات <code>boot</code>. لك حريّة إضافتها إلى <code>AppServiceProvider</code> أو إنشاء مُقدّم خدمة منفصل لإيوائها:<syntaxhighlight lang="php">
<?php
<?php


سطر 81: سطر 81:
}
}
</syntaxhighlight>
</syntaxhighlight>
== مؤلّفو الواجهات (View Composers) ==
مُؤلّفو الواجهات هم ردود نداء أو دوال أصناف تُستدعى عند تصيير الواجهة. يستطيع مؤلفو الواجهة أن يساعدوك إن كانت لديك بيانات ترغب في ربطها بواجهة ما في كل مرة يُصيّر فيها في تنظيم المنطق اللازم في موضع واحد.
في هذا المثال، فلنسجِّل مؤلفي الواجهة في مقدّم خدمات. سنستخدم الواجهة الساكنة <code>View</code>  للوصول لتعريف استخدام العقد <code>Illuminate\Contracts\View\Factory</code> الأساسي. تذكر أن [[Laravel]] لا يحتوي على مجلّد افتراضي لمؤلّفي الواجهات. لديك حريّة تنظيمها كما شئت. يمكنك على سبيل المثال إنشاء مجلّد <code>app/Http/ViewComposers</code>:<syntaxhighlight lang="php">
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
    /**
    * تسجيل الارتباطات في الحاوي.
    *
    * @return void
    */
    public function boot()
    {
      // استخدام المؤلّفين على أساس الصنف ...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );
      // Closure استخدام المؤلّفين على أساس
        View::composer('dashboard', function ($view) {
          //
        });
    }
    /**
    * تسجيل مقدم الخدمة.
    *
    * @return void
    */
    public function register()
    {
      //
    }
}
</syntaxhighlight>'''تنبيه''': تذكر أنه إن أنشأت مقدّم خدمات جديد لاحتواء تسجيلات مؤلف واجهاتك ستحتاج لإضافة مُقدّم الخدمات إلى مصفوفة <code>providers</code> في ملف الإعدادات <code>config/app.php</code>.
بعد تسجيلنا للمؤلّف سيُنفّذ الآن التابع <code>ProfileComposer@compose</code> كل مرة تُصيّر فيها الواجهة <code>profile</code>. لذا فنُعرّف صنف المُؤلّف:<syntaxhighlight lang="php">
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\UserRepository;
class ProfileComposer
{
    /**
    * تعريف استخدام مستودع المستخدم.
    *
    * @var UserRepository
    */
    protected $users;
    /**
    * profile أنشئ مؤلّف جديد من
    *
    * @param  UserRepository  $users
    * @return void
    */
    public function __construct(UserRepository $users)
    {
      // Dependencies automatically resolved by service container...
        $this->users = $users;
    }
    /**
    * إربط البيانات بالواجهة
    *
    * @param  View  $view
    * @return void
    */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}
</syntaxhighlight>يُستدعى تابع المُؤلّف <code>compose</code> قبل تصيير الواجهة بالظبط مع النسخة <code>Illuminate\View\View</code>. يمكنك استخدام التابع <code>with</code> لربط البيانات بالواجهة.
ملاحظة: يُستبين كل مؤلّفو الواجهة عبر حاوي الخدمات، لذا تستطيع التلميح على نوع أي إعتماديّة تحتاجها داخل تابع بناء المؤلّف.
=== إرفاق المُؤلّف مع عدّة واجهات ===
يمكنك إرفاق أحد مؤلّفي الواجهة بعدة واجهات مرّة واحدة بتمرير مصفوفة من الواجهات كالمُتغيّر الوسيط الأوّل للتابع <code>composer</code>:<syntaxhighlight lang="php">
View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);
</syntaxhighlight>يقبل التابع composer أيضًا الحرف * كحرف بدل خاص (wildcard)، مما يتيح لك إرفاق مُؤلّف بكل الواجهات:<syntaxhighlight lang="php">
View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);
</syntaxhighlight>
=== مُنشؤو الواجهات (View creators) ===
يشبه مُنشؤو الواجهات مؤلّفي الواجهات جدًا؛ مع فارق أنّها تُنفّذ مباشرة بعد إنشاء نسخة (instantiating) الواجهة بدلاً من الانتظار حتى ينتهي تصييره. لتسجيل منشئ واجهة استخدم التابع <code>creator</code>:<syntaxhighlight lang="php">
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
</syntaxhighlight>
== مصادر ==
* [https://laravel.com/docs/5.6/views صفحة Views في توثيق Laravel الرسمي.]
[[تصنيف:Laravel|{{SUBPAGENAME}}]]
[[تصنيف:Laravel Basics|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 14:14، 24 أكتوبر 2018

إنشاء الواجهات

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

تحتوي الواجهات على HTML الذي يُقدّمه تطبيقك وتفصل منطق وحدة التحكّم/منطق التطبيق من منطق عرضك التقديمي (presentation logic). تُخزّن الواجهات في المُجلّد resources/views. قد تشبه الواجهة البسيطة المثال التالي:

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

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

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

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

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

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

use Illuminate\Support\Facades\View;

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

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

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

return view()->first(['custom.admin', 'admin'], $data);

يمكنك أيضا مناداة هذا التابع عبر الواجهة الساكنة View:

use Illuminate\Support\Facades\View;

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

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

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

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

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

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

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

قد تحتاج من حين لآخر إلى مشاركة جزء من البيانات مع جميع الواجهات

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

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * تمهيد أي خدمة تطبيق
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }

    /**
     * سجّل موفّر الخدمة
     *
     * @return void
     */
    public function register()
    {
       //
    }
}

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

مُؤلّفو الواجهات هم ردود نداء أو دوال أصناف تُستدعى عند تصيير الواجهة. يستطيع مؤلفو الواجهة أن يساعدوك إن كانت لديك بيانات ترغب في ربطها بواجهة ما في كل مرة يُصيّر فيها في تنظيم المنطق اللازم في موضع واحد.

في هذا المثال، فلنسجِّل مؤلفي الواجهة في مقدّم خدمات. سنستخدم الواجهة الساكنة View  للوصول لتعريف استخدام العقد Illuminate\Contracts\View\Factory الأساسي. تذكر أن Laravel لا يحتوي على مجلّد افتراضي لمؤلّفي الواجهات. لديك حريّة تنظيمها كما شئت. يمكنك على سبيل المثال إنشاء مجلّد app/Http/ViewComposers:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * تسجيل الارتباطات في الحاوي.
     *
     * @return void
     */
    public function boot()
    {
       // استخدام المؤلّفين على أساس الصنف ...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

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

    /**
     * تسجيل مقدم الخدمة.
     *
     * @return void
     */
    public function register()
    {
       //
    }
}

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

<?php

namespace App\Http\ViewComposers;

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

class ProfileComposer
{
    /**
     * تعريف استخدام مستودع المستخدم.
     *
     * @var UserRepository
     */
    protected $users;

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

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

يُستدعى تابع المُؤلّف compose قبل تصيير الواجهة بالظبط مع النسخة Illuminate\View\View. يمكنك استخدام التابع with لربط البيانات بالواجهة.

ملاحظة: يُستبين كل مؤلّفو الواجهة عبر حاوي الخدمات، لذا تستطيع التلميح على نوع أي إعتماديّة تحتاجها داخل تابع بناء المؤلّف.

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

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

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

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

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

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

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

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');

مصادر