Расширьте класс детектора устройств matomo / piwik, чтобы добавить новый клиентский анализатор (проблема с пространством имен) - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь добавить пользовательский агент пользователя для анализа пользовательского агента мобильного приложения вместе с существующими анализаторами. Я попытался проследить за проблемой здесь: 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": "*"
  }
}

Я крайне недружелюбен к пространствам имен, поэтому я могу делать это совершенно неправильно.

Я также получаю некоторые ошибки:

(!) Неустранимая ошибка: необученная ошибка: класс 'DeviceDetector \ Parser \ Client \ FurryAppParser' не найден в F: \ web projects \ project1 \ UAParserService \ index.php в строке 17

(!) Ошибка: класс 'DeviceDetector \ Parser \ Client \ CustomAppParser' не найден в F: \ web projects \ project1 \ UAParserService \ index.php в строке 17

1 Ответ

1 голос
/ 25 июня 2019

Прежде всего, вы должны подумать о том, чтобы поместить свои собственные классы в выделенную папку, например src.

. После этого вы можете добавить

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

к composer.json иобновите автозагрузчик с помощью команды composer dump-autoload.

На этом этапе у вас будет настройка для использования вашего пространства имен.

Замечания :

  • все ваши классы в папке src должны начинать свое пространство имен с UAParserService\
  • Имя файла должно соответствовать имени класса (с учетом регистра)
  • Структура папки должна соответствовать элементам пространства имен (с учетом регистра) * 1024Элемент *
  • UAParserService будет удален при поиске папок для вашего класса

Например, если класс DeviceDetector имеет namespace UAParserService\DeviceDetector;, он должен быть помещен в файл scr/DeviceDetector/DeviceDetector.php.То же самое относится к CustomAppParser классу.

Кроме того, если вы хотите использовать свой DeviceDetector в index.php, вы должны обновить use оператор доuse UAParserService\DeviceDetector\DeviceDetector;

Примечание : пожалуйста, не используйте пробелы вокруг оператора -> для вызовов методов;).По крайней мере, либо используйте его везде, либо не используйте его вообще ...

PS : пожалуйста, попробуйте переименовать ваш вопрос, чтобы отразить реальную проблему, которую он решает;).Я имею в виду, что мы решаем здесь проблему пространства имен, а не расширяем проблему.

...