작성
·
263
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 을 변경하신 듯 해서 확실하지는 않지만 가능성이 있는 해결법을 말씀드립니다.
안녕하세요, 선생님! 선생님 말씀대로 따라 하니 해결되었어요!
감사합니다 :)