۵ احسان پژمان
عمل نکردن dispatch404
جامعه پی اچ پی ایجاد شده در ۲۸ آذر ۱۴۰۱

با سلا م من تمامی فرایند پروژه رو طبق ویدویوی استاد جلو رفتم اما متد dispatch404 کار نمیکنه و من هر آدرسی که میدم صفحه ای سفید رو بالا میاره و از

$router->run()

وردامپ میگیرم null بر میگردونه

سلام احسان عزیز

خود فانکشن رو بررسی و طبق سرفصل خطایابی عمل کنید.

چون این مورد از طرف شماست و باید دیباگ بشه.

روتر و دیسپچر رو خط به خط دامپ بگیرید.

از فایل index شروع کن تا مقصد و فایل آخر دیباگ کن.

اگر هم در حین دیباگ مشکلی بود کنارت هستم تا رفع مشکل نگران نباش.


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

با سلام استاد محترم

تا الان زدم اینور و اونور چیزی دستم نیومد کدهای کلاس روتر رو میفرستم با هلپرها و اندیکس


namespace App\\Core\\Routing;
use App\\Core\\Request;
class Router{
    private $request;
    private $routes;
    private $current_route;
    public function __construct(){
        $this->request = new Request();
        $this->routes = Route::routes();
        $this->current_route = $this->findRoute($this->request) ?? null;
    }
    public function findRoute(Request $request)
    {
        foreach ($this->routes as $route) {
            if (in_array($request->method(), $route['methods']) and $request->uri() == $route['uri']);
            {
                return $route;
            }
        }
        return null;
    }
    public function dispatch404()
    {
        header("HTTP/1.0 404 Not Found");
        view('errors.404');
        die();
    }
    public function run()
    {
        if (is_null($this->current_route))
            $this->dispatch404();

$this->dispatch($this->current_route);

    }
    private function dispatch($route)
    {
        $action = $route['action'];
        if (is_null($action) or empty($action)){
            return;
        }
        if (is_callable($action)){
            $action();
        }
        if (is_string($action)){
            $class_name = $action[0];
        }
    }
}



function site_url($route)
{
    return $_ENV['HOST'] . "$route";
}
function asset_url($route)
{
    return site_url("assets/" . $route);
}
function view($path)
{
   $path = str_replace('.', '/' ,$path);
   $viw_file_path = BASEPATH . "views/$path.php";
   include_once $viw_file_path;
}



# Front Controller
include "bootstrap/init.php";
$router = new \\App\\Core\\Routing\\Router();
$router->run();

اینها کدهاییه که من مطابق ساختار پروژه زدم

احسان پژمان ۲۸ آذر ۱۴۰۱، ۲۳:۱۲

احسان جان یک دامپ از پراپرتی current route بگیر و مقداری که بر میگرده رو بررسی کن که نال نباشه چون پروژه شما به این صورت شروع میشه:

ابتدا روتر ران میشه بعد بررسی میکنه که روت فعلی وجود داشته باشه و بعد میره سراغ dispatch کردن.

اگر مقدار current route برابر با نال نبود پس باید بریم سراغ متد dispatch چون الان متد dispatch ما فقط در صورت callable بودن روت عمل میکنه و ساختار برای کلاس و متد کنترلر فعلا پیاده نشده.

و اگر میبینی که روتی وارد نکردی و 404 نمیاد مشکل از همون متد findroute و مقدار پراپرتی current route هست که نال نیست.

دیباگ رو اینطوری انجام بده...

پس نقطه شروع مشکل متد findroute و مقدار پراپرتی current route هست.

در صورت یدون مشکل بودن این دو متد dispatch باید بررسی بشه.


احمدرضا فاطمی کیا ۲۹ آذر ۱۴۰۱، ۰۵:۴۰

با سلام استاد محترم

خروجی پراپرتی این شد

array (size=3)
  'methods' => 
    array (size=1)
      0 => string 'get' (length=3)
  'uri' => string '/null' (length=5)
  'action' => null

متاسفانه اکستنشن دیباگ من اصلا درست کار نمیکنه و نتونستم چیزی ازش بفهمم

اینجا گفتید که مقدار current route نال نباشه میره سراغ متد dispatch و بعد گفتید اگر صفحه 404 نمیاد به این دلیله که مقدار  current route نال نیست و یا مشکل از فایندروتر هست که من متوجه نشدم مقدار  current route باید نال باشه که بره یا نباشه که قاعدتا باید ناال باشه درغیر این صورت که میره سراغ آدرسی که داده شده

احسان پژمان ۲۹ آذر ۱۴۰۱، ۰۸:۵۸

احسان جان

الان خروجی رو ببین

اکشن روت مشخص نشده و وارد شرط داخل متد dispatch میشه و میبینه اکشن نال هست و return خالی اتفاق میوفته

اکشن روت رو ست نکردی.

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