如何使用 PSR-4 自动加载 类?

How to autoload classes using PSR-4?

我正在尝试使用 device-detector 在我的 php 脚本中设置设备检测系统。我正在按照其文档进行设置,但在执行此操作时出现错误。我已经使用 composer 下载了所需的文件。我什至克隆了 repo 以下载所需的文件并将其保存在供应商之外的单独文件夹中。

在文档中,它要求 只需将 piwik/device-detector 添加到您的项目要求中 我这样做了,但在 运行 上出现了错误。

Notice: Undefined variable: userAgent in C:\wamp\www\trackme\track.php on line 11

注意:我对自动加载比较陌生。

COMPOSER.JSON

{
    "name": "piwik/device-detector",
    "type": "library",
    "description": "The Universal Device Detection library, that parses User Agents and detects devices (desktop, tablet, mobile, tv, cars, console, etc.), clients (browsers, media players, mobile apps, feed readers, libraries, etc), operating systems, devices, brands and models.",
    "keywords": ["useragent","parser","devicedetection"],
    "homepage": "http://piwik.org",
    "license": "LGPL-3.0+",
    "authors": [
        {
            "name": "The Piwik Team",
            "email": "hello@piwik.org",
            "homepage": "http://piwik.org/the-piwik-team/"
        }
    ],
    "support": {
        "forum": "http://forum.piwik.org/",
        "issues": "https://github.com/piwik/device-detector/issues",
        "wiki": "http://dev.piwik.org/",
        "source": "https://github.com/piwik/piwik"
    },
    "autoload": {
        "psr-4": { "DeviceDetector\": "piwik/device-detector" }
    },
    "require": {
        "php": ">=5.3.2",
        "mustangostang/spyc": "*"
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "fabpot/php-cs-fixer": "~1.7"
    },
    "suggest": {
        "doctrine/cache": "Can directly be used for caching purpose"
    }
}

track.php [更新]

<?php

//date_default_timezone_set('Asia/Kolkata');

require_once 'vendor/autoload.php';

use DeviceDetector\DeviceDetector;
use DeviceDetector\Parser\Device\DeviceParserAbstract;

DeviceParserAbstract::setVersionTruncation(DeviceParserAbstract::VERSION_TRUNCATION_NONE);

$dd = new DeviceDetector($userAgent);

$dd->discardBotInformation();

$dd->skipBotDetection();

$dd->parse();

if ($dd->isBot()) {
  // handle bots,spiders,crawlers,...
  $botInfo = $dd->getBot();
} else {
  $clientInfo = $dd->getClient(); // holds information about browser, feed reader, media player, ...
  $osInfo = $dd->getOs();
  $device = $dd->getDevice();
  $brand = $dd->getBrand();
  $model = $dd->getModel();
}

echo $osInfo;
}

设置正确,您的 class 文件位置正确。您可以看到您的代码一直处理到第 14 行 - 这意味着找到第 10 行和第 12 行的 classes。

想不到的是 doctrine/cache 软件包还没有安装。您确实将它放入 "suggest" 部分,该部分未安装,因此 Composer 自动加载器不知道。在文档中查看详细信息:https://getcomposer.org/doc/04-schema.md#suggest

您需要将其移至 "require" 部分,仅此而已。

我建议在使用它之前先定义 $userAgent :)

通过评论更新 1:

为了仅使用 piwik,请将其移至"require" 部分。首先,完全删除 "autoload" 部分。也就是这部分:

"autoload": {
    "psr-4": { "DeviceDetector\": "piwik/device-detector" }
},

然后打电话

composer require piwik/device-detector

这会将其添加到 "require" 部分。