Php 扩展matomo/piwik设备检测器类以添加新的客户端解析器(名称空间问题)

Php 扩展matomo/piwik设备检测器类以添加新的客户端解析器(名称空间问题),php,class,namespaces,extends,matomo,Php,Class,Namespaces,Extends,Matomo,我正在尝试添加一个自定义用户代理,以便与现有解析器一起解析自定义移动应用程序用户代理。我试着在这里关注这个问题:但是做不好 目录结构 UAParserService | |_ composer.json |_ Vendor |_ index.php |_ custom_apps.yml |_ CustomAppParser.php |_ DeviceDetector.php index.php <?php require_once "vendor/autoload.php&

我正在尝试添加一个自定义用户代理,以便与现有解析器一起解析自定义移动应用程序用户代理。我试着在这里关注这个问题:但是做不好

目录结构

UAParserService
|
|_ composer.json
|_ Vendor
|_ index.php
|_ custom_apps.yml
|_ CustomAppParser.php
|_ DeviceDetector.php 
index.php

<?php

require_once "vendor/autoload.php";

use DeviceDetector\DeviceDetector;
use DeviceDetector\Parser\Client\CustomAppParser;

$userAgent = "MyApp/1.0.0 (Linux; Android 9; ONEPLUS A6010)"; // Android App

$dd = new DeviceDetector($userAgent);
$parser = new CustomAppParser();
$dd -> addClientParser($parser);
$dd -> parse();

// Check if user agent is a bot
$isBot = $dd -> isBot();

if($isBot) {
    echo json_encode(["is_bot" => $isBot]);
}
else {
    $clientInfo = $dd->getClient();
    $osInfo = $dd->getOs();
    $device = $dd->getDeviceName();
    $brand = $dd->getBrandName();
    $model = $dd->getModel();

    echo json_encode([
        "is_bot" => $isBot,
        "client_info" => $clientInfo,
        "os_info" => $osInfo,
        "device_type" => $device,
        "device_brand" => $brand,
        "device_model" => $model,
    ], JSON_PRETTY_PRINT);
}
<?php


    namespace UAParserService\DeviceDetector;
    
    use function array_pop;
    use function array_unshift;
    
    class DeviceDetector extends \DeviceDetector\DeviceDetector
    {
        public function addClientParser($parser){
            parent::addClientParser($parser);
    
            $item = array_pop($this -> clientParsers);
            array_unshift($this -> clientParsers, $item);
        }
    }
<?php


namespace DeviceDetector\Parser\Client;


class CustomAppParser extends ClientParserAbstract
{
    protected $fixtureFile = "custom_apps.yml";
    protected $parserName  = "mobile app";

    protected function getRegexesDirectory()
    {
        return dirname(__DIR__);
    }
}  
我对名称空间非常不友好,所以我可能完全错了

我也会遇到一些错误:

(!)致命错误:未捕获错误:在第17行的F:\web projects\project1\UAParserService\index.php中找不到类“DeviceDetector\Parser\Client\FuryAppParser”

(!)错误:在第17行的F:\web projects\project1\UAParserService\index.php中找不到类“DeviceDetector\Parser\Client\CustomAppParser”


首先,你应该考虑把你自己的类放到专用文件夹中,比如<代码> SRC 之后,您可以添加

  "autoload": {
    "psr-4": {
      "UAParserService\\": "src/"
    }
  }
到您的
composer.json
并使用
composer dump autoload
命令更新autoloader

此时,您将拥有使用名称空间的设置

需要注意的事项

  • src
    文件夹中的所有类必须以
    UAParserService\
  • 文件名必须与类名匹配(区分大小写)
  • 文件夹结构必须与命名空间的元素匹配(区分大小写)
  • UAParserService
    元素在为类搜索文件夹时将被剥离
例如,如果
DeviceDetector
类具有
名称空间UAParserService\DeviceDetector
必须将其放入
scr/DeviceDetector/DeviceDetector.php
文件中。
CustomAppParser
类也是如此

另外,如果您想在
index.php
中使用自己的设备检测器,您应该将
use
语句更新为
use-UAParserService\DeviceDetector\DeviceDetector

旁注:对于方法调用,请不要在
->
运算符周围使用空格;)。至少在任何地方使用它,或者根本不使用它


<强> P.S.< /强>:请考虑重新命名你的问题,以反映它解决的实际问题;我的意思是,我们在这里解决的是名称空间问题,而不是扩展问题。

因为您似乎在使用composer(它使用PSR-4自动加载),我建议您查看和。文件只需正确放置(和命名),您需要让composer知道在哪里可以找到名称空间。链接是这样的。如果是关于正确地让composer知道在哪里可以找到名称空间,那么为了实现这一点,保留composer部分的实现是否正确?您的代码与PSR-4不兼容。文件名必须与类名相同。因此类
class Foo{}
应该存储在
Foo.php
中(使用相同的大小写)。您还需要编辑composer.json来定义
DeviceDetector
命名空间的根文件夹的位置。如果你阅读了我发布的链接,他们会给你一些例子和更详细的解释。@MagnusEriksson我已经更正了文件名和类名。device detector的根文件夹是指供应商文件夹吗?@MagnusEriksson很抱歉,我无法正确编辑composer.json。我尝试添加:
“autoload”:{“psr-4”:{“DeviceDetector\\”:“vendor/piwik/device-detector/”}
,但实际上什么也没做。还有一个问题,如果composer.json编辑成功,我还需要从索引调用任何此类吗?
  "autoload": {
    "psr-4": {
      "UAParserService\\": "src/"
    }
  }