定制 castrocrea/mixpanel-bundle 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

castrocrea/mixpanel-bundle

Composer 安装命令:

composer require castrocrea/mixpanel-bundle

包简介

Symfony bundle for Mixpanel

README 文档

README

Build Status

Integration of the Mixpanel library into Symfony.

Installation

Require gordalina/mixpanel-bundle using composer

$ php composer.phar require gordalina/mixpanel-bundle:~3.0

Or require gordalina/mixpanel-bundle to your composer.json file:

{
    "require": {
        "gordalina/mixpanel-bundle": "~3.0"
    }
}

Register the bundle in config/bundles.php:

// config/bundles.php
    return [
        // ...
        Castrocrea\MixpanelBundle\CarstrocreaMixpanelBundle::class => ['all' => true],
    ];
}

Enable the bundle's configuration in app/config/config.yml:

# app/config/config.yml

castrocrea_mixpanel:
    projects:
        default:
            token: xxxxxxxxxxxxxxxxxxxx

Usage

This bundle registers a castrocrea_mixpanel.default, mixpanel.default and mixpanel service which is an instance of Mixpanel (from the official library). You'll be able to do whatever you want with it.

NOTE: This bundle sends your client's ip address automatically. If you have a reverse proxy in you servers you should set it in your front controller public/index.php:

// public/index.php
Request::setTrustedProxies(
    // the IP address (or range) of your proxy
    ['192.0.0.1', '10.0.0.0/8'],
    Request::HEADER_X_FORWARDED_ALL
);

You can find more documentation on Symfony website: How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy

Killer Feature

Track an event with a single annotation

<?php
// CheckoutController.php

use Castrocrea\MixpanelBundle\Annotation as Mixpanel;

class CheckoutController
{
    /**
     * @Mixpanel\Track("View Checkout")
     */
    public function view(Request $request)
    {
        // ...
    }

Sending people information to Mixpanel

Mixpanel allows you to track your user's behaviours, but also some user information. When using annotations which require the distinct_id, this will be set automatically. This is done automatically provided you have configured it properly. You are able to override this value if you wish.

# config/packages/castrocrea_mixpanel.yaml

castrocrea_mixpanel:
    projects:
        default:
            token: xxxxxxxxxx
    users:
        Symfony\Component\Security\Core\User\UserInterface:
            id: username
            $email: email

        # All possible properties
        YourAppBundle\Entity\User:
            id: id
            $first_name: first_name
            $last_name: last_name
            $email: email
            $phone: phone
            extra_data:
                - { key: whatever, value: test }

This bundle uses property access to get the values out of the user object, so event if you dont have a first_name property, but have a getFirstName method it will work.

NOTE: extra_data corresponding non-default properties in Mixpanel user profile

<?php
// UserController.php

use Castrocrea\MixpanelBundle\Annotation as Mixpanel;

class UserController
{
    /**
     * @Mixpanel\UpdateUser()
     */
    public function userUpdated(User $user, Request $request)
    {
        // ...
    }

In the following example, we call UpdateUser, which sends all information registered in the configuration above, but we override the id property with an expression that evaluates the user id. The @Expression annotation uses ExpressionLanguage for evaluation.

<?php
// OrderController.php

use Castrocrea\MixpanelBundle\Annotation as Mixpanel;

class OrderController
{
    /**
     * @Mixpanel\Track("Order Completed", props={
     *      "user_id": @Mixpanel\Expression("user.getId()")
     * })
     * @Mixpanel\TrackCharge(
     *      id=324"),
     *      amount=@Mixpanel\Expression("order.getAmount()")
     * )
     */
    public function orderCompleted(Order $order, Request $request)
    {
        // ...
    }

Annotations

Mixpanel Actions

Events

  • @Mixpanel\Register(prop="visits", value=3)
  • @Mixpanel\Track(event="name", props={ "firstTime": true })
  • @Mixpanel\Unregister(prop="$email")

Engagement

  • @Mixpanel\Append(id=324, prop="fruits", value="apples" [, ignoreTime=false])
  • @Mixpanel\ClearCharges(id=324 [, ignoreTime=false])
  • @Mixpanel\DeleteUser(id=324 [, ignoreTime=false])
  • @Mixpanel\Increment(id=324, prop="visits", value=3 [, ignoreTime=false])
  • @Mixpanel\Remove(id=324, prop="$email")
  • @Mixpanel\Set(id=324, props={ "firstTime": true } [, ignoreTime=false])
  • @Mixpanel\SetOnce(id=324, props={ "firstTime": true } [, ignoreTime=false])
  • @Mixpanel\TrackCharge(id=697, amount="20.0" [, ignoreTime=false])

Custom Annotations

  • @Mixpanel\Id()
  • @Mixpanel\Expression(expression="<expression>")
  • @Mixpanel\UpdateUser()

Note: The first argument is not required to specify the name explicitly, e.g: @Mixpanel\Expression("<expression>") or @Mixpanel\Set("<property>", value="<value>").

Note: All id properties can be omitted, as they will be set with the id of the current user in security.context

Send an event based on a condition

In all annotations, you can add conditions with Expression Language

/**
* @Mixpanel\Track("Your event", condition="request.getMethod() in ['GET']")
*/
public function yourAction()
{
  // ...
}

Note: By default condition is true and is not required.

MixpanelEvent

You can also send an event through symfony events when the annotations are not sufficient like this:

#In controller
namespace myNamespace;

use Castrocrea\MixpanelBundle\Annotation as Annotation;
use Castrocrea\MixpanelBundle\Mixpanel\Event\MixpanelEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

// ...

public function edit(User $user, EventDispatcherInterface $eventDispatcher, Request $request)
{
    // Your code
    $annotation = new Annotation\Track();
    $annotation->event = 'My event';
    $annotation->props = [
        'prop 1' => 'data 1',
        'prop 2' => 'data 2',
    ];
    
    $eventDispatcher->dispatch(new MixpanelEvent($annotation, $request));
    // Rest of your code
}

Override Props in all Annotations

In all your annotations, you can have something like this:

    /**
     * @Mixpanel\Track("Your event", props={
     *      "user_id": @Mixpanel\Expression("user.getId()")
     * })
     */
    public function yourAction()
    {
        // ...
    }

It can be annoying to always have to put the same properties in your annotations. The functioning of the events allows us to avoid that.

namespace YourNamespace;

use Doctrine\Common\Annotations\Reader;
use Castrocrea\MixpanelBundle\Annotation;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\Security\Core\Security;

class MixpanelListener
{
    private $annotationReader;
    private $security;

    public function __construct(Reader $annotationReader, Security $security)
    {
        $this->annotationReader = $annotationReader;
        $this->security         = $security; 
    }

    public function onKernelController(ControllerEvent $event)
    {
        if (!\is_array($controller = $event->getController())) {
            return;
        }

        $className = \get_class($controller[0]);
        $object    = new \ReflectionClass($className);
        $method    = $object->getMethod($controller[1]);

        $classAnnotations  = $this->annotationReader->getClassAnnotations($object);
        $methodAnnotations = $this->annotationReader->getMethodAnnotations($method);

        foreach ([$classAnnotations, $methodAnnotations] as $collection) {
            foreach ($collection as $annotation) {
                if ($annotation instanceof Annotation\Annotation && property_exists($annotation, 'props')) {
                    $annotation->props['user_id'] = $this->security->getUser()->getId();
                }
            }
        }
    }
}

And in your config:

    YourNamespace\MixpanelListener:
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController, priority: -200 }

Symfony Profiler Integration

Mixpanel bundle additionally integrates with Symfony2 profiler. You can check number of events and engagements sent, total execution time and other information.

Example Toolbar

Reference Configuration

You'll find the reference configuration below:

# app/config/config*.yml

castrocrea_mixpanel:
    enabled: true                                        # defaults to true
    enable_profiler: %kernel.debug%                      # defaults to %kernel.debug%
    auto_update_user: %kernel.debug%                     # defaults to %kernel.debug%
    throw_on_user_data_attribute_failure: %kernel.debug% # defaults to %kernel.debug%
    projects:
        default:
            token: xxxxxxxxxxxxxxxxxxxxxxxxxxxx # required
            options:
                max_batch_size:  50               # the max batch size Mixpanel will accept is 50,
                max_queue_size:  1000             # the max num of items to hold in memory before flushing
                debug:           false            # enable/disable debug mode (logs messages to error_log)
                consumer:        curl             # which consumer to use (curl, file, socket)
                consumers:
                    custom_consumer:  ConsumerStrategies_CustomConsumConsumer # Your consumer, update above to use it
                host:            api.mixpanel.com # the host name for api calls
                events_endpoint: /track           # host relative endpoint for events
                people_endpoint: /engage          # host relative endpoint for people updates
                use_ssl:         true             # use ssl when available
                error_callback:  'Doctrine\Common\Util\Debug::dump'

        minimum_configuration:
            token: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
    users:
        Symfony\Component\Security\Core\User\UserInterface:
            id: username
            $email: email

        # All possible properties
        YourAppBundle\Entity\User:
            id: id
            $first_name: first_name
            $last_name: last_name
            $email: email
            $phone: phone

Spec

In order to run the specs install all components with composer and run:

./bin/phpspec run

License

This bundle is released under the MIT license. See the complete license in the bundle:

Resources/meta/LICENSE

castrocrea/mixpanel-bundle 适用场景与选型建议

castrocrea/mixpanel-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 11 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 06 月 15 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「symfony」 「bundle」 「mixpanel」 「php8」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 castrocrea/mixpanel-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 castrocrea/mixpanel-bundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 castrocrea/mixpanel-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 11
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 14
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2021-06-15