• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

class not found

23.01.12 21:49 작성 조회수 187

1

안녕하세요, 선생님!

나만의 프레임워크 강의 내용을 카피코딩하면서 class not found 에러가 발생하여 질문남깁니다.

 

-에러내용

Fatal error: Uncaught Error: Class "Eclair\Database\Adaptor" not found in C:\xampp\ECLAIR\index.php:11 Stack trace: #0 {main} thrown in C:\xampp\ECLAIR\index.php on line 11

 

-index.php

<?php

require './vendor/autoload.php';


use Eclair\Routing\Route;
use Eclair\Database\Adaptor;

Adaptor::setup('mysql:dbname=myapp_test','root', '');

Route::add('get','/', function(){
    echo 'Hello, world';
})
/*
Route::add('get','/posts/{$id}', function (){
    var_dump(Adaptor::getAll('SEELCT * FROM posts WEHRE `id` = ?', [$id]))
})

Route::run();
*/
?>

 

-Route.php

<?php

namespace Eclair\Routing;

use Eclair\Routing\RequestContext;

class Route
{
    private static $contexts = [];

    public static function add($method, $path, $handler, $middlewares = [])
    {
        self::$contexts[] =  new RequestContext($method, $path, $handler, $middlwares);

    }

    public static function run()
    {
        foreach($contexts as $context){
            if($context -> method === strtolower(Request::getMethod()) && is_array($urlParams = $context->match(Request::getPath()))){
                if($context -> runMiddlewares()){
                    return call_user_func($context->handler, ...$urlParams);

                }
                return false;
            }
        }
    }

}

 

-RequestContext.php

<?php

namespace Eclair\Routing;

class RequestContext
{
    public $method;
    public $path;
    public $handler;
    public $middlewares;

    public function __construct($method, $path, $handler, $middlewares)
    {
        $this->method = $method;
        $this->path = $path;
        $this->handler = $handler;
        $this->middlewares = $middlewares;
    }

    public function match($url)
    {
        //$this->path => /posts/{$id}, $url => /posts/1
        $urlParts = explode('/',$url);
        $urlPatternParts = explode('/',$this->path);

        if(count($urlParts) === count($urlPatternParts)){
            $urlParams = [];

            foreach($urlPatternParts as $key => $part){
                if(preg_match('/^\{.*\}$/', $part)){
                    $urlParams[$key] = $part;
                } else{
                    if($urlParts[$key]!= $part){
                        return null;
                    }
                }
            }
        }
            return count($urlParams) < 1
            ? [] 
            : array_map(fn($k) => $urlParts[$k], array_keys($urlParams));
    }

    public function runMiddlewares()
    {
        foreach($this->middlewares as $middlewares){
            if(! $middlewares::process()){
                return false;
            }
        }
        return true;
    }
}

 

-adaptor.php

<?php

namespace Eclair\Database;

class Adaptor
{
    public static $pdo;

    private static $sth;

    public static function setup($dsn, $username, $password)
    {
        self::$pdo = new \PDO($dsn, $username, $password);
    }

    public static function exec($query, $params)
    {
        if(self::$sth = self::$pdo -> prepare($query)){
            return self::$sth -> execute($params);
        }
    }

    public static function getAll($query, $params = [], $classname = 'stdClass')
    {
        if(self::exec($query, $params)){
            return self::sth -> fetchAll(\PDO::FETCH_CLASS, $classname);
        }
    }

    public static $test = 'test';

    public static function output()
    {
        return self::$test;
    }

}

 

현재, 모든 Route클래스를 포함한 모든 클래스들이 호출되지 않는 것 같습니다.

코드와 디렉토리 구조 모두 강의 내용과 일치한데, 어디에서 문제가 발생한 것인지 감도 안 잡히네요..ㅜㅜ

autoload.php파일을 건드린 적이 없는데, 이 파일이 문제인 걸까요??

 

답변 1

답변을 작성해보세요.

1

안녕하세요.

composer.json 에 psr-4 매핑이 올바르게 되어있다면 에러가 날 일이 없기는 한데, composer dump-autoload 라는 명령어를 입력해보시겠어요? 저번 질문에서 composer.json 을 변경하신 듯 해서 확실하지는 않지만 가능성이 있는 해결법을 말씀드립니다.

최선우님의 프로필

최선우

질문자

2023.01.13

안녕하세요, 선생님! 선생님 말씀대로 따라 하니 해결되었어요!

감사합니다 :)