класс torophp не найден - PullRequest
0 голосов
/ 17 мая 2018

Я использую MVC PHP Framework и Torophp для маршрутизации

это мой public / index.php

<?php

class HomeController {
    function get() {
        echo "hello world";
    }
}



require_once __DIR__ . '/../vendor/autoload.php';
	ToroHook::add("404",  function() {
		echo "404 - Not Found";
	});

	Toro::serve(array(

   	 "/" => "HomeController";

));

?>
когда я искал hhtp: //example.com/ он работал нормально и показал привет мир

но если я закомментирую класс HomeController из index.php и объявлю его в app / controllers / HomeController.php

<?php

class HomeController {
    function get() {
        echo "hello world";
    }
}
он не работает, показывает класс не найден или ошибка 400 внутренняя ошибка сервера.

вот мой файл composer.json

{
	"name": "namespace/app",
	"description": "This is just sample",
	"require": {
		"torophp/torophp": "dev-master", 
		"twig/twig": "2.0" 
	},
	"authors": [
		{
			"name": "ABC",
			"email": "abc@xyz.com"
		}

	],
	"autoload":{
		"psr-4":{
			"Links\\Controllers\\":"app/controllers",
			"Links\\Models\\":"app/models"
		}
	}
}

1 Ответ

0 голосов
/ 18 мая 2018

Composer генерирует автозагрузчик на основе раздела autoload, который вы вставили в composer.json:

"autoload":{
    "psr-4":{
        "Links\\Controllers\\":"app/controllers",
        "Links\\Models\\":"app/models"
    }
}

В нем говорится, что классы в пространстве имен Links\Controllers можно найти в файлах с тем же именем, что и класс (и окончание .php) в каталоге app/controllers. Аналогично для пространства имен Links\Models.

Основной скрипт:

Toro::serve(array(
     "/" => "HomeController";
));

указывает маршрутизатору использовать класс HomeController для обслуживания запросов на /.

Кстати, точка с запятой (;) после "HomeController" is a syntax error; the code doesn't even start because it doesn't compile. There should be a comma (, `) там, а не точка с запятой.

Поскольку класс HomeController еще не был объявлен, для его поиска вызывается автозагрузчик, и он не работает, потому что у него нет информации о том, где найти классы из глобального пространства имен.

Вы поместили класс HomeController в файл app/controllers/HomeController.php, но этого недостаточно. Автозагрузчик читает этот файл, когда интерпретатору нужно использовать класс Link\Controllers\HomeController, а этот класс еще не был объявлен.

Этого не происходит в app/controllers/HomeController.php. Этот файл объявляет класс HomeController, который не помещается ни в какое пространство имен, поэтому он принадлежит глобальному пространству имен. Чтобы поместить его в пространство имен Links\Controllers, вы должны поместить эту строку объявления перед любым другим оператором в app/controllers/HomeController.php:

namespace Links\Controllers;

Теперь у вас имя класса Links\Controllers\HomeController. Измените код, который его использует:

Toro::serve(array(
     '/' => 'Links\Controllers\HomeController',
));

и должно работать.

...