平台概述
开发者指引
开发文档
平台政策
联系我们
扩展
扩展Service / Dao
原理简介
下面以CourseService为例,说明如何对Service/Dao进行扩展。
在Controller中,我们为了获得CourseSerivce的实例,我们通常会这样的代码:
protected function getCourseService()
{
return $this->getServiceKernel()->createService('Course.CourseService');
}
其中createService
的参数Course.CourseService
,就是CoursService的地址,createService
默认会把这个地址翻译成:Topxia\Service\Course\Impl\CourseServiceImpl
,然后实例化它。
在做定制开发时,为满足某些功能需求,我们需要对CourseService进行功能扩展,粗暴的做法是直接修改CourseServiceImpl的代码,但这样做,一旦客户升级EduSoho住系统的时候CourseService就会被覆盖掉,导致定制的代码丢失,功能失效。为解决这个问题,EduSoho实现了Service/Dao的扩展机制,可直接配置Course.CourseService
所对应的具体的类名。
扩展步骤
下面以CourseService
为例,举例说明如何扩展Service:
- 创建配置文件
app/config/paramaters_service.yml
- 编辑配置文件,内容为:
parameters:
topxia_services:
'Course.CourseService' : 'Custom\\Service\\Course\\Impl\\CourseServiceImpl'
topxia_daos:
所有对service的配置,就写在topxia_services
下,所有对dao的配置,写在topxia_daos
下。
- 创建
src/Custom/Service/Course/Impl/CourseServiceImpl
文件。 - 编辑内容为:
<?php
namespace Custom\Service\Course\Impl;
use Topxia\Service\Course\Impl\CourseServiceImpl as BaseCourseServiceImpl;
class CourseServiceImpl extends BaseCourseServiceImpl
{
/**
* 例子: 扩展原有的课程创建方法
*/
public function createCourse($course)
{
}
/**
* 例子: 新增方法
*/
public function yourMethod($paramA, $paramB);
}
最佳实践
对表新增字段的情况
可以这样写:
<?php
namespace Custom\Service\Course\Impl;
use Topxia\Service\Course\Impl\CourseServiceImpl as BaseCourseServiceImpl;
class CourseServiceImpl extends BaseCourseServiceImpl
{
/**
* 例子: 扩展原有的课程创建方法
*/
public function createCourse($course)
{
// 小技巧: 如果大部分逻辑是跟原BaseCourseServiceImpl是一致的,可以这么写:
$savedCourse = parent::createCourse($course);
// 下面写你要扩展的代码
// 比如你对course表新加了个字段叫`fieldA`,且创建的时候,又需要把该字段写入数据库,可以这么写:
// 对$course['fieldA']数据过滤
//
// 更新$course['fieldA']到数据库
$savedCourse = $this->getCourseDao()->updateCourse($savedCourse['id'], array('fieldA' => $course['fieldA'] ));
return $savedCourse;
}
自定义数据标签、数据字典、个人动态
告诉EduSoho要自定义哪些数据
下面以CustomWebBundle为例:
use Topxia\Common\ExtensionalBundle;
class CustomWebBundle extends ExtensionalBundle
{
public function getEnabledExtensions()
{
return array('DataTag', 'StatusTemplate', 'DataDict');
}
}
上述代码的关键点是CustomWebBundle要继承自Topxia\Common\ExtensionalBundle
,并实现getEnabledExtensions
接口,getEnabledExtensions
接口声明你要自定义哪些数据。其中:
- DataTag : 表述数据标签
- StatusTemplate : 表示个人动态显示模版
- DataDict : 表示数据字典
自定义DataTag
在自己的Bundle下建立Extensions\DataTag
目录,直接在此目录下新建DataTag就行,参见src\Toxpia\WebBundle\Extensions\DataTag
目录下的文件。
自定义个人动态显示模版
在自己的Bundle下建立Extensions\StatusTemplate
目录,直接在此目录下新建StatusTemplate就行,参见src\Toxpia\WebBundle\Extensions\StatusTemplate
目录下的文件。
自定义DataDict
在自己的Bundle下建立Extensions\data_dict.yml
文件,参见src\Toxpia\WebBundle\Extensions\data_dict.yml
文件。