Skip to content

EduSoho 8.0 升级指南

系统初始化命令改动

bash
app/console topxia:init # 7.0 系列 
app/console system:init # 8.0 系列

Migration

在7.0版本包括之前的版本中,数据库migration脚本文件的创建和执行是用doctrine:migrations:generatedoctrine:migrations:migrate 这两个命令。在8.0中数据库脚本文件创建和执行命令是使用bin/phpmig目录下的去执行。

Example

bash
bin/phpmig generate [name] # name可更改, 命名规范,name需要表明意图 如:`create_course` 表明要创建course表等
bin/phpmig migrate # 同 app/console doctrine:migrations:migrate
bin/phpmig # 可查看所有支持的命令

新写的数据库脚本要支持执行和回滚,这意味着数据库脚本不能像7.0之前一样只用写 up 方法,也要写 down 方法。这样就可以使用 bin/phpmig redo [version] 通过版本号去回滚执行。

具体例子如下

bash
bin/phpmig generate test  #新建创建test表的migration脚本

test migration 脚本的具体实现

php
<?php

use Phpmig\Migration\Migration;

class Test extends Migration
{
    /**
     * Do the migration
     */
    public function up()  # 新建test表
    {
        $biz        = $this->getContainer();
        $connection = $biz['db'];  # 数据库连接在biz容器的['db']里
        $connection->exec("
           CREATE TABLE `test` (
              `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';
        ");

    }

    /**
     * Undo the migration # 脚本回滚
     */
    public function down()
    {
        $biz        = $this->getContainer();
        $connection = $biz['db'];
        $connection->exec("DROP TABLE IF EXISTS `test`;");
    }
}

这样当数据库已经有test表的时候,Migrate 命令执行会报错可以通过手动执行 down 方法里的 SQL 脚本来消除错误。

注意事项

  • 当执行bin/phpmig migrate 命令时出现 "[Doctrine\DBAL\DBALException] Unknow column type "enum" requested. " 时, 需要手动进入edusoho数据库执行以下命令:

    sql
    ALTER TABLE `ip_blacklist` MODIFY `type`  enum('failed','banned') NOT NULL DEFAULT 'failed' COMMENT '禁用类型'

    由于之前该字段的注释 加了 DC2TYPE 导致 string 被改成 enum,所以去掉该注释即可。

  • 新部署的开发环境直接在 develop 执行 bin/phpmig migrate 可跳过该注意事项。由于新的 migration 是在7.2.5版本上支持的,所以在7.2.5之前的开发环境需要将分支切换到v7.2.5这个tag上 然后执行老版本到7.2.5版本之间的migration,然后再切换到新分支执行 bin/phpmig migrate命令去执行从7.2.5到develop之间的migration。

  • 当前开发环境在7.2.5之前才执行以下命令, 7.2.5以上就跳过。

    bash
    cd <edusoho-dir>
    git checkout v7.2.5
    app/console doctrine:migrations:migrate # 执行老版本到7.2.5之间的migration
    git checkout develop
    # 执行migrate可能会报enum type的错误, 请先手动去掉ip_blacklist表里type字段的注释然后再执行此命令
    bin/phpmig migrate #执行7.2.5到develop之间的migration;

    如果当前在7.2.5之后,直接切换到develop,执行bin/phpmig migrate命令,如果命令执行途中某个version有报错信息,暂时先把该version的up方法注释掉然后重新执行migrate命令,以确保migration能正确执行。

Vendor

EduSoho 8.0 版本更新了 Symfony 的版本到 2.8 去掉了一些无用的包如 ORM 等。7.0 的 vendor 目录是在 vendor2 目录下,由于 php composer 默认使用 vendor 目录,这导致我们增加新的依赖包十分的不方便,所以8.0中将原先的 vendor2 目录清除了,改为了 vendor

插件

目录结构变化

原目录结构:

plugins/
  Helloworld
    HelloworldBundle
      Controller
      DependencyInjection
        Configuration.php
        HelloworldExtension.php
      Resources
        config
        public
        views
      HelloworldBundle.php
    Scripts
      BaseInstallScript.php
      InstallScript.php
    Service
      helloworld
        Dao
          Impl
            HelloworldDaoImpl.php
          HelloworldDao.php
        Impl
          HelloworldServiceImpl.php
        HelloworldService.php
    plugin.json

现目录结构:

plugins/
  HelloworldPlugin/
    Biz/
      Dao/
      Service/
    Controller/
    Migrations/
    Resources/
      config
      static-dist
      static-src
      views
    Scripts/
      BaseInstallScript.php
      InstallScript.php
    HelloworldPlugin.php
    plugin.json
  • 修改插件名,须带后缀Plugin;
  • HelloworldBundle下 的目录和文件移到与 HelloworldBundle 的平级目录,删除 HelloworldBundle 目录;
  • 修改 HelloworldBundle.php 名字为 HelloworldPlugin.php,需要继承 Codeages\PluginBundle\System\PluginBase
  • 新建 Biz 目录及其相应子目录,把 service 下的文件移到 Biz 相应目录下;
  • public 的目录移到 static-src 目录下,删除 public 目录,且把 js 目录下的 controller 下的目录文件移到 js 目录下,删除 controller 目录;
  • 修改所有PHP文件的 namespace。

插件相关命令

在一段时期内,还是会兼容老的插件机制。老的插件机制命令已经更名成:

old-plugin:create
old-plugin:refresh
old-plugin:register
old-plugin:remove

新的插件命令,请参考新插件的使用文档:插件的命令行工具

配置文件的变更

已安装的插件,原会写入 app/data/plugin_installed.php 文件,新插件会写入到 app/config/plugin.php

定制开发 Custom 目录下 twig/controller/routing.yml 等覆盖

原来的配置项 template_overwrite_map 已经失效。需要修改 CustomWebBundle.php 如下:

php
<?php
namespace Custom\WebBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class CustomWebBundle extends Bundle
{
    public function getParent()
    {
        return 'TopxiaWebBundle';
    }
}

Symfony 框架会按上面指定的 bundle 覆盖 Resources/ 目录下的相同文件,功能和之前的 template_overwrite_map 一样。 注意 Resources/目录下所有的重名文件都会覆盖。此外,相同名字controller,也会直接覆盖。所以:

  1. Custom 下所有的与 Topxia 同名 Controller,必须继承 Topxia 的 Controller。
  2. 目前Custom下的路由配置文件,已经改成 custom_routing.ymlcustom_admin_routing.yml

详见 Symfony 官方文档:http://symfony.com/doc/2.8/bundles/inheritance.html。