【问题标题】:PSR-4 Autoloading option is not loading classes in my project?PSR-4 自动加载选项没有在我的项目中加载类?
【发布时间】:2019-06-28 12:42:21
【问题描述】:

当我尝试使用 psr-4 自动加载选项加载我的类时,我收到此错误“致命错误:未捕获的错误:在 C:\xampp\htdocs\gacho\App\Core\Application 中找不到类 'HomeController'。 php:17 堆栈跟踪:#0 C:\xampp\htdocs\gacho\public\index.php(16): App\Core\Application->__construct() #1 {main} 在 C:\xampp\htdocs\ 中抛出第 17 行的 gacho\App\Core\Application.php '这是我的代码结构和代码:

代码结构:

|gacho
  |- App
     |- Controller
        |- HomeController.php
     |- Core
        |- Application.php
     |- Model
     |- View
  |-public
     |- .htaccess
     |- index.php
  |-vendor
     |- composer
        |- autoload_classmap.php
     |- autoload.php
  |-composer.json

index.php:

<?php

use App\Core\Application;

define('ROOT', dirname(__DIR__) . DIRECTORY_SEPARATOR);
define('APP', ROOT . 'App' . DIRECTORY_SEPARATOR);
define('CONTROLLER', ROOT . 'App' . DIRECTORY_SEPARATOR . 'Controller' . 
DIRECTORY_SEPARATOR);
define('VIEW', ROOT . 'App' . DIRECTORY_SEPARATOR . 'View' . 
DIRECTORY_SEPARATOR);
define('MODEL', ROOT . 'App' . DIRECTORY_SEPARATOR . 'Model' . 
DIRECTORY_SEPARATOR);
define('CORE', ROOT . 'App' . DIRECTORY_SEPARATOR . 'Core' . 
DIRECTORY_SEPARATOR);

$modules = [ROOT, APP, CORE, CONTROLLER];

require_once __DIR__ . '\..\vendor\autoload.php';

$app = new Application();

composer.json:

{
 "autoload": {
     "psr-4": {
        "App\\": "App/"
      }
   }
}

Application.php:

<?php
 namespace App\Core;

 use App\Core\Controller;
 use App\Controller\HomeController;

 class Application
 {
    protected $controller = 'HomeController';
    protected $action = 'index';
    protected $params = [];

    public function __construct()
    {
       $this->prepareURL();
       if (file_exists(CONTROLLER. $this->controller . '.php')) {
        $this->controller = new $this->controller;
        if (method_exists($this->controller, $this->action)) {
            call_user_func_array([$this->controller, $this->action], $this->params);
          }
       }
    }

protected function prepareURL()
{
    $request = trim($_SERVER['REQUEST_URI'], '/');
    if (!empty($request)) {
        $url = explode('/', $request);
        $this->controller = isset($url[0]) ? $url[0].'Controller' : 'HomeController';
        $this->action = isset($url[1]) ? $url[1] : 'index';
        unset($url[0], $url[1]);
        $this->params = !empty($url) ? array_values($url) : [];
     }
  }
}

HomeController.php:

<?php
 namespace App\Controller;

 use App\Core\Controller;

 class HomeController extends Controller
 {
    public function index($id= '', $name='')
    {
       $this->view('home\index', [
         'name' => $name,
         'id' => $id
      ]);
      $this->view->page_title = 'Home Page';
      $this->view->render();
    }

    public function users()
    {
       $this->view('home\users', []);
       $this->view->page_title = 'Users';
       $this->view->render();
    }
}

【问题讨论】:

  • 请提供minimal reproducible example。此外,验证重现行为所需的步骤是否确实有效。特别要注意自动加载器的生成方式会产生影响... BTW:根据广泛接受的php-fig.org/psr,您的类名homeController 无效。考虑不要打破这些约定,它会让事情变得更容易。
  • @revo 我从那个帖子做了所有事情,但它仍然无法正常工作。同样的错误。

标签: php oop autoload psr-4


【解决方案1】:

FQCN 为App\Core\Application,路径为app\core\Application.php。使用 PSR-4 它将尝试从 App\Core\Application.php 加载,但该路径不存在(至少在区分大小写的文件系统中不存在)。

您最好的选择是更改目录结构以匹配命名空间。它们需要完全匹配,包括大小写。

【讨论】:

  • 它在 MS Windows 上运行,从其中一条错误消息中得知。
  • 看起来像。不过,路径和命名空间并不完全匹配,这就是问题所在。
  • @Arjan 它在 Windows 7 上运行。我更改了每个目录以匹配命名空间并点击 composer-dumpautoload 我仍然得到几乎相同的错误,只是更改了小写'致命错误:未捕获的错误:类在 C:\xampp\htdocs\gacho\App\Core\Application.php:17 中找不到“HomeController” 堆栈跟踪:#0 C:\xampp\htdocs\gacho\public\index.php(16): App\Core \Application->__construct() #1 {main} 在第 17 行的 C:\xampp\htdocs\gacho\App\Core\Application.php 中抛出' 另外,如果我从 Application. php 我没有得到错误只是空白页。
【解决方案2】:

尝试运行此命令:composer update

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2020-07-10
    • 2014-10-11
    • 2023-01-31
    • 2015-01-08
    相关资源
    最近更新 更多