EduSoho开发指南

研究背景:该Edusoho基于symfony2.8开发,但根据symfony2.8的文档描述和实际Edusoho项目结构对比,二者有较大的差别,同时Edusoho的开发文档并不全面,有许多坑。通过Symfony提供的文档,无法在Edusoho中通过命令行创建数据表和数据表对应的Dao和Service。我想应该是Edusoho团队已经将其进行了大量的修改,导致原本的Symfony文档无法为Edusoho服务。

所以我这里开始对该项目进行数据库新建表实行梳理。

  1. 在srcBiz目录下,随便找一个文件夹,这里以Activity文件夹为例。
  2. 在ActivityBizDao下创建XXXActivityDao.php接口文件,这是接口文件,继承基类GeneralDaoInterface;例如TestActivityDao.php
<?php
# 接口:一种成员属性全部为抽象或常量的特殊抽象类。
namespace Biz\Activity\Dao; #命名空间
use Codeages\Biz\Framework\Dao\GeneralDaoInterface; #基类

interface TestActivityDao extends GeneralDaoInterface
{
    public function getById($id); #自定义一个函数
}
  1. 在ActivityBizDaoImpl目录下创建XXXActivityDaoImpl.php文件,继承GereralDaoImpl基类,调用上面创建的接口TestActivityDao.php;
<?php
# 这里的内容参考:https://blog.csdn.net/jyl_sh/article/details/106616322
namespace Biz\Activity\Dao\Impl; # 命名空间
use Biz\Activity\Dao\TestActivityDao; # 刚刚创建的接口文件
use Codeages\Biz\Framework\Dao\GeneralDaoImpl; # 基类

class TestActivityDaoImpl extends GeneralDaoImpl implements TestActivityDao
{
    protected $table = 'test'; # 要操作的表名

    public function declares() # 这是必须的函数
    {
        // TODO: Implement declares() method.
        return array(
            'timestamps' => array('created_time', 'update_time'),
            'serializes' => array(),
            'orderbys' => array(),
            'conditions' => array(
                'type = :type',
            ),
        );
    }

    public function getById($id) # 这是接口中有的函数,必须在这里也调用,并实现增删改查的逻辑
    {
        return $this->get($id);
    }
}
  1. 完成上面的Dao创建,下面需要创建Service。找到ActivityBizService,创建XXXXActivityService.php接口文件,不用继承任何基类;例如:TestActivityService.php
<?php
namespace Biz\Activity\Service;
interface TestActivityService
{
    public function getActivity($id);

    public function findActivitiesByIds($ids);

    public function findActivitiesByMediaIds($mediaIds);

    public function createActivity($fields);

    public function updateActivity($id, $fields);

    public function deleteActivity($id);

}
  1. 找到ActivityBizServiceImpl目录,创建XXXXActivityServiceImpl.php文件,继承基类BaseService,调用刚刚创建的接口文件TestActivityService。其中接口文件中有的函数必须在此文件中创建相同的函数
<?php
namespace Biz\Activity\Service\Impl; # 命名空间
use Biz\BaseService; # 服务基类
use Biz\Activity\Dao\TestActivityDao; #之前创建的Dao
use Biz\Activity\Service\TestActivityService; # 上一步创建的服务接口文件
class TestActivityServiceImpl extends BaseService implements TestActivityService
{

    public function getActivity($id)
    {
        // TODO: Implement getActivity() method.
        return $this->getTestActivityDao()->getById($id);
    }

    public function findActivitiesByIds($ids)
    {
        // TODO: Implement findActivitiesByIds() method.
    }

    public function findActivitiesByMediaIds($mediaIds)
    {
        // TODO: Implement findActivitiesByMediaIds() method.
    }

    public function createActivity($fields)
    {
        // TODO: Implement createActivity() method.
    }

    public function updateActivity($id, $fields)
    {
        // TODO: Implement updateActivity() method.
    }

    public function deleteActivity($id)
    {
        // TODO: Implement deleteActivity() method.
    }

    /**
     * @return TestActivityDao
     */
    protected function getTestActivityDao()
    {
        # 使用createDao来使用之前创建的Dao
        return $this->createDao('Activity:TestActivityDao');
    }
}
  1. 可以看到上一个文件底部创建了一个接口文件中不存在的函数getTestActivityDao(),这个函数用于调用之前已经创建号的Dao,其中$this->createDao('Activity:TestActivityDao')中的Activity是Dao所在的文件夹,TestActivityDao必须是已经创建好的Impl文件,即为TestActivityDaoImpl.php。在函数getActivity中通过已经创建好的getTestActivityDao()函数来调用Dao中的getById函数,其中已经实现了增删改查的逻辑。
  2. 如何调用服务来实现具体的业务呢?这里我们先在控制器获取服务,在控制器中创建如下函数。该函数的功能用于调用已经创建好的服务,服务再调用Dao,Dao再执行具体的业务逻辑。
# 获取具体的服务
function getTestServer()
{
    return $this->getBiz()->service('Activity:TestActivityService');
}
  1. 服务获取到后,通过如下方法调用到具体的Dao中的函数。其中getTestServer是上一步创建好的获取服务的函数,getActivity()是在服务的Impl中定义的函数,此函数中又调用了Dao中的getById函数,以达到查询的目的。
$arr = $this->getTestServer()->getActivity(1);
var_dump($arr);
最后修改:2023 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏