Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PSR4-在composer中使用自动加载而不是require_Php_Slim_Psr 4 - Fatal编程技术网

Php PSR4-在composer中使用自动加载而不是require

Php PSR4-在composer中使用自动加载而不是require,php,slim,psr-4,Php,Slim,Psr 4,我是SLIM3的新用户,在使用Composer时安装了它。在本教程中,我尝试使用autoload加载所有类,而不必使用require,以下是我的文件结构: dev |── composer.json |── index.php |──── classes |──── vendor 这是我的composer.json文件: { "require": { "slim/slim": "^3.0", "monolog/monolog": "^1.23"

我是SLIM3的新用户,在使用Composer时安装了它。在本教程中,我尝试使用
autoload
加载所有类,而不必使用
require
,以下是我的文件结构:

dev
|── composer.json
|── index.php
|──── classes
|──── vendor
这是我的
composer.json
文件:

{
    "require": {
        "slim/slim": "^3.0",
        "monolog/monolog": "^1.23"
    },
    "autoload": {
        "psr-4": {
            "": "classes/"
        }
    }
}
这里是
pdf.class.php
,它位于
classes

dev
|── composer.json
|── index.php
|──── classes
     |─ pdf.class.php
|──── vendor
以及index.php:

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

// Require for loading the vendor libraries installed by composer
require 'vendor/autoload.php';
// require 'classes/pdf.class.php'; // << If I uncomment this line it works.


$config['displayErrorDetails'] = true;
$config['addContentLengthHeader'] = false;

$app = new \Slim\App(["settings" => $config]);
$container = $app->getContainer();

$app->post('/{controller}/{function}', function (Request $request, Response $response) {
    $headers = $request->getHeaders();
    $params = $request->getParsedBody();

    $classname = $request->getAttribute('controller').'Class';

    $controller = new $classname;
    $function = $request->getAttribute('function');

    $result = $controller->$function();

    $response->getBody()->write($result);
    return $response;
});

$app->run();

不确定您的确切问题是什么,但psr-4要求文件名与类名完全相同,因此在您的情况下,可能
Pdf.php
不是
Pdf.class.php

终止类名对应于以.php结尾的文件名。 文件名必须与终止类名的大小写匹配


要添加@meta提到的内容,还需要
使用Pdf当您需要在自动加载后访问自动加载的类时。就像你声明使用请求和响应一样。是的,这就是问题所在,类名也必须与文件名匹配。因此
pdf.php
中的
classpdfclass
将无法工作。
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

// Require for loading the vendor libraries installed by composer
require 'vendor/autoload.php';
// require 'classes/pdf.class.php'; // << If I uncomment this line it works.


$config['displayErrorDetails'] = true;
$config['addContentLengthHeader'] = false;

$app = new \Slim\App(["settings" => $config]);
$container = $app->getContainer();

$app->post('/{controller}/{function}', function (Request $request, Response $response) {
    $headers = $request->getHeaders();
    $params = $request->getParsedBody();

    $classname = $request->getAttribute('controller').'Class';

    $controller = new $classname;
    $function = $request->getAttribute('function');

    $result = $controller->$function();

    $response->getBody()->write($result);
    return $response;
});

$app->run();