الفرق بين المراجعتين ل"Laravel/urls"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
 
(7 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
 
+
<noinclude>{{DISPLAYTITLE:توليد عناوين URL في Laravel}}</noinclude>
<noinclude>{{DISPLAYTITLE:توليد URL}}</noinclude>
+
== مقدمة ==
 
+
يوفّر [[Laravel]] العديد من المساعدين لمساعدتك في إنشاء عناوين URL لتطبيقك. فائدتهم الأساسية تظهر طبعا عند بناء روابط في قوالبك (templates) واستجابات الواجهة البرمجيّة، أو عند توليد ردود إعادة توجيه إلى جزء آخر من تطبيقك.
== مقدّمة ==
 
يوفّر Laravel العديد من المساعدين لمساعدتك في إنشاء عناوين URL لتطبيقك. فائدتهم الأساسية تظهر طبعا عند بناء روابط في قوالبك (templates) واستجابات الواجهة البرمجيّة، أو عند توليد ردود إعادة توجيه إلى جزء آخر من تطبيقك.
 
  
 
== الأساسيات ==
 
== الأساسيات ==
  
 
=== توليد عناوين URL أساسية ===
 
=== توليد عناوين URL أساسية ===
يمكن استخدام المساعد url لتوليد عناوين URL عشوائية لتطبيقك. سيستخدم العنوان URL المُنشأ تلقائيًا المخطَّط (HTTP أو HTTPS) ويستضيف من الطلب الحالي:<syntaxhighlight lang="php">
+
يمكن استخدام المساعد <code>url</code> لتوليد عناوين URL عشوائية لتطبيقك. سيستخدم العنوان URL المُنشأ تلقائيًا المخطَّط (HTTP أو HTTPS) ويستضيف من الطلب الحالي:<syntaxhighlight lang="php">
 
$post = App\Post::find(1);
 
$post = App\Post::find(1);
  
سطر 17: سطر 15:
  
 
=== الوصول إلى العنوان URL الحالي ===
 
=== الوصول إلى العنوان URL الحالي ===
سترد النسخة Illuminate\Routing\UrlGenerator إن لم يُوفّر أي مسار إلى المساعد url، مما يتيح لك الوصول للمعلومات حول العنوان URL الحالي:<syntaxhighlight lang="php">
+
سترد النسخة <code>Illuminate\Routing\UrlGenerator</code> إن لم يُوفّر أي مسار إلى المساعد <code>url</code>، مما يتيح لك الوصول للمعلومات حول العنوان URL الحالي:<syntaxhighlight lang="php">
 
//  تحصّل على العنوان الحالي بدون سلسلة الاستعلام ...
 
//  تحصّل على العنوان الحالي بدون سلسلة الاستعلام ...
 
   
 
   
سطر 40: سطر 38:
  
 
== العناوين URL للمسارات المسمّاة ==
 
== العناوين URL للمسارات المسمّاة ==
يمكن استخدام المساعد route لتوليد العناوين URL للمسارات المُسمّاة. تتيح لك المسارات المُسمّاة توليد عناوين URL دون أن يقترن بالعنوان URL الفعلي المحدّد في المسار. وهكذا لا تحتاج لعمل أي تغييرات لنداءات دوال مسارك (function) إن تغيّر العنوان URL للمسار.  تخيل على سبيل المثال أن تطبيقك يحتوي على مسار محدد كما يلي:<syntaxhighlight lang="php">
+
يمكن استخدام المساعد <code>route</code> لتوليد العناوين URL للمسارات المُسمّاة. تتيح لك المسارات المُسمّاة توليد عناوين URL دون أن يقترن بالعنوان URL الفعلي المحدّد في المسار. وهكذا لا تحتاج لعمل أي تغييرات لنداءات دوال مسارك (function) إن تغيّر العنوان URL للمسار.  تخيل على سبيل المثال أن تطبيقك يحتوي على مسار محدد كما يلي:<syntaxhighlight lang="php">
 
Route::get('/post/{post}', function () {
 
Route::get('/post/{post}', function () {
 
   //
 
   //
 
})->name('post.show');
 
})->name('post.show');
</syntaxhighlight>لتوليد عنوان URL لهذا المسار تستطيع استخدام المساعد route على النحو التالي:<syntaxhighlight lang="php">
+
</syntaxhighlight>لتوليد عنوان URL لهذا المسار تستطيع استخدام المساعد <code>route</code> على النحو التالي:<syntaxhighlight lang="php">
 
echo route('post.show', ['post' => 1]);
 
echo route('post.show', ['post' => 1]);
  
 
// http://example.com/post/1
 
// http://example.com/post/1
</syntaxhighlight>ستولّد غالبًا عناوين URL باستخدام المفتاح الأساسي (primary key) للقوالب Eloquent. ولهذا السبب تستطيع تمرير نماذج Eloquent كقيم مُعاملة. سيستخرج المساعد route مفتاح النموذج الأساسي تلقائيًا:<syntaxhighlight lang="php">
+
</syntaxhighlight>ستولّد غالبًا عناوين URL باستخدام المفتاح الأساسي (primary key) للقوالب [[Laravel/eloquent|Eloquent]]. ولهذا السبب تستطيع تمرير نماذج [[Laravel/eloquent|Eloquent]] كقيم مُعاملة. سيستخرج المساعد <code>route</code> مفتاح النموذج الأساسي تلقائيًا:<syntaxhighlight lang="php">
 
echo route('post.show', ['post' => $post]);
 
echo route('post.show', ['post' => $post]);
  
سطر 54: سطر 52:
  
 
=== العناوين URL الموقَّعة ===
 
=== العناوين URL الموقَّعة ===
يسمح لك Laravel بإنشاء عناوين URL "مُوقّعة" بسهولة للمسارات المسمّاة. لهذه العناوين "توقيع" مُشفّر (hash) يُلحق بسلسلة الاستعلام النصيّة مما يسمح بالتحقق من عدم تعديل العنوان URL منذ إنشائه.
+
يسمح لك [[Laravel]] بإنشاء عناوين URL "مُوقّعة" بسهولة للمسارات المسمّاة. لهذه العناوين "توقيع" مُشفّر (hash) يُلحق بسلسلة الاستعلام النصيّة مما يسمح بالتحقق من عدم تعديل العنوان URL منذ إنشائه.
 
تُعتبر العناوين URL الموقّعة مفيدة جدًّا للمسارات المفتوحة للعموم (publicly accessible) لكن تحتاج لطبقة من الحماية ضد التلاعب بالعناوين URL.
 
تُعتبر العناوين URL الموقّعة مفيدة جدًّا للمسارات المفتوحة للعموم (publicly accessible) لكن تحتاج لطبقة من الحماية ضد التلاعب بالعناوين URL.
  
قد تستخدم على سبيل المثال عناوين URL موقّعة لتنفيذ رابط "إلغاء اشتراك" عام يُرسل عبر البريد الإلكتروني إلى عملائك. لإنشاء عنوان URL موقّع لمسار مسمّى، استخدم التابع signedRoute للواجهة الساكنة URL:<syntaxhighlight lang="php">
+
قد تستخدم على سبيل المثال عناوين URL موقّعة لتنفيذ رابط "إلغاء اشتراك" عام يُرسل عبر البريد الإلكتروني إلى عملائك. لإنشاء عنوان URL موقّع لمسار مسمّى، استخدم التابع <code>signedRoute</code> للواجهة الساكنة URL:<syntaxhighlight lang="php">
 
use Illuminate\Support\Facades\URL;
 
use Illuminate\Support\Facades\URL;
  
 
return URL::signedRoute('unsubscribe', ['user' => 1]);
 
return URL::signedRoute('unsubscribe', ['user' => 1]);
  
</syntaxhighlight>إن رغبت في إنشاء URL مسار مُوقّع مؤقت، تستطيع استخدام التابع temporarySignedRoute:<syntaxhighlight lang="php">
+
</syntaxhighlight>إن رغبت في إنشاء URL مسار مُوقّع مؤقت، تستطيع استخدام التابع <code>temporarySignedRoute</code>:<syntaxhighlight lang="php">
 
use Illuminate\Support\Facades\URL;
 
use Illuminate\Support\Facades\URL;
  
سطر 72: سطر 70:
  
 
==== التحقق من طلبات المسار المُوقّعة ====
 
==== التحقق من طلبات المسار المُوقّعة ====
يجب استدعاء التابع hasValidSignature في الطلب الوارد للتحقق صلاحيّة توقيعه:<syntaxhighlight lang="php">
+
يجب استدعاء التابع <code>hasValidSignature</code> في الطلب الوارد للتحقق صلاحيّة توقيعه:<syntaxhighlight lang="php">
 
use Illuminate\Http\Request;
 
use Illuminate\Http\Request;
  
سطر 83: سطر 81:
 
})->name('unsubscribe');
 
})->name('unsubscribe');
  
</syntaxhighlight>يمكنك تعيين البرمجيّة الوسيطة Illuminate\Routing\Middleware\ValidateSignature على المسار كبديل. يجب تعيين مفتاح على هذه البرمجيّة الوسيطة في مصفوفة نواتك HTTP المسمّاة routeMiddleware إن لم يوجد مسبقا:<syntaxhighlight lang="php">
+
</syntaxhighlight>يمكنك تعيين البرمجيّة الوسيطة <code>Illuminate\Routing\Middleware\ValidateSignature</code> على المسار كبديل. يجب تعيين مفتاح على هذه البرمجيّة الوسيطة في مصفوفة نواتك HTTP المسمّاة <code>routeMiddleware</code> إن لم يوجد مسبقا:<syntaxhighlight lang="php">
 
/**
 
/**
 
  * برمجيّة المسار الوسيطة للتطبيقك.
 
  * برمجيّة المسار الوسيطة للتطبيقك.
سطر 102: سطر 100:
  
 
== URLs لأفعال وحدات التحكّم ==
 
== URLs لأفعال وحدات التحكّم ==
ستولّد الدالّةaction عنوان URL لفعل وحدة التحكّم المحدّد. لا تحتاج إلى تمرير مجال الاسم الكامل لوحدة التحكم. مرّر اسم صنف وحدة التحكّم نسبة لمجال اسم App\Http\Controllers بدل ذلك:<syntaxhighlight lang="php">
+
ستولّد الدالّة <code>action</code> عنوان URL لفعل وحدة التحكّم المحدّد. لا تحتاج إلى تمرير مجال الاسم الكامل لوحدة التحكم. مرّر اسم صنف وحدة التحكّم نسبة لمجال اسم <code>App\Http\Controllers</code> بدل ذلك:<syntaxhighlight lang="php">
 
$url = action('HomeController@index');
 
$url = action('HomeController@index');
  
سطر 114: سطر 112:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== القيم الإفتراضيّة ==
+
== القيم الافتراضيّة ==
 
قد ترغب بتطبيقات معيّنة في تحديد قيم افتراضية  لمعاملات عناوين URL معيّنة على مستوى الطلب كاملا.  تخيّل على سبيل المثال أنّ العديد من مساراتك تعرّف معاملة {locale}:<syntaxhighlight lang="php">
 
قد ترغب بتطبيقات معيّنة في تحديد قيم افتراضية  لمعاملات عناوين URL معيّنة على مستوى الطلب كاملا.  تخيّل على سبيل المثال أنّ العديد من مساراتك تعرّف معاملة {locale}:<syntaxhighlight lang="php">
 
Route::get('/{locale}/posts', function () {
 
Route::get('/{locale}/posts', function () {
 
   //
 
   //
 
})->name('post.index');
 
})->name('post.index');
</syntaxhighlight>من المرهق أن تمرّر locale (اللغة) دائمًا كل مرة تنادي فيها المُساعد route. لذلك تستطيع استخدام التابع URL::defaults لتحديد قيمة افتراضية لهذه المُعاملة التي ستطبّق دائمًا أثناء الطلب الحالي. قد ترغب في مناداة هذا التابع من برمجيّة مسار وسيطة كي تتمكن من الوصول إلى الطلب الحالي:<syntaxhighlight lang="php">
+
</syntaxhighlight>من المرهق أن تمرّر locale (اللغة) دائمًا كل مرة تنادي فيها المُساعد <code>route</code>. لذلك تستطيع استخدام التابع <code>URL::defaults</code> لتحديد قيمة افتراضية لهذه المُعاملة التي ستطبّق دائمًا أثناء الطلب الحالي. قد ترغب في مناداة هذا التابع من برمجيّة مسار وسيطة كي تتمكن من الوصول إلى الطلب الحالي:<syntaxhighlight lang="php">
 
<?php
 
<?php
  
سطر 139: سطر 137:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
بمجرّد تعيين القيمة الافتراضية للمعاملة locale لن تحتاج لتمرير قيمتها عند توليد عناوين URL عبر المساعد route.
+
بمجرّد تعيين القيمة الافتراضية للمعاملة <code>locale</code> لن تحتاج لتمرير قيمتها عند توليد عناوين URL عبر المساعد <code>route</code>.
  
 
== مصادر ==
 
== مصادر ==
 
* [https://laravel.com/docs/5.6/urls صفحة URL Generation من توثيق Laravel الرسمي.]
 
* [https://laravel.com/docs/5.6/urls صفحة URL Generation من توثيق Laravel الرسمي.]
 +
[[تصنيف:Laravel|{{SUBPAGENAME}}]]
 +
[[تصنيف:Laravel Basics|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 13:22، 23 أكتوبر 2018

مقدمة

يوفّر Laravel العديد من المساعدين لمساعدتك في إنشاء عناوين URL لتطبيقك. فائدتهم الأساسية تظهر طبعا عند بناء روابط في قوالبك (templates) واستجابات الواجهة البرمجيّة، أو عند توليد ردود إعادة توجيه إلى جزء آخر من تطبيقك.

الأساسيات

توليد عناوين URL أساسية

يمكن استخدام المساعد url لتوليد عناوين URL عشوائية لتطبيقك. سيستخدم العنوان URL المُنشأ تلقائيًا المخطَّط (HTTP أو HTTPS) ويستضيف من الطلب الحالي:

$post = App\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

الوصول إلى العنوان URL الحالي

سترد النسخة Illuminate\Routing\UrlGenerator إن لم يُوفّر أي مسار إلى المساعد url، مما يتيح لك الوصول للمعلومات حول العنوان URL الحالي:

//   تحصّل على العنوان الحالي بدون سلسلة الاستعلام ...
 

echo url()->current();

// احصل على العنوان الحالي بما في ذلك سلسلة الاستعلام ...
echo url()->full();

// احصل على العنوان الكامل للطلب السابق ...
echo url()->previous();

يمكن الوصول لكل هذه التوابع عبر الواجهة الساكنة URL:

use Illuminate\Support\Facades\URL;

echo URL::current();

يمكن الوصول لكل تابع من هذه التوابع عبر الواجهة الساكنة URL:

use Illuminate\Support\Facades\URL;

echo URL::current();

العناوين URL للمسارات المسمّاة

يمكن استخدام المساعد route لتوليد العناوين URL للمسارات المُسمّاة. تتيح لك المسارات المُسمّاة توليد عناوين URL دون أن يقترن بالعنوان URL الفعلي المحدّد في المسار. وهكذا لا تحتاج لعمل أي تغييرات لنداءات دوال مسارك (function) إن تغيّر العنوان URL للمسار.  تخيل على سبيل المثال أن تطبيقك يحتوي على مسار محدد كما يلي:

Route::get('/post/{post}', function () {
   //
})->name('post.show');

لتوليد عنوان URL لهذا المسار تستطيع استخدام المساعد route على النحو التالي:

echo route('post.show', ['post' => 1]);

// http://example.com/post/1

ستولّد غالبًا عناوين URL باستخدام المفتاح الأساسي (primary key) للقوالب Eloquent. ولهذا السبب تستطيع تمرير نماذج Eloquent كقيم مُعاملة. سيستخرج المساعد route مفتاح النموذج الأساسي تلقائيًا:

echo route('post.show', ['post' => $post]);

العناوين URL الموقَّعة

يسمح لك Laravel بإنشاء عناوين URL "مُوقّعة" بسهولة للمسارات المسمّاة. لهذه العناوين "توقيع" مُشفّر (hash) يُلحق بسلسلة الاستعلام النصيّة مما يسمح بالتحقق من عدم تعديل العنوان URL منذ إنشائه. تُعتبر العناوين URL الموقّعة مفيدة جدًّا للمسارات المفتوحة للعموم (publicly accessible) لكن تحتاج لطبقة من الحماية ضد التلاعب بالعناوين URL.

قد تستخدم على سبيل المثال عناوين URL موقّعة لتنفيذ رابط "إلغاء اشتراك" عام يُرسل عبر البريد الإلكتروني إلى عملائك. لإنشاء عنوان URL موقّع لمسار مسمّى، استخدم التابع signedRoute للواجهة الساكنة URL:

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);

إن رغبت في إنشاء URL مسار مُوقّع مؤقت، تستطيع استخدام التابع temporarySignedRoute:

use Illuminate\Support\Facades\URL;

return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);

التحقق من طلبات المسار المُوقّعة

يجب استدعاء التابع hasValidSignature في الطلب الوارد للتحقق صلاحيّة توقيعه:

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }

   // ...
})->name('unsubscribe');

يمكنك تعيين البرمجيّة الوسيطة Illuminate\Routing\Middleware\ValidateSignature على المسار كبديل. يجب تعيين مفتاح على هذه البرمجيّة الوسيطة في مصفوفة نواتك HTTP المسمّاة routeMiddleware إن لم يوجد مسبقا:

/**
 * برمجيّة المسار الوسيطة للتطبيقك.
 * 
 * يمكن تعيين هذه البرمجيّات الوسيطة على مجموعات أو استخدامها على حدة
 *
 * @var array
 */
protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];

بمجرد تسجيلك للبرمجيّة الوسيطة في النواة، يمكنك إرفاقها بأي مسار. سترد البرمجيّة الوسيطة تلقائيًا استجابة خطأ 403 إن لم يكن توقيع الطلب الوارد صالحا:

Route::post('/unsubscribe/{user}', function (Request $request) {
   // ...
})->name('unsubscribe')->middleware('signed');

URLs لأفعال وحدات التحكّم

ستولّد الدالّة action عنوان URL لفعل وحدة التحكّم المحدّد. لا تحتاج إلى تمرير مجال الاسم الكامل لوحدة التحكم. مرّر اسم صنف وحدة التحكّم نسبة لمجال اسم App\Http\Controllers بدل ذلك:

$url = action('HomeController@index');

يمكنك أيضًا الإشارة للأفعال باستخدام صيغة مصفوفة "قابلة للاستدعاء":

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

تستطيع تمرير معاملات المسار كمتغيّر وسيط ثاني للدالة إن تقبّلتهم دالّة المتحكّم:

$url = action('UserController@profile', ['id' => 1]);

القيم الافتراضيّة

قد ترغب بتطبيقات معيّنة في تحديد قيم افتراضية  لمعاملات عناوين URL معيّنة على مستوى الطلب كاملا.  تخيّل على سبيل المثال أنّ العديد من مساراتك تعرّف معاملة {locale}:

Route::get('/{locale}/posts', function () {
   //
})->name('post.index');

من المرهق أن تمرّر locale (اللغة) دائمًا كل مرة تنادي فيها المُساعد route. لذلك تستطيع استخدام التابع URL::defaults لتحديد قيمة افتراضية لهذه المُعاملة التي ستطبّق دائمًا أثناء الطلب الحالي. قد ترغب في مناداة هذا التابع من برمجيّة مسار وسيطة كي تتمكن من الوصول إلى الطلب الحالي:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);

        return $next($request);
    }
}

بمجرّد تعيين القيمة الافتراضية للمعاملة locale لن تحتاج لتمرير قيمتها عند توليد عناوين URL عبر المساعد route.

مصادر