سلام و درود
من میخواستم یه سیستم احراز هویت در php mvc بسازم. کاری که من کردم این هست که اطلاعات کاربر به صورت session ذخیره میشه.
مشکلی که من دارم اینه که وقتی میخوام اطلاعات کاربر لاگین شده رو جای دیگه ای استفاده کنم و نشون بدم وقتی session رو داخل یه کلاس استارت میکنم ارور میده جوری که خیلی از حالت هارو چک کردم اما باز به استارت کردن سشن ارور میده.... البته یک بار سشن قبلش توی فایل cobfig استارت میشه برای ثبت اطلاعاتش
که مجبور شدم توی فایل config جدای از کلاس ها سیشن رو استارت کنم یعنی که توی همه ی صفحات استارت شده هستش... آیا این کار درسته... اینکه سشن همیشه استارت باشه تا چه حد میتونه مشکل ساز باشه توی لود صفحه
اگر هم نمونه ای از احراز هویت و این سیستم داخل php داشته باشین ممنون میشم معرفی کنین
@Serjik
سلام خدمت شما
اگه توی همه صفحات از اطلاعات کاربر استفاده میکنید مشکلی از این بابت که همه جا استارت باشه نیست ولی اگه تو جاهای خاصی میخواین استفاده کنید بهتره همونجا فقط استفاده کنید ... اگر هم موقع استارت کردن ارور میده بهتره بود متن ارور رو بفرستین
ولی حتما این نکات رو بررسی کنید :
اول اینکه بهتره داخل کلاس سشن رو استارت نکنید شما داخل همون کلاس از سشن استفاده کنید بعد هرجایی که از اون کلاس استفاده کردید سشن رو اونجا استارت کنید
و اینکه حتما سشن رو ابتدای همه کد ها استارت کنید قبلش حتی یک نقطه هم وجود نداشته باشه ( باعث بوجود اومدن مشکلات ارسال هدر میشه ) که ممکنه همین اروری هم که برای شما میاد همون باشه
به انکودینگ فایلتونم دقت کنید که حتما به صورت UTF8-without BOM باشه ( همینم میتونه موجب ارسال شدن هدر ها قبل استارت شدن سشن ها باشه )
میتونید با ادیتور notepad++ انکودینگ رو تغییر بدید .
اگه بازم مشکلتون رفع نشد متن ارور رو بفرستین دوستان کامل تر بررسی میکنن .
Warning: session_start(): Cannot start session when headers already sent in C:\xampp\htdocs\NanoRoyal\app\Libraries\Session_Helpers.php on line ۱۳
این ارور هست
و این هم کدم
class Session_Helpers
{
public function __construct()
{
session_start();
}
public function say($name, $data = null)
{
if (isset($data) && $data != null) {
if (!isset($_SESSION[$name])) {
$_SESSION[$name] = $data;
}
} else {
if(isset($_SESSION[$name]) && $_SESSION[$name]!=null){
return $_SESSION[$name];
} else {
return false;
}
}
}
}
@Serjik
خب گفتم که همه اینارو یه بار دیگه با دقت بخونید
الان میگه هدر ها ارسال شده واس همین نمیتونه session_start کنه !
داخل خود کلاس سشن رو استارت نکن هر موقع خواستی از سشن تو هر صفحه ای استفاده کنی بالای بالای صفحه سشن رو استات کن قبلش یه نقطه هم نباشه
@m.a3raham
روشی که گفتید رو متوجه شدم اما اگه بخوام که چیزی از استارت کردن سیشنها داخل صفحاتم نباشه جز کنترلر ها چی
مثلا لاراول چطور اینکاررو میکنه
@Serjik
والا راستش من با لاراول آشنایی ندارم ... اینو باید بقیه دوستان که کار کردن بگن لاراول چطوری این کارو انجام میده
ولی اگه کلی میخواید این مشکل ارسال شدن هدر رو بدون اینکه کداتونو تغییر بدید حل کنید
به فایل php.ini برید و یه قسمتی است به نام output_buffering اون رو روی 4096 قرار بدید تا یکمی با تاخیر هدر هارو ارسال کنه و این مشکل پیش نیاد .
@ali.bayat
میشه بیشتر بگید توی چه قسمتی
وقتی که auth صدا زده میشه یا اینکه کلا سیشن استارته
یا مورد دیگه ای ....
@ali.bayat
میتونید کمکم کنید یه چیزی شبیه به auth لاراول بسازم که مجبور نشم توی هر صفحه سیشن استارت کنم
@Serjik
لاراول از درایورهای مختلفی برای ثبت اطلاعات سشنها استفاده میکنه. (file, array, cookie, database و حتی redis)
که داخل فایل config/session.php قابل تنظیمه. اما مدیریت این درایورها بعهده کلاسی بنام SessionManager هست
https://github.com/igorw/laravel-framework/blob/master/src/Illuminate/Session/SessionManager.php
این کلاس هم خودش از چندین کلاس دیگه استفاده میکنه
use Illuminate\Support\Manager;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler;
به عبارتی برای پیادهسازی این سیستم در vanilla php شما باید تمام این کلاسها٬ اینترفیسها و کلاسهای abstract رو بعلاوه وابستگی هاشون رو در نظر بگیرید و به کدتون اضافه کنید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟