EDUSOHO踩坑笔记之五十:EduSoho 8.0 升级指南
   
    
    
    系统初始化命令改动
   
 - 
     
 app/console topxia:init # 7.0 系列
 
- 
     
 app/console system:init # 8.0 系列
 
    
    
    Migration
   
    在7.0版本包括之前的版本中,数据库migration脚本文件的创建和执行是用
    
     doctrine generate
    
    和
    
     doctrine migrate
    
    这两个命令。在8.0中数据库脚本文件创建和执行命令是使用
    
     bin/phpmig
    
    目录下的去执行。
   
    
    
    Example
   
 - 
     
 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]
    
    通过版本号去回滚执行。
   
具体例子如下
 - 
     
 bin/phpmig generate test #新建创建test表的migration脚本
 
test migration 脚本的具体实现
 - 
     
 <?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数据库执行以下命令:
 - 
     
 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以上就跳过。 
 - 
     
 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
 
    新的插件命令,请参考新插件的使用文档:
    
     插件的命令行工具
    
    。
   
    
    
    EDUSOHO踩坑笔记之五十一:配置文件的变更
   
    已安装的插件,原会写入
    
     app/data/plugin_installed.php
    
    文件,新插件会写入到
    
     app/config/plugin.php
    
    。
   
    定制开发 Custom 目录下 twig/controller/routing.yml 等覆盖
   
    原来的配置项
    
     template_overwrite_map
    
    已经失效。需要修改
    
     CustomWebBundle.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,也会直接覆盖。所以:
   
- Custom 下所有的与 Topxia 同名 Controller,必须继承 Topxia 的 Controller。
- 
     目前Custom下的路由配置文件,已经改成
 
 custom_routing.yml
 
 ,
 
 custom_admin_routing.yml
 
 。
 
 详见 Symfony 官方文档:
 
 http://symfony.com/doc/2.8/bundles/inheritance.html。
 
 
