۲ دانشجوی سون‌لرن
include نشدن کلاس توسط اتولودر
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۰۸ بهمن ۱۴۰۳

سلام وقتتون بخیر 

موقع ران کردن فایل سیتی اندپوینت این ارور مدام ایجاد می‌شود : 

Uncaught Exception: Class file not found: C:\xampp\htdocs\iran\Iran\App\Utilities\App\Services\CityService.php in C:\xampp\htdocs\iran\Iran\App\Utilities\loader.php:18 Stack trace: #0 C:\xampp\htdocs\iran\Iran\api\v1\cities\index.php(10): {closure}('App\\Services\\Ci...') #1 {main} thrown in C:\xampp\htdocs\iran\Iran\App\Utilities\loader.php on line 18 

 

کدبلاک‌های اتولودر : 

spl_autoload_register(function ($class) {
    // Convert namespace separators to directory separators
    $classPath = str_replace("\\", DIRECTORY_SEPARATOR, $class);
    // Construct the full file path
    $filePath = __DIR__ . DIRECTORY_SEPARATOR . $classPath . ".php";
    // Check if the file exists and include it
    if (file_exists($filePath)) {
        include $filePath;
    } else {
        throw new Exception("Class file not found: " . $filePath);
    }
});

کدبلاک‌های فایل سیتی اندپوینت: 


include_once "C:\\xampp\\htdocs\\iran\\Iran\\App\\Utilities\\loader.php";
use \App\Services\CityService;
use \App\Utilities\Response;
$cityService = new CityService();
$request_method = $_SERVER['REQUEST_METHOD'];

 

سلام،

خطایی که دریافت کردی، نشون میده مسیر فایل به درستی تنظیم نشده. در کدت این مسیردهی استفاده شده (با توجه به DIRای که در loader.php گرفتی):

C:\xampp\htdocs\iran\Iran\App\Utilities\

اما فایل مورد نظر در این مسیر پیدا نشده:

Class file not found: C:\xampp\htdocs\iran\Iran\App\Utilities\App\Services\CityService.php

برای رفع این مشکل، می‌تونی از کد زیر استفاده کنی:

$filePath = "C:/xampp/htdocs/iran/Iran/" . $classPath . ".php";

حالا یه نکته مهم:
پیشنهاد می‌کنم هیچوقت از مسیرهای مطلق (absolute path) استفاده نکنی. چون این کدها معمولاً روی سرور یا هاست منتقل میشن و مسیرها ممکنه تغییر کنه. به جاش بهتره از مسیرهای نسبی (relative path) استفاده کنی که انعطاف بیشتری دارن.

همچنین، به جای استفاده از \ (backslash) در ویندوز، از / (forward slash) به عنوان جداکننده مسیر استفاده کن. چون اکثر هاست‌ها لینوکسی هستن و / با اون‌ها سازگارتره.

حالا اگر بخوام این نکات رو تو کدت اعمال کنم، به این شکل می‌تونیم بازنویسی کنیم:

spl_autoload_register(function ($class) {
    // یافتن مسیر روت پروژه به صورت داینامیک
    $rootPath = dirname(__DIR__, 3); // فرض بر این است که پروژه 3 سطح بالاتر از فایل فعلی است
    // تبدیل namespace به مسیر فایل
    $classPath = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php";
    // مسیر کامل فایل
    echo $filePath = $rootPath . DIRECTORY_SEPARATOR . $classPath;
    // بررسی وجود فایل و بارگذاری
    if (is_readable($filePath)) {
        require_once $filePath;
    } else {
        throw new RuntimeException(sprintf("Class file not found: %s", $filePath));
    }
});
محسن موحد ۰۹ بهمن ۱۴۰۳، ۲۱:۴۳

سلام مجدد

با اصلاح کد‌های اتولودر با وجود اینکه مسیر نهایی رو درست تولید می‌کنه، باز موقع ران کردن اندپوینت میگه این کلاس وجود ندارد: 

 

 C:\xampp\htdocs\iran\Iran
App\Utilities\loader.php
C:\xampp\htdocs\iran\Iran\App\Utilities\loader.php
included
Generated file path: C:\xampp\htdocs\iran\Iran\App\Servises\CityServise.php
Error: Class file not found: C:\xampp\htdocs\iran\Iran\App\Servises\CityServise.php
Fatal error: Uncaught Error: Class "App\Servises\CityServise" not found in C:\xampp\htdocs\iran\Iran\api\v1\cities\index.php:20 Stack trace: #0 {main} thrown in C:\xampp\htdocs\iran\Iran\api\v1\cities\index.php on line 20

 

کدهای اندپوینت :  

$rootPath = dirname(__DIR__, 3);
echo $rootPath;
echo"<br>";
$modified_rootPath = str_replace("\\", DIRECTORY_SEPARATOR, "App\Utilities\loader.php");
echo $modified_rootPath;
$loaderPath = $rootPath . DIRECTORY_SEPARATOR.$modified_rootPath ; 
echo"<br>";
echo $loaderPath;
echo"<br>";
include $loaderPath;
echo "included";
echo"<br>";
use App\Servises\CityServise;
$cityServise = new CityServise();

کدهای اتولودر:

spl_autoload_register(function ($class) {
    // Fetching project's root dynamically
    $rootPath = dirname(__DIR__, 2); // فرض بر این است که پروژه 2 سطح بالاتر از فایل فعلی است
        //replace name space seperator with directory seperator
    $classPath = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php";
        //full file path
    $filePath = $rootPath . DIRECTORY_SEPARATOR . $classPath;
    // Debug: Print the generated file path
    echo "Generated file path: " . $filePath . "<br>";
    //  file inclusion , if accessible
    try {
        if (!is_readable($filePath)) {
            throw new RuntimeException(sprintf("Class file not found: %s", $filePath));
        }
        require_once $filePath;
    } catch (RuntimeException $e) {
        echo "Error: " . $e->getMessage();
    }
});

 

مریم سلطان زاده ۱۳ بهمن ۱۴۰۳، ۰۷:۵۷