نقل قول نوشته شده توسط rahahost مشاهده تاپیک
با سلام و احترام خدمت همه ی دوستان و اساتید محترم .

یه موردی چند روزه که منو درگیر کرده اونم استفاده از پکیج زیر هست :
https://github.com/Zizaco/entrust


این پکیج رو نصب کردم و مشکلی در نصب وجود نداره اما یه مشکل جدی وجود داره اونم اینکه ، شرطی که برای اعتبارسنجی میزارم رو بصورت دو یا چند شرطی قبول نمیکنه ، مثلا :

میخوام بگم :
دسترسی یک متد از کنترلر برای نقش مدیر و کارمندی که مسئول بخش اخبار هست ، باز باشه و در غیر اینصورت به یک پیغام نمایش بده !

کدی که برای بخش نوشتم :



if(Entrust::can('tender_manager') == false OR Entrust::hasRole('admin') == false )
{
return 'test';
}



اگه من هرکدوم از این دو شرط رو بصورت تکی بنویسم ، درست جواب میده اما نمیدونم چرا برای حال OR با این مشکل مواجه میشم !
بخاطر اینکه نمیشه تکی نوشته بشه ، نمیدونم باید چیکارش کنم !


ممنون میشم راهنماییم کنید .
کد شما از نظر منطقی مشکل داره و اون هم به نظرم به خاطر پیچیده نوشته شدن اون هست. این سناریو رو در نظر بگیرید:

کاربر مسئول بخش اخبار هست و مشخصه نقش مدیر رو هم نداره در نتیجه عبارت

Entrust::can('tender_manager')


(برام سوال هست شما دارید نقش رو بررسی می کنید چرا به جای hasRole از can استفاده کرده اید؟ can برای انجام یه کار هست مثلا manage-news یا create-article یا accept-comment و ... )

برابر true خواهد شد و قسمت اول OR یا || نادرست خواهد شد در نتیجه عبارت بعد از OR یا || بررسی می شود. چون مسئول بخش اخبار مدیر نیست در نتیجه قسمت دوم برابر با true خواهد بود و وارد if می شویم!

--------------------------

این حالتی هست که کد شما قراره کار کنه و کاربر اخبار رو مدیریت کنه:

اگر مدیر یا مسئول بخش اخبار بود:


if(Entrust::can('tender_manager') || Entrust::hasRole('admin')) {
// Manage the news!
}


برعکس این عبارت با توجه به قانون دمورگان میشه این:


if(!Entrust::can('tender_manager') && !Entrust::hasRole('admin')) {
// You cannot manage the news!
}


--------------------
در ضمن اگه از لاراول ۵.۱.۱۱ به بالا استفاده می کنید می تونید از Gate لاراول برای اینکار استفاده کنید (بدون نیاز به نصب پکیج خاص!)
http://laravel.com/docs/5.1/authorization