۹ مهران
سوال درباره auth
جامعه پی اچ پی ایجاد شده در ۲۲ مرداد ۱۴۰۲

سلام . چرا استاد مثل پروژه قبل توی authentication از redirect استفاده نکرد و include کرد فایلها را ؟

سلام مهران عزیز

کد مورد نظر و دقیقه ویدیو رو بفرست بررسی کنم.

احمدرضا فاطمی کیا ۲۲ مرداد ۱۴۰۲، ۱۲:۳۶

سلام . این کد مورد نظره

if (isLoggedIn()) {
    //redirect(baseUrl("adminauth.php"));
    include "tpl/tpl-adm.php";
} else {
    include "tpl/tpl-adm-auth.php";
}

من سعی کردم که redirect کنم اما هر کاری کردم نشد $_POST را روی فایل خروجی ببینم منظورم اینجاست


if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST["username"];
    $password = $_POST["password"];
    $result = login($username, $password);
    if (!$result) {
        echo "Failed Username Or password!";
    }
}

توی پروژه 7todo همین مسئله با redirect به فایل auth اوکی شده یود در دقیقه 11:53 ببینید

مهران ۲۲ مرداد ۱۴۰۲، ۱۲:۴۳

خب این روش اینکلود که راحت‌تر و بهتر هستش.

چون شما ساختار پروژتون طوری هست که نباید به پوشه تمپلیت‌ها ریدایرکت کنید و باید اینکلود کنید.

اگر میخواید صفحه جدا برای ورود ادمین داشته باشید یک فایل دیگه ایجاد کنید و فایل لاگین رو اینکلود کنید داهلش و اکشن فرم رو به فایل بررسی اطلاعات تغییر بدید و با درست بودن اطلاعات به فایل ادمین انتقال بدید.

در ضمن حواستون باشه در فایل ادمین isloggedin بودن رو چک کنید و در صورت ست نشدن انتقال بدید به لاگین.

احمدرضا فاطمی کیا ۲۲ مرداد ۱۴۰۲، ۱۳:۰۳

من درست متوجه شدم چون داریم از فرم با متد post مستقیم به فایل admin.php میفرستیم برای اینکه بتونیم $_POST را بگیریم نباید redirect بشه و باید include کنیم تا به $_POST دسترسی داشته باشیم. اما زمانی که با ajax انجام میشه ارسال فرم میشه redirect کرد درسته ؟

مهران ۲۲ مرداد ۱۴۰۲، ۱۳:۱۱

این را متوجه نشدم "اگر میخواید صفحه جدا برای ورود ادمین داشته باشید یک فایل دیگه ایجاد کنید و فایل لاگین رو اینکلود کنید داهلش و اکشن فرم رو به فایل بررسی اطلاعات تغییر بدید و با درست بودن اطلاعات به فایل ادمین انتقال بدید."



این ساختار فایلهای منه

a09a-image.png86e1-image.png

مهران ۲۲ مرداد ۱۴۰۲، ۱۳:۱۴

سلام،

شما دو موضوع را اشتباه گرفتید که البته هر چقدر جلوتر برید و کانسپت‌های بیشتریو آموزش ببینید براتون درک این موضوعات راحتتر خواهد بود.

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

  • ببینید ریدایرکت زمانی اتفاق می‌افته که بخوایم از یک صفحه (از یک آدرس url) به صفحه ی دیگری (آدرس دیگر url) کاربرو منتقل کنیم. بعضی وقت‌ها حتی برای رفرش صفحه. این انتقال صفحه یا بصورت دائمی اتفاق می‌افته یا بصورت موقتی.
  • شما باید دلیلی برای انتقال داشته باشید. هر ریدایرکت بارگزاری یک درخواست جدید است.
  • کاربر وقتی وارد یک صفحه میشود اگر ریدایرکتی انجام شود، عملاً دو درخواست اجرا شده است که اگر بی دلیل باشد بار اضافه ایجاد شده است.(هرچند کم)
  • زمانیکه redirect انجام میشود داده‌های post ازبین میرود. (این لینک رو مطالعه کنید)
  • برای تکمیل یک تمپلیت، قالب، ویو و ... یا افزودن پکیج ها، توابع، کلاس‌ها و ... در یک صفحه از include یا require استفاده میشود.
  • بسیار واضح است، کاربر را به لینکی فرضاً example.com/login میفرستیم، پس باید تمامی پردازش‌های لازم در این لینک انجام شود و صفحه در همین لینک لود شود مگر اینکه داخل پردازش‌ها چک شده است که کاربر قبلاً لاگین کرده است پس اینجا نباید این صفحه به کاربر نمایش داده شود، اینجاست که کاربرو به یک لینک جدید Redirect میکنیم(انتقال موقت کد 302).
  • منطق یک سناریو بسیار مهم است.
محسن موحد ۲۲ مرداد ۱۴۰۲، ۲۳:۴۸

ممنونم. یعنی اینجا در دقیقه 11:53 ببینید استاد میتونست بعد از چک کردن لاگین کاربر اگر کاربر لاگین نبود redirect کنه به صفحه لاگین و اگر لاگین بود صفحه ای که در پایین include شده بوده بره ؟ در این کد ببینید

if (!isLoggedIn()) {
    header("location:" . baseUrl("auth.php"));
}
//content of code 
include "templates/tpl-index.php";



مهران ۲۳ مرداد ۱۴۰۲، ۰۶:۵۸

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

هر دو سناریو قابل پیاده سازی هست در این مثال، هم میتوانید مانند ویدیو اینکلود کنید و هم میتوانید ریدایرکت کنید.

نکته: بعد از هدر redirect باید کد exit رو هم بنویسید تا بقیه کد قبل از ریدایرکت اجرا نشود.

یک مثال کاربردی برای سناریوی اینکلود زمانی هست که متغیرها و داده هایی بین این دو فایل یکسان هستند و میتوان براساس وضعیت کاربر این متغیرها داده ی متفاوتی بگیرد و در صفحه پردازش شود.

اما در سناریوی ریدایرکت، باعث میشود هر لینک مسئولیت خاص خود را داشته باشد، لینک مربوط به لاگین کار مشخصی دارد و مشخص است کاربر لاگین نشده و در توسعه کد و مدیریت آن کار راحتتری به مراتب خواهید داشت. لینک‌های دیگر هم مشئولیت مخصوص به خود را خواهند داشت. در فریمورک هایی که معماری MVC پیاده شده است، در این معماری از سه لایه جدا Model, Controller, View استفاده شده و همچنین منطق برنامه از لایه نمایش جدا شده است. در فریمورک‌ها برای هر وظیفه و لینک یک Route مشخص شده است.

فرض کنید وارد صفحه ای مانند داشبورد ادمین میخواهید بشوید، ساده بخوام بگم در فریمورک middleware‌ها قبل از ورود و پردازش هر صفحه اجرا میشوند.

یعنی شما هر لینکی که باز میکنید و هر منطق و هدفی وجود دارد قبلش middleware اجرا میشود. در middleware چک میشود که کاربر آیا لاگین کرده است یا نه ئ اگر لاگین نشده بود به روت login ریدایرکت میشود. این موضوع را گفتم تا یک پیش زمینه ای هم با middleware‌ها پیدا کنید. بعدا آشنا میشید و پیاده سازیشو در mvc یاد میگیرید، منتها همچین چیزیو خودتون هم میتونید در این پروژه پیاده کنید.


یک نکته هم اضافه کنم: در توضیحاتتون گفتید "اگر لاگین بود صفحه ای که در پایین include شده بوده بره" زمانیکه اینکلود میکنید، جابجایی اتفاق نمیوفته بلکه در همونجا کدهای فایل اضافه میشن و پردازش میشن.


بهترین پاسخ
محسن موحد ۲۳ مرداد ۱۴۰۲، ۰۸:۳۰

ممنونم الان متوجه شدم.

مهران ۲۳ مرداد ۱۴۰۲، ۰۹:۰۴