Namespace چیست و نحوه استفاده از Namespace در لاراول
به درخواست یکی از دوستان این مطلب رو در مورد فضای نام (namespace) درلاراول آماده کردم که خدمت دوستان ارائه می کنم
برای درک چگونگی ساختار برنامه خود مخصوصا لاراول 5 ، شما باید مفهوم namespacing را به خوبی درک کنید.
اول یک توضیحاتی در مود خود namespace که کلا چی هست و به چه دردی می خوره ( شاید این قسمت برای بعضی دوستان کمی خسته کننده باشد اما باید گفت ، شاید بعضی دوستان زیاد آشنا نباشن ) عرض می کنم .
به شکل ساده میتوان گفت Namespace( فضای نام ) به منظورطبقه بندی گروهی از متغییر ها ، توابع و کلاس ها استفاده می شود . یعنی هر شناسه ای اعم از اسم متغیر، اسم تابع، اسم کلاس و هر چیز دیگه توی این فضا فقط توسط سایر اعضای مشترک شده (استفاده کننده) این فضا به صورت مستقیم در دسترس هست.
برای درک بهتر این مطلب را با یک مثال از Namespace ادامه می دم ، اینکه اگر از Namespace در برنامه نویسی پروژه با فریم ورک لاراول یا هر فریم ورکی غیر از لاراول استفاده کنیم چه مزایایی داره و اگر استفاده نکنیم چه مشکلاتی خواهیم داشت
فرض کنید شما در حال نوشتن یک CMS برای یک وب سایت مدرسه هستید ، شما ممکن است یک کلاس مدیر(admin) برای مدیریت کاربرمدیر CMS داشته باشید روی که سایت کنترل داشته باشد، حالا در نظر بگیرید که هر مدرسه یک نفر مدیر دارد برای نظارت روی اعمال کارکنان ، معلمان و دانش آموزان پس یک کلاس مدیر(admin) هم برای مدرسه داریم ، حالا در نظر بگیرید که می خواهیم یک مدیر مدرسه اضافه کنیم تشخیص اینکه ما در مورد کدام یک از این مدیر ها صحبت می کنیم به عهده namespace هست که ما را از گمراهی و اشتباه به دور می کند .
به طور کلی، فقط یک کلاس می تواند با یک نام خاص در یک محدوده خاص وجود داشته باشد. بنابراین داشتن دو کلاس هر دو به نام مدیر(admin) در محدوده یکسان ممکن نیست . یک namespace محدوده را تعریف می کند به طوری که دو کلاس با نام مدیر(admin) می توانند در namespace متفاوت وجود داشته باشند .
به عبارت ساده تر یک دسته کلاس های مرتبط به هم رو داخل یک namespace قرار می دهیم ، مشکل هم نام بودن نام کلاس ها و متدها را هم حل می شود .
بنابراین،برای مثال بالا، کلاس های استفاده کننده از namespace به شکل زیر می باشد :
Cms\Roles\Admin Staff\Admin
استفاده از namespace در لاراول بسیار گسترده است ، Application
و کلاس های Kernel
فقط چند نمونه ساده استفاده از آن می باشد.
Illuminate\Console\Application Illuminate\Foundation\Application Illuminate\Foundation\Console\Kernel Illuminate\Foundation\Http\Kernel
Namespace در لاراول
اگر به محتویات فایل composer.json نگاه کنید، یک شی با مالکیت autoload.psr-4 را پیدا خواهید کرد .
"autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/" } },
ما دراینجا به Composer می گوییم که autoloader را با استاندارد PSR-4 ، برای namespace با عنوان App تنظیم کند .
آرایه autoload.classmap مشخص کننده دایرکتوری می باشد که کلاس های ضمیمه پروژه در آن قرار می گیرند .
تغییر Namespace در لاراول
برای این کار از Artisan کمک می گیریم ، عملیات زیر را در خط فرمان اجرا می کنیم .
نام تعیین شده ما برای پروژه LaraWork می باشد .
$ php artisan app:name LaraWork
حال مجددا به فایل composer.json برمی گردیم و می بینم که مقدار مشخص شده برای namespace تغییر کرده است .
"psr-4": { "LaraWork\\": "app/" }
اطلاعاتی که در زمینه Namespace در لاراول دادین خیلی به من کمک کرد ممنون
سلام ، مرسی بخاطر مطلب خوبتون ، یک سوال…
فرقی داره که من یک پکیج رو با کمپوزر نصب کنم یا بصورت دستی دانلود و نصبش کنم؟
من الان ی پکیج کمپوزر رو با کمپوزر نصب کردم و فولدرش توی vendor/ye_chizi ایجاد شد
حالا توی یه پروژه ی لاراولی دیگه همین رو کپی کردم و خطا میده… و احتمالا خطاش مربوط به همین فضای نامه… ممنون میشم جواب بدید
پ ن : بعد از کپی composer dump:autoload رو هم اجرا کردم و بازم نشد
بله فرق داره. کامپوزر برای مدیریت پکیجها و نسخههاشونه. و کپی کردن فلسفه وجودیشونو میبره زیر سوال
اخطارشم به خاطر نبودن فایل composer.lock میتونه باشه
مرسی ولی پس پکیج ها رو دستی چجوری نصب کنم؟ باید بشه دیگه…
مثلا من توی هاستم دسترسی به ssh ندارم… باید پکیج رو دستی آپلود کنم…
امیر عزیز
یکی از ایراداتی که به طراحی پروژه با فریم ورک لاراول و ابزار های مشابه می گیرند همینه!
واقعا کمتر هاسنی پیدا میشه که دسترسی ssh بده و نسخه php اون 5.5.9 باشه . اکثرا پروژه های لاراولی رو روی سرور های مجازی و با اختصاصی راه اندازی می کنند .
روش درست اینه که شما بری رو سرورت از گیت pull کنی و یه بار composer update —no-dev بزنی.
اما واسه سوالت این نکنه رو عرض کنم :
شماباید فایل composer.lock رو به همراه پوشه vendor آپلود کنی، شاید کار کنه
خیلی عالی بود احسان جان
ممنونم علی جان .
فوق العاده بود!مثل همیشه
خیلی ممنون. مطالب برنامه نویسی فارسی محدود هستند.