扩展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:

  1. 创建配置文件 app/config/paramaters_service.yml
  2. 编辑配置文件,内容为:
parameters:
    topxia_services:
        'Course.CourseService' : 'Custom\\Service\\Course\\Impl\\CourseServiceImpl'

    topxia_daos:

所有对service的配置,就写在topxia_services下,所有对dao的配置,写在topxia_daos下。

  1. 创建src/Custom/Service/Course/Impl/CourseServiceImpl文件。
  2. 编辑内容为:

<?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文件。