扩展 matomo/piwik 设备检测器 class 以添加新的客户端解析器(命名空间问题)
Extend matomo/piwik device detector class to add new client parser (namespace issue)
我正在尝试添加一个自定义用户代理,用于与现有解析器一起解析自定义移动应用程序用户代理。我尝试在此处解决问题: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": "*"
}
}
我对命名空间非常不友好,所以我可能做错了。
我也确实遇到了一些错误:
( ! ) Fatal error: Uncaught Error: Class 'DeviceDetector\Parser\Client\FurryAppParser' not found in F:\web projects\project1\UAParserService\index.php on line 17
( ! ) Error: Class 'DeviceDetector\Parser\Client\CustomAppParser' not found in F:\web projects\project1\UAParserService\index.php on line 17
首先,你应该考虑把你自己的class放在专门的文件夹里,比如src
。
之后你可以添加
"autoload": {
"psr-4": {
"UAParserService\": "src/"
}
}
到您的 composer.json
并使用 composer dump-autoload
命令更新自动加载器。
此时您将设置好使用您的命名空间。
注意事项:
src
文件夹中的所有 classes 必须以 UAParserService\
开始其命名空间
- 文件名必须匹配class名称(区分大小写)
- 文件夹结构必须匹配命名空间的元素(区分大小写)
UAParserService
元素将在为您的 class 搜索文件夹时被删除
例如,如果 DeviceDetector
class 有 namespace UAParserService\DeviceDetector;
,则必须将其放入 scr/DeviceDetector/DeviceDetector.php
文件中。 CustomAppParser
class.
也是如此
此外,如果您想在 index.php
中使用 您自己的 DeviceDetector
,您应该将 use
语句更新为
use UAParserService\DeviceDetector\DeviceDetector;
旁注:请不要在 ->
运算符周围使用空格进行方法调用;)。至少要么到处使用它,要么根本不用它...
P.S.:请考虑重命名您的问题以反映它解决的实际问题;)。我的意思是我们在这里解决命名空间问题,而不是扩展问题。
我正在尝试添加一个自定义用户代理,用于与现有解析器一起解析自定义移动应用程序用户代理。我尝试在此处解决问题: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": "*"
}
}
我对命名空间非常不友好,所以我可能做错了。
我也确实遇到了一些错误:
( ! ) Fatal error: Uncaught Error: Class 'DeviceDetector\Parser\Client\FurryAppParser' not found in F:\web projects\project1\UAParserService\index.php on line 17
( ! ) Error: Class 'DeviceDetector\Parser\Client\CustomAppParser' not found in F:\web projects\project1\UAParserService\index.php on line 17
首先,你应该考虑把你自己的class放在专门的文件夹里,比如src
。
之后你可以添加
"autoload": {
"psr-4": {
"UAParserService\": "src/"
}
}
到您的 composer.json
并使用 composer dump-autoload
命令更新自动加载器。
此时您将设置好使用您的命名空间。
注意事项:
src
文件夹中的所有 classes 必须以UAParserService\
开始其命名空间
- 文件名必须匹配class名称(区分大小写)
- 文件夹结构必须匹配命名空间的元素(区分大小写)
UAParserService
元素将在为您的 class 搜索文件夹时被删除
例如,如果 DeviceDetector
class 有 namespace UAParserService\DeviceDetector;
,则必须将其放入 scr/DeviceDetector/DeviceDetector.php
文件中。 CustomAppParser
class.
此外,如果您想在 index.php
中使用 您自己的 DeviceDetector
,您应该将 use
语句更新为
use UAParserService\DeviceDetector\DeviceDetector;
旁注:请不要在 ->
运算符周围使用空格进行方法调用;)。至少要么到处使用它,要么根本不用它...
P.S.:请考虑重命名您的问题以反映它解决的实际问题;)。我的意思是我们在这里解决命名空间问题,而不是扩展问题。