عبدالفتاح الصلوي

كيف تغير مسار مجلد public في Laravel 10.x

كتبها : عبدالفتاح الصلوي / في رصيف : Laravel

كيف تغير مسار مجلد public في  Laravel 10.x

أحياناً تحتاج كمبرمج يستخدم laravel لتغيير مسار مجلد ال public إلى public_html أو أي اسم . فمثلاً عند رفع موقع أو متجر الكتروني على استضافة، كثيراً ما يتم استخدام اسضافة مشتركة shared، ولأسباب كثيرة أهمها الأمان وحماية الملفات والكود من الوصول غير المصرح به، فمجلد ال public_html كما يشير إسمه، مجلد عام وهو المكان الذي يستقبل زوار موقعك، وهؤلاء الزوار احياناً لا يكون مرحباً بهم. فهذا المجلد يعادل مجلد الpublic في بنية إطار العمل laravel والملفات التي توضع فيه ملفات عامة مثل ملفات الcss،javascript والصور وما شابه.

عادة وكاجراء أمني يقوم المطورين برفع ملفات الموقع في مجلد أبوي بجوار مجلد ال public_html

فمثلا يكون المسار حينها مشابه لما يلي:

/Home/laravelproject مسار مجلد المشروع 
/Home/public_html 

(laravelproject) هنا تشير الى اسم المجلد الذي ستسميه انت لمشروعك

ومن ثم يتم نقل ملفات مجلد public الى public_html وبعدها يتم تعديل المسارات في ملف index.php لتتوافق مع المسار الجديد لمشروعنا، عن طريق (..) التي من المعروف انها تستخدم للاشارة الى المجلد الأبوي.

ما هي المسارات الموجودة في ملف index.php؟

عندما نقوم باستعراض هذا الملف سنلاحظ وجود ثلاثة مسارات المسار الأول في جملة الشرط

if (file_exists($maintenance = __DIR__ . '/../storage/framework/maintenance.php')) {    
require $maintenance;
}

هذه الاسطر تستخدم لفحص حالة المشروع هل هو في وضع الصيانة ؟ من خلال فحص وجود ملف maintenance.php وهذا الملف يتم انشاءه عن طريق الأمر : php artisan down

ويستخدم كما يشير اسمه لعرض صفحة تخبر الزوار بأن المشروع في وضع الصيانة .

وبعد تحديث هذا المسار يفترض أن يصبح كما يلي

if (file_exists($maintenance = __DIR__ . '/../laravelproject/storage/framework/maintenance.php')) {    
require $maintenance;
}

المسار الثاني :


require __DIR__ . '/../vendor/autoload.php';

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

المهم الآن هو شكل المسار بعد تحديثه فيفترض ان يشبه المسار التالي :

require __DIR__ . '/../laravelproject/vendor/autoload.php';

المسار الثالث :


$app = require_once __DIR__ . '/../bootstrap/app.php';

هنا يكمن مربط الفرس، فهذا المسار يشير إلى كامل المشروع والذي عبره يتم معالجة الطلب القادم من المستخدم ومن ثم معالجته وارجاع الresponse ليتم عرضه على المتصفح لتكتمل سعادة مستخدمنا الجميل . فمتغير ال $app هو المشروع وله الصلاحية في تمثيله والحديث بإسمه يا سادة.

فلا تنسى عزيزي المبرمج من تغيير المسار هنا أيضاً حيث سيبدو حينها

$app = require_once __DIR__ . '/../laravelproject/bootstrap/app.php';


إذا أكملت الخطوات السابقة بشكل صحيح فيفترض أن يعمل المشروع ولن يظهر أي خطأ . ونقصد بشكل صحيح هنا أن يكون المسار صحيح وكذا !صدار الphp متوافق مع الإصدار المستخدم في الcomposer .

ولكن لــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــكن لكن ، ستظهر مشكلة صغيرة عند استخدام دالة ال public_path ستجدها تعيد لنا المسار الإفتراضي وهو المسار الذي يشير إلى مجلد public ونحن بالطبع لا نريد ذلك فقد استبدلنا هذا المجلد بمجلد ال public_html ولحل هذا الإشكال كنا في الإصدارات السابقة من laravel أي الإصدارات ما قبل 10 نستخدم الدالة bind في ال $app في حال تم طلب مسار ال public.path


$app->bind('path.public', function () {
 return __DIR__;
});


حيث يتم إضافة هذا الكود في صفحة ال index بعد سطر استيراد وتعريف مسار متغير $app الذي تحدثنا عنه مسبقاً . إلى هنا كما اشرنا فهذا سيحل المشكلة كما اشرنا في الإصدارات ما قبل 10 .

عزيزي القارئ الجميل يبدو أنك قد وصلت إلى هنا لأنك واجهت مشكلة في الإصدار السابق وأنك تعلم بكل ما سبق من معلومات وتريد حل لمشكلتك سريعاً. ومن ثم تسأل بصراخ أين الحل ؟

ساجيب عليك لا أدري . وبالطبع أنا هنا فقط اريدك أن تبتسم وتهدأ لأنه حان الوقت لشكر عمنا تايلور والمطورين في laravel والأهم الحديث عن دالة usePublicPath


$app->usePublicPath(__DIR__);

وهذه الدالة ستحل الإشكال وقد تم الإشارة إليها في التحديثات في الرابط التالي https://laravel.com/docs/10.x/upgrade#public-path-binding .

وهنا بالطبع سنستخدمها بدلاً من دالة bind السالفة الذكر ، أو في أي موضع مناسب مثلاً في ملف app.php في المسار bootstrap أو في register في serviceprovider ولكن سيكون عليك أن نكتب مسار مجلد public_html المناسب حيث قد تجد صعوبة معرفة المسار الصحيح في بعض الحالات. مثال استخدام الدالة في ملف app.php

$app->usePublicPath(base_path('../public_html/'));


ملاحظة : عند كتابة الدالة في index.php قد لا تعمل بشكل صحيح في حال كنا نستدعي الدالة public_path عن طريق أمر ال console لأن الأوامر لا تعبر عن طريق index فهي ليست request تأتي عن طريق المتصفح .



علامات ذات صلة :