EduSoho 8.0 升级指南

系统初始化命令改动

  1. app/console topxia:init # 7.0 系列
  2. app/console system:init # 8.0 系列

Migration

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

Example

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

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

具体例子如下

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

test migration 脚本的具体实现

  1. <?php
  2. use Phpmig\Migration\Migration;
  3. class Test extends Migration
  4. {
  5. /**
  6. * Do the migration
  7. */
  8. public function up() # 新建test表
  9. {
  10. $biz = $this->getContainer();
  11. $connection = $biz['db']; # 数据库连接在biz容器的['db']里
  12. $connection->exec("
  13. CREATE TABLE `test` (
  14. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';
  16. ");
  17. }
  18. /**
  19. * Undo the migration # 脚本回滚
  20. */
  21. public function down()
  22. {
  23. $biz = $this->getContainer();
  24. $connection = $biz['db'];
  25. $connection->exec("DROP TABLE IF EXISTS `test`;");
  26. }
  27. }

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

注意事项

  • 当执行bin/phpmig migrate 命令时出现 "[Doctrine\DBAL\DBALException] Unknow column type "enum" requested. " 时, 需要手动进入edusoho数据库执行以下命令:
  1. 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以上就跳过。

  1. cd <edusoho-dir>
  2. git checkout v7.2.5
  3. app/console doctrine:migrations:migrate # 执行老版本到7.2.5之间的migration
  4. git checkout develop
  5. # 执行migrate可能会报enum type的错误, 请先手动去掉ip_blacklist表里type字段的注释然后再执行此命令
  6. 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

插件

目录结构变化

原目录结构:

  1. plugins/
  2. Helloworld
  3. HelloworldBundle
  4. Controller
  5. DependencyInjection
  6. Configuration.php
  7. HelloworldExtension.php
  8. Resources
  9. config
  10. public
  11. views
  12. HelloworldBundle.php
  13. Scripts
  14. BaseInstallScript.php
  15. InstallScript.php
  16. Service
  17. helloworld
  18. Dao
  19. Impl
  20. HelloworldDaoImpl.php
  21. HelloworldDao.php
  22. Impl
  23. HelloworldServiceImpl.php
  24. HelloworldService.php
  25. plugin.json

现目录结构:

  1. plugins/
  2. HelloworldPlugin/
  3. Biz/
  4. Dao/
  5. Service/
  6. Controller/
  7. Migrations/
  8. Resources/
  9. config
  10. static-dist
  11. static-src
  12. views
  13. Scripts/
  14. BaseInstallScript.php
  15. InstallScript.php
  16. HelloworldPlugin.php
  17. 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。

插件相关命令

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

  1. old-plugin:create
  2. old-plugin:refresh
  3. old-plugin:register
  4. old-plugin:remove

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

配置文件的变更

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

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

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

  1. <?php
  2. namespace Custom\WebBundle;
  3. use Symfony\Component\HttpKernel\Bundle\Bundle;
  4. class CustomWebBundle extends Bundle
  5. {
  6. public function getParent()
  7. {
  8. return 'TopxiaWebBundle';
  9. }
  10. }

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

  • Custom 下所有的与 Topxia 同名 Controller,必须继承 Topxia 的 Controller。
  • 目前Custom下的路由配置文件,已经改成 custom_routing.ymlcustom_admin_routing.yml
    详见 Symfony 官方文档:http://symfony.com/doc/2.8/bundles/inheritance.html。