jobeet第十五天:Web Services

*这一系列文章来源于Fabien Potencier,基于Symfony1.4编写的Jobeet Tutirual

在昨天的内容中,我们给Jobeet加上了订阅功能之后,用户就可以实时地接收到最新发布的信息了。

现在我们试着站在发布者的角度来思考,当发布者发布一个Job信息之后,发布者想要让尽可能多的人能够了解到这条信息。如果我们能把这些信息放在很多小网站上,这样一来看的人越多,那么发布者就将有更大几率能够找到适合这个工作的人选了。这就是所谓的长尾效应(long tail)Affiliates能够在他们的网站上发布最新的Job信息,这些都需要web services的支持,那么我们今天就来实现web services

Affiliates

就像我们在第二天中内容说的那样,一个Affiliate能够得到所有当前已激活的Job列表。

The fixtures

我们为Affiliates创建一个新的Fixture文件:

现在运行下面的命令,我们把定义在Fixture文件中的数据持久化到数据库中:

Fixture文件中,我们可以看到token是硬编码写上去的,这里的目的是为了方便测试。但当在实际的运行时,当用户需要申请为Affiliate时,这个token将会被自动生成。我们在Affiliate类中创建一个方法来生成token。我们先在ORM文件中的lifecycleCallbacks部分添加setTokenValue方法:

运行下面的命令会后,Affiliate类中将会生成setTokenValue()方法:

现在我们来修改这个方法:

重新加载数据:

 

The Job Web Service

和以前一样,我们每次创建新资源的的时候,第一件要做的事情就是定义路由,这是个好习惯:

通常我们修改过路由文件之后,我们都需要去清除cache

我们的下一步是创建api动作和相应的模板,它们会共享相同的动作。我们新建一个控制器文件,并把它命名为“ApiController”:

为了能够通过token获得Affiliate的信息,我们需要创建getForToken()方法。这个方法同样会验证Affiliate是否是已激活的,所以我们这里就不需要再判断Affiliate是否已被激活。到现在为止我们还尚未使用过AffiliateRepository,因为它还不存在。我们现在就来创建它,先修改ORM文件:

运行下面的代码:

创建完毕后,我们马上就可以使用它了:

当通过token取出对应的Affiliate之后,我们会调用getActiveJobs()方法返回属于某个分类的所有的Job信息给Affiliate。如果你打开JobRepository.php文件,可以看到getActiveJobs()方法没有提供任何的参数选项给Affiliate使用。为了能够重用这个方法,我们需要对它做一些修改:

就如你所看到的,我们调用了asArray()函数来填充jobs数组。我们来定义它:

 

XML格式

支持XML格式很简单,只需要创建一个模板即可:

 

JSON格式

支持JSON格式也是类似的:

 

YAML格式

如果你想通过一个无效的token来调用web service,那么不论你请求的是什么格式的内容,你都将会得到一个404响应。如果你想看到我们努力的成果,你可以试试访问下面的链接:http://jobeet.local/app_dev.php/api/sensio-labs/jobs.xml或者是http://jobeet.local/app_dev.php/api/symfony/jobs.xml。你可以修改URL中的扩展名来得到指定格式的内容。

测试Web Service

 

Affiliate申请表单

web service已经可以使用了,现在我们来添加创建Affiliate的表单吧。为了实现这个功能,我们需要写HTML表单,为每个表单域实现验证规则,把表单域的值处理后保存到数据库中,当表单数据有错误时还需要显示出错误信息反馈给用户。

首先我们先创建控制器文件,把它命名为AffiliateCotrolelr

然后修改layout.html.twig中的链接:

现在创建一个action来匹配刚才修改链接的路由:

我们已经有了路由的名字还有action,但我们还没有路由。所以我们来创建它:

同样需要在routing.yml文件中加入下面的代码:

表单类同样需要被创建出来。尽管Affiliate有很多的字段域,但我们没有必要把它们全部显示出来,因为有些字段域是不需要用来填写的。我们来创建Affiliate表单:

现在我们需要验证提交上来的Affiliate表单对象中的数据是否有效。我们在validation.yml文件中添加下面的代码:

在上面的代码中,我们使用了一个新的验证器,叫做UniqueEntity。它能够验证Doctrine实体对象中的一个或者多个特殊字段域是否是唯一的。这个十分常用,例如,我们需要防止一个新注册用户的email地址和已存在用户的email地址重复。

添加了验证约束之后不要忘记清除cache

最后一步需要创建表单试图:

当提交的表单数据如果是有效的,那么表单数据就会被保存到数据库中。我们为AffiliateController添加create动作:

当表单一旦被提交,那么createAction()就会被执行,所以我们需要定义路由:

Affiliate注册之后,他将会被重定向到等待页面。我们来为定义这个动作或试图吧:

 

现在添加路由:

定义好路由之后,我们需要清除cache

现在你可以试着点击首页中的Affiliates链接,你会跳转到Affiliate表单页面。

测试

最后一步是为新功能添加功能测试:

 

Affiliate后台管理

对于后台,我们会使用SonataAdminBundle。就像我们之前说过的那样,Affiliate注册之后需要等待admin来激活他。所以,当admin访问Affiliate页面后,他只能看到激活或者不激活这两个操作,这样有利于提高工作效率嘛。

首先,你需要在services.yml中声明Affiliate服务:

然后创建Admin文件:

为辅助管理员工作,我们想要只显示出未激活的Affiliate。我们能够通过过滤is_active值为falseAffiliate来实现这个功能:

现在我们创建AffiliateAdminController

我们来创建activatedeactivate批量操作:

为了能够让批量操作生效,我们把它添加到Admin::getBatchActions()方法中:

在此我们还需要给Affiliate实体添加两个方法:activate()deactivate()

现在我们为每条Affiliate信息都创建两个独立的动作,activatedeactivate。首先我们先为它们创建路由,这就是为什么我们的Admin类中重写了configureRoutes函数:

现在我们在AdminController中实现这两个动作:

现在为新添加的action创建模板:

 

AffiliateAdmin::configureListFields()方法中添加新的action和button后,我们就能在页面上看到每条Affiliate信息都把它们显示出来:

好的,马上清除掉cache来试试吧!

今天我们就到这了,明天我们会讲解发送邮件,当Affiliate被激活后将收到一封邮件。

 

原文链接:http://www.intelligentbee.com/blog/2013/08/21/symfony2-jobeet-day-15-web-services/

One comment

发表评论