使用全局事件来做访客追踪

Yii框架的特性列表里,有一项叫“Event Driven”,所谓的事件驱动,但是在实际业务开发实践中,我发现即便有应用场景,大家也倾向于不用,究其原因,还是不熟悉。

当然,我认为,作为Yii框架的官方开发团队,没有在这方面给出充足的,合适的例子,来说明这个特性的使用场景,也有着不可推卸的责任。

生搬硬套,为了使用event而去使用event,这种是我们坚决要杜绝的行为,那么到底在哪里使用这个特性才显得恰如其分呢?当然,笔者也没有一个非常好的标准去判断,只是偶有所得,在此跟大家分享一下。

在我所接触的业务模型中,有一个特性是,追踪用户的访问来源。对于一个有用户体系,需要用户注册的业务来说,起成长离不开用户数的增长,而这个用户数的增长,不是自然而然的,现在的互联网,早已进入信息过载时代了,如果没有特殊的渠道将一个服务带入到用户的视野,那么用户永远不会发现你的服务。在此场景下,我们需要给我们的渠道一些回报,无论是流量上的回报,还是经济上的回报,你们懂的。于是,就衍生出一个需求,我们必须精准的追踪访客的来源,如果访客完成了注册,则需要给某个特定的渠道账户记上一笔。

当然,你可以耍赖,硬说用户不是渠道来的,这不在本文分析的范围内,我们只谈论技术问题。

在Yii框架里,我是怎么使用Event特性来支持这个需求的呢?

用户可能从任何地方,各式各样的渠道,跳转到我们网站各种页面上面。一般,我们会针对各种不同的渠道,设计各种不同的落地页面,所以,每次用户进来的时候,不一定会访问某个Action,而用户进来,一般不会立即注册,往往先要到处逛逛,了解清楚了网站提供的服务后,才决定是否注册。

一般,我们通过Get参数来携带访客来源信息,但是用户一旦刷新页面或者来回跳转,信息就丢了。这里我们采用的一个技巧是,将来源信息记入到cookie里面,但是在什么地方设置cookie呢?

你大可以在每个落地Action里面去写一遍这个代码,但是我想很快,你就会被恶心死,因为一模一样的机械劳动,完全浪费时间而已。

这个时候,我认为,比较适合使用Event特性。因为Yii框架天然提供了一个全局的Event,就是onBeginRequest,在任何请求开始处理之前,即会触发。所以,在这个场景我认为是特别合适的。

你要做的只是:

1
2
3

onBeginRequest = ;

那么这行代码到底应该写在哪里呢?直觉上,你是不是觉得应该做一个所有Controller的基类,然后在基类构造函数里去写这个事件绑定?那就错了,因为onBeginRequest发生的时候,Controller还没开始构造,是不是很抓狂?

第二个你想到的地方是哪里?会不会是在index.php里面:

1
2
3
4
5
6
7
8

run();
//改成

$app = Yii::createApplication($config);
$app->onBeginRequest = ;
$app->run();

当然,这样真的没问题了,因为在run之前,就已经完成了事件的绑定。

不过,其实Yii框架提供了一个更好的地方去写这个代码,config目录的main.php,对,就是主配置文件里面,只要添加一个键,名字叫 onBeginRequest,值就是你要绑定的Handler,即可。是不是很巧妙,这个就是另一个特性Component组件化构造来支持的了。两个特性组合起来,优雅实现了事件绑定。

更多问题即时探讨,请加群:
「Yii框架工程师交流群」Yii框架工程师交流群

加群请注明使用年限,使用Yii框架经验1年以下的免加,

鼓励潜水,鼓励探讨问题,问任何问题之前,自己请先给出一个答案,营造良好的讨论环境。

Yii框架交流群二维码