راکت

مشکل در routing

3 پاسخ

سلام
من از کد زیر برای routing استفاده می کنم

<?php
namespace Core;
use Core\routes;
class app {
    public function dd($inp) {
        echo "<pre>";
        var_dump($inp);
        echo "<pre>";
        die;
    }
    public function __construct() {
        $route = new routes();
        $routes = $route->routes;
        $routeCount = count($routes);
        $requsted_url = trim($_SERVER['REQUEST_URI'],'/');

        for($i=0;
        $i<=$routeCount;
        $i++) {
            if($routes[$i]['url']==$requsted_url) {
                echo 'is defined';
                break;
            } else {
                echo '404';
                break;
            }
        }

    }

}
?>

این هم فایل کلاس routes

<?php
namespace Core;
class routes {
    public $routes=[
[
'url' => 'login',
'controller' => 'userController',
'function' => 'index'
],
[
'url' => 'salam',
'controller' => 'examController',
'function' => 'index'
]
];
}
?>

ولی بجز اولین route که login هست بقیه رو 404 میده.
این URL مثلا http://localhost:8080/login رو میگه is difined ولی http://localhost:8080/salam رو میگه 404

ثبت پرسش جدید

پاسخ‌ها

3
محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

@IrajJavidan1
سلام.
کل حلقه for با محتویاتش رو پاک کنید و به جاش کد زیر رو جایگزین کنید:

// Map all routes to get urls.
$mapper = function($value) {
     return $value['url'];
};
$urls = array_map($mapper, $routes);

// Check if route exist
if (in_array($requsted_url, $urls)) {
    echo 'is defined';
} else {
    echo '404';
}
محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

@IrajJavidan1
یکسری نکات هم بگم که کد بهتری داشته باشید:

  1. اول از همه همیشه اول هر بخش از اسم کلاس ها رو با حروف بزرگ شروع کنید. برای مثال: App یا Routes
  2. سعی کنید همیشه متد های جادویی رو اول کلاس و بعد از پراپرتی ها تعریف کنید.
  3. DI رو رعایت کنید تا بعدا به مشکل نخورید.
  4. به جای درگیر کردن مموری با حلقه for سعی کنید از تابع های آماده خود PHP که ارائه داده، مثل کدی که دادم استفاده کنید.
  5. به جای این که روتر رو در کلاس App هندل کنید، اون رو در کلاس مربوط به روت ها هندل کنید و فقط در App اون رو فراخوانی کنید.
  6. به جای این که همه روت ها رو مستقیم در پراپرتی مقدار دهی کنید، اون ها رو در متد سازنده مقدار دهی کنید.
  7. با این که حلقه مشکل داشت و کلا نیازی به استفاده از اون نبود ولی یک ایراد هم داخلش وجود داشت. شما یک if و یک else تعریف کردید که هر دو در نهایت break رو اجرا میکنن. پس نیازی به مورد else نبود کلا و می تونستید else رو حذف کنید تا یک indent از کد کمتر بشه.

شاید پاسخ شما همین‌جا باشد

IrajJavidan
IrajJavidan
@IrajJavidan1

خیلی ممنون بابت پاسخ
چرا باید سعی کنم همیشه متد های جادویی رو اول کلاس و بعد از پراپرتی ها تعریف کنم؟؟

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام