یلدا ادامه داره... ❤️ ۴۰ درصد تخفیف همه دورهها
استفاده از تخفیفهامن روی یک پروژه ای کار میکنم که سه سطح کاربری به عنوان های ادمین، فروشنده و خریدار هست.برای تمام این کاربران یه تم واحد در نظر گرفته شده ولی برای هر کدوم از درسترسی ها یک نسخه با تغییرات متفاوت قرار داده ایم.روت های این سه دسته تقریبا 80 درصد مثل هم هست مثلا هر سه کاربر یک روت با ادرس "/dashboard" در نظر گرفته شده.
اگه توجه کرده باشین بالا گفتم که تمام کاربران با روت مشابه به داشبرد خود دسترسی دارند.
اگه بخوام بیشتر بگم مصلما همه جا دیدیم که مثلا میگند روت "/admin/dashboard" مخصوص داشبرد ادمین و بقیه دسترسی ها هم یه prefix قبل از "/dashboard" دارند. کاری که من میخوام اجرایی بکنم اینه که بجای این که با prefix داشبرد کاربران را جدا کنم از دیتابیس تایپ کاربران رو بخونم و روت های مخصوص به اون کاربر فقط براش قابل دسترس بشه.
حالا روش هایی که تست کردم رو میگم شاید با اون روش قابل انجام بوده ولی اشتباه از من بوده.
1) داخل فایل web.php یه شرط if قرار دادم و خواستم که باتوجه به تایپ کاربر روت هایی که مخصوص به اون کاربر هست رو اجازه دسترسی بدم.اوایل پروژه به صورت استاتیک شرط ها رو true میکردم تا یه ساختار کلی از پروژم بدست بیاد و در نظر داشتم که بعدا یک هلپری به پروژه اضافه میکنم و داخل اون هلپر با استفاده از Auth اطلاعات اون کاربری که لاراول قصد روتدهی داره رو بگیرم و تایپش رو برگردونم داخل اون if اگه بد توضیح دادم داخل عکس ها کدم رو میزارم :
عکس بالا عکس فایل روت web هست بالا هم توضیح دادم اول استاتیک بود بعد با هلپر تست کردم مشکل هلپر این بود که هلپر auth() ست نمیشد و null بر میگردوند و چیزی که متوجه شده هلپر auth() بعد از وریفای کارد روت ست میشه منظورم اینه که لاراول میاد تو web.php دنبال روت میگرده میره چک میکنه ویو، کنترولر یا هر چیز دیگه ای رو چک میکنه اگر اوکیه بعد auth() رو میره ست میکنم ولی من قبل از این چک کردن میخواستم از این هلپر استفاده کنم که موفق نبود این روش.
تست بعدیم این بود که یه میدلویر role بزارم روی تمام روت ها که تایپ کاربر رو مشخص کنه و داخل سشن ست کنه و من مقدار رو از سشن بگیرم و و داخل شرطم قرار بدم که این تست هم موفق نبود چون که ظاهرا میدلویر بعد از پیدا کردن روت روی روت اجرا میشه و من ایده ای که داشتم این بود که زمانی که به گروپ میدلور میرسه این میدلور اجرا میشه ولی این طور نبود.
منظور از پیدا کردن روت اینه که من روت هارو داخل if قرار دادم و زمانی که شرط true نشه اون بلاک شرط اجرا نمیشه و انگار که اون روت وجود نداره.
ایده دومم این بود که با میدلویرها دسترسی هر کاربر رو به روت های مخصوص خودشون کنترل کنم
داخل میدلویر ها به متد auth() دسترسی داشتم ولی مشکل این بود که نتونستم شرط درستی داخل میدلویر اجرا کنم یا ممکنه که این کار بااین روش اجرایی نیست
من برای هر تایپ کاربرم یه گروپ روت درست کردم و روی هر سه گروپ میدلویر role را گزاشتم و بر اساس تایپ روت ها یه ورودی دادم و ایدم این بود که اگه داخل میدلویر شرطی که گزاشتم اوکی بود و true برگردوند به کاربر دسترسی بده.
عکس بالا فایل web.php هست
این هم فایل میدلویرم که داخلش تایپ یوزر رو چک میکردم مشکل این روش این بود که شرطم درست کار نمیکرد و همیشه "/dashboard" گروت اخرم توی تایل روت ها اجرا میشد...
میدونم یکم زیاد توضیح دادم ولی خواستم اگه کسی یکم کمتر از لاراول میدونه متوجه بشه اومیدوارم که با توضیح زیادی گیج نشده باشین و ممنون میشم که تمام پیشنهادات و راه حل هاتون رو درمیون بزارید.
تشکر و عرض خسته نباشید به همگی بخصوص این اعضای این سایت :)
سلام
شما با استفاده از بحث role و permission و به کار بردن ACL به سادگی می تونید همین کار ها را انجام دهید.
@mamadZirone
@mohaligateway خیلی ممنون از این که وقت گزاشتین و تا الان چیزی درباره این مواردی که گفتین نشنیدم و حتما به دنبال یادگیری این موارد میرم و سوالی که ازتون دارم این کاریکه من میخواستم انجام بدم اصلا با میدلویر ها قابل انجام هست؟من تا چه حدی از این روند رو درست رفتم.
بله اساس role و permission ها هم بر اساس middle هستش. شما یک middleware برای ادمین ایجاد می کنید و در route قرار میدید. و یک موضوع دیگری که کد شما رو نامنظم کرده و همواره باید در پروژه هاتون در نظر داشته باشید این هست که داخل web.php از دستورات مثل if کمتر استفاده کنید. با بزرگ شدن پروژه بهم ریختگی در کد ها به وجود میاد. در دوره های آموزشی همین سایت تمامی این موارد آموزش داده شده است.
@mamadZirone
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟