Чат Telegram
Группа ВКонтакте
php

Почему появляется ошибка 500?

Здравствуйте. Решил загрузить на хостинг сайт.

После выгрузки, появилась ошибка 500 и сайт не работал.

Написал в техподдержку хостинга.

Ошибка была следующего вида: Warning: require_once ...../src/Controllers/MainController.php ......index.php on line 4

Файл routes был:

<?php
return [
'~^(.+)$~' => [\Controllers\ArticlesController::class, 'view'],
'~^$~' => [\Controllers\MainController::class, 'main']
];

Техподдержка заменила так:

'~^(.+)$~' => [\Controllers/ArticlesController::class, 'view'],
'~^$~' => [\Controllers/MainController::class, 'main']

Не помогло.

Тот самый MainController

<?php
namespace Controllers;
use View\View;
use Services\Db;
use Models\Articles\Article;

class MainController{
private $view;

public function construct(){
$this->view = new View(
DIR__ . '/../templates');
$this->db = new Db();
}
public function main(){
$articles = Article::findAll();
$this->view->renderHtml('main/main.php', ['title' => 'Главная',
'description' => 'description',
'keywords' => 'keywords',
'articles' => $articles]);
}
}

index.php

<?php
try{
spl_autoload_register(function (string $className){
require_once DIR . '/src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require DIR . '/src/Settings/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
preg_match($pattern, $route, $matches);
if (!empty($matches)) {
$isRouteFound = true;
break;
}
}

if (!$isRouteFound) {
throw new \Exceptions\NotFoundException();
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);

} catch (\Exceptions\NotFoundException $e) {
$view = new \View\View(DIR . '/src/templates/errors');
$view->renderHtml('404.php', ['error' => $e->getMessage()], 404);
}
?>

htaccess

RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(.*)$ ./index.php?route=$1 [QSA,L]

Если я запускаю на open server все прекрасно работает.

Подскажите пожалуйста в чем может быть проблема?

P.S. Все пути, которые не были найдены я дописал, сайт заработал, НО:
1) я подключал руками не все файлы, а некоторые
2) значит ошибка в spl_autoload_register, может кто-нибудь знает почему?


Вопрос задал admaers 29.11.2019 в 12:52

Ответы на вопрос (1)


Если возможный трабл в spl_autoload_register() и именно на хостинге, то, возможно, вам нужно заменять слеши внутри автозагрузчика таким образом: str_replace('\', '/', $className). И, конечно же, советую использовать Composer для автозагрузки классов.

Ответил Sparkqy 30.11.2019 в 20:00

Добавить новый ответ