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

时间:2019-06-11 08:41:37

标签: php class namespaces extends matomo

我正在尝试添加一个自定义用户代理,以与现有解析器一起解析自定义移动应用程序用户代理。我尝试在此处跟踪问题:https://github.com/matomo-org/device-detector/issues/5931,但无法正确执行。

目录结构

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);
}

DeviceDetector.php

<?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);
        }
    }

CustomAppParser.php

<?php


namespace DeviceDetector\Parser\Client;


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

    protected function getRegexesDirectory()
    {
        return dirname(__DIR__);
    }
}  

composer.json

{
  "require": {
    "piwik/device-detector": "3.11.7",
    "ext-json": "*"
  }
}

我对名称空间非常不友好,所以我做错了。

我也确实遇到了一些错误:

  

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

     

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

1 个答案:

答案 0 :(得分:1)

首先,您应该考虑将自己的类放入专用文件夹中,例如src

之后,您可以添加

  "autoload": {
    "psr-4": {
      "UAParserService\\": "src/"
    }
  }

到您的composer.json,并使用composer dump-autoload命令更新自动加载器。

这时,您将设置使用名称空间的位置。

注意事项

  • 您在src文件夹中的所有类都必须以UAParserService\开头其命名空间
  • 文件名必须与类名匹配(区分大小写)
  • 文件夹结构必须与名称空间的元素匹配(区分大小写)
  • 在搜索班级文件夹时,
  • UAParserService元素将被剥离

例如,如果DeviceDetector类具有namespace UAParserService\DeviceDetector;,则必须将其放入scr/DeviceDetector/DeviceDetector.php文件中。 CustomAppParser类也是如此。

此外,如果您想在DeviceDetector中使用您自己的 index.php,则应将use语句更新为
use UAParserService\DeviceDetector\DeviceDetector; < / p>

旁注:请不要在->运算符周围使用空格进行方法调用;)。至少要么在各处使用它,要么根本不使用它...

PS :请考虑重命名您的问题,以反映其解决的实际问题;)。我的意思是我们在这里解决名称空间问题,而不是扩展问题。