PHP Composer Autoload 出现类未找到错误

ipo*_*rto 3 php autoload classnotfound composer-php

错误是:

\n\n
Fatal error: Uncaught Error: Class \'Championsweb\\Model\\VO\\CompeticionVO\'\nnot found in E:\\Drive\\Proyectos\\ChampionsEclipse\\public\\CrearCompeticion.php\non line 4\n
Run Code Online (Sandbox Code Playgroud)\n\n

项目结构:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80config\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80public\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80css\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80js\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80vendor\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80Championsweb\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80Controller\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80Model\n\xe2\x94\x82           \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80VO\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80templates\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80tests\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80vendor\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80composer\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80views\n
Run Code Online (Sandbox Code Playgroud)\n\n

CrearCompeticion.php(位于 public/ 中)如下所示:

\n\n
<?php\n\nif (isset($_POST) && sizeof($_POST) > 0) {\n    $competicionVO = new \\Championsweb\\Model\\VO\\CompeticionVO(\n        $_POST[\'nombre\'],\n        $_POST[\'anho\']\n    );\n    $adminactions = new \\Championsweb\\Controller\\AdminActions();\n    $adminactions->crearCompeticion($competicionVO);\n}\n\nrequire \'../views/CrearCompeticion.view.php\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

CompeticionVO.php(位于 src/Championsweb/Model/VO 中)如下所示:

\n\n
<?php\nnamespace Championsweb\\Model\\VO;\n\nclass CompeticionVO {\n    public $id;\n    public $nombre;\n    public $anho;\n    public $idGanador;\n\n    public function __construct($nombre, $anho) {\n        $this->nombre = $nombre;\n        $this->anho = $anho;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Composer.json 如下所示:

\n\n
{\n    "autoload" : {\n        "classmap" : [\n            "./"\n        ]\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

index.php 有自动加载要求:

\n\n
<?php\n\nrequire \'../vendor/autoload.php\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

autoload_classmap.php 有 CompeticionVO 类:

\n\n
<?php\n\n// autoload_classmap.php @generated by Composer\n\n$vendorDir = dirname(dirname(__FILE__));\n$baseDir = dirname($vendorDir);\n\nreturn array(\n    \'Championsweb\\\\Controller\\\\Actions\' => $baseDir . \'/src/Championsweb/Controller/Actions.php\',\n    \'Championsweb\\\\Controller\\\\AdminActions\' => $baseDir . \'/src/Championsweb/Controller/AdminActions.php\',\n    \'Championsweb\\\\Controller\\\\UserActions\' => $baseDir . \'/src/Championsweb/Controller/UserActions.php\',\n    \'Championsweb\\\\Model\\\\Db\' => $baseDir . \'/src/Championsweb/Model/Db.php\',\n    \'Championsweb\\\\Model\\\\VO\\\\CompeticionVO\' => $baseDir . \'/src/Championsweb/Model/VO/CompeticionVO.php\',\n    \'Championsweb\\\\Model\\\\VO\\\\EquipoVO\' => $baseDir . \'/src/Championsweb/Model/VO/EquipoVO.php\',\n    \'Championsweb\\\\Model\\\\VO\\\\RondaVO\' => $baseDir . \'/src/Championsweb/Model/VO/RondaVO.php\',\n    \'Championsweb\\\\Model\\\\VO\\\\UsuarioVO\' => $baseDir . \'/src/Championsweb/Model/VO/UsuarioVO.php\',\n    \'ComposerAutoloaderInit91342042e1463ce66f1dcacb1f34d909\' => $vendorDir . \'/composer/autoload_real.php\',\n    \'Composer\\\\Autoload\\\\ClassLoader\' => $vendorDir . \'/composer/ClassLoader.php\',\n    \'Composer\\\\Autoload\\\\ComposerStaticInit91342042e1463ce66f1dcacb1f34d909\' => $vendorDir . \'/composer/autoload_static.php\',\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

基本上,CrearCompeticion.view.php 有一个通过 POST 传递到 CrearCompeticion.php 的表单。然后 CrearCompeticion.php 尝试使用表单信息创建 CompeticionVO 实例,但出现错误。

\n\n

我究竟做错了什么?另外,我从一些教程中获得了composer.json 文件,但我不太了解它是如何工作的,但我很想了解。

\n\n

提前致谢!

\n\n

编辑:这就是 autoload_static.php 的样子:

\n\n
<?php\n\n// autoload_static.php @generated by Composer\n\nnamespace Composer\\Autoload;\n\nclass ComposerStaticInit91342042e1463ce66f1dcacb1f34d909\n{\n    public static $classMap = array (\n        \'Championsweb\\\\Controller\\\\Actions\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Controller/Actions.php\',\n        \'Championsweb\\\\Controller\\\\AdminActions\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Controller/AdminActions.php\',\n        \'Championsweb\\\\Controller\\\\UserActions\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Controller/UserActions.php\',\n        \'Championsweb\\\\Model\\\\Db\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Model/Db.php\',\n        \'Championsweb\\\\Model\\\\VO\\\\CompeticionVO\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Model/VO/CompeticionVO.php\',\n        \'Championsweb\\\\Model\\\\VO\\\\EquipoVO\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Model/VO/EquipoVO.php\',\n        \'Championsweb\\\\Model\\\\VO\\\\RondaVO\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Model/VO/RondaVO.php\',\n        \'Championsweb\\\\Model\\\\VO\\\\UsuarioVO\' => __DIR__ . \'/../..\' . \'/src/Championsweb/Model/VO/UsuarioVO.php\',\n        \'ComposerAutoloaderInit91342042e1463ce66f1dcacb1f34d909\' => __DIR__ . \'/..\' . \'/composer/autoload_real.php\',\n        \'Composer\\\\Autoload\\\\ClassLoader\' => __DIR__ . \'/..\' . \'/composer/ClassLoader.php\',\n        \'Composer\\\\Autoload\\\\ComposerStaticInit91342042e1463ce66f1dcacb1f34d909\' => __DIR__ . \'/..\' . \'/composer/autoload_static.php\',\n    );\n\n    public static function getInitializer(ClassLoader $loader)\n    {\n        return \\Closure::bind(function () use ($loader) {\n            $loader->classMap = ComposerStaticInit91342042e1463ce66f1dcacb1f34d909::$classMap;\n\n        }, null, ClassLoader::class);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Jet*_*eto 6

正如您所说,您将发布到CrearCompeticion.php位于 public/目录中的名为 的脚本。

这意味着在这种情况下,不会执行中存在的任何代码index.php(包括 ) 。require '../vendor/autoload.php';

因此,在您的情况下(您说您关注了 Laracast,但似乎没有使用 Laravel 应用程序设置),您还需要require __DIR__ . '/../vendor/autoload.php';在其之上添加CrearCompeticion.php,这应该可以完成工作。