如何从Kohana 3.2升级到3.3(实施PSR-0)?

Daa*_*aan 2 unix command-line-interface kohana kohana-3.2 kohana-3.3

关于PSR-0的实现以及必须从命令行执行哪些命令,我​​需要采取哪些步骤从Kohana 3.2升级到3.3?

Daa*_*aan 6

Unix命令行:

这些是我在Kohana应用程序中实现PSR-0的步骤.

我删除了以下系统/目录:

rm -rf system
Run Code Online (Sandbox Code Playgroud)

在你当前的bootstrap.php中,唯一的变化就是让类以一个upper开头,所以最好保留你的旧引导程序,只需在文件顶部更改以下行:

// Load the core Kohana class
require SYSPATH.'classes/Kohana/Core'.EXT;

if (is_file(APPPATH.'classes/Kohana'.EXT))
{
  // Application extends the core
  require APPPATH.'classes/Kohana'.EXT;
}
else
{
  // Load empty core extension
  require SYSPATH.'classes/Kohana'.EXT;
}
Run Code Online (Sandbox Code Playgroud)

从新的kohana发行目录中删除bootstrap.php.现在将所有3.3的文件粘贴到您的旧应用程序:

cp -R path/to/new/kohana/* .
Run Code Online (Sandbox Code Playgroud)

现在将所有控制器和模型移动到大写目录并移除旧目录:

mv application/classes/controller/* application/classes/Controller
mv application/classes/model/* application/classes/Model
rm -rf application/classes/controller application/classes/model
Run Code Online (Sandbox Code Playgroud)

供应商目录在kohana目录的根目录中有一个固定的位置.将您的供应商目录从应用程序/供应商(如果有的话)移动到供应商/

mv application/vendor .
Run Code Online (Sandbox Code Playgroud)

编辑数据库配置文件(例如application/config/database.php),所有"type"属性都应该大写:

  return array
  (
    'default' => array
    (
      'type'       => 'MySQL',
Run Code Online (Sandbox Code Playgroud)

当您使用AUTH orm驱动程序并且已覆盖application/config/auth.php中的配置时,大写驱动程序名称:

return array(
  'driver'       => 'ORM',
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分,这些类的所有类名和文件名都应该大写.去班级目录.

cd application/classes
Run Code Online (Sandbox Code Playgroud)

并复制粘贴此命令:

  for SRC in `find . -depth`
  do DST=`dirname "${SRC}"`/`basename "${SRC}" | sed -e 's/^./\U&/'`;
      if [ "${SRC}" != "${DST}" ]
      then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
      fi
  done
Run Code Online (Sandbox Code Playgroud)

(来源:http://forum.kohanaframework.org/discussion/comment/73089#Comment_73089)

此命令递归检查所有目录并将文件名大写.转到应用程序目录.

cd ../
Run Code Online (Sandbox Code Playgroud)

现在在模型和控制器(和帮助程序)中,大写所有类名.所以Controller_template_parent必须成为Controller_Template_Parent.我有一些非常低效的命令(所以请贡献).

find ./ -name \*.php -exec sed  -i "s/helper_\([a-zA-Z]\+\)/Helper_\u\1/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/helper_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Helper_\u\1_\u\2/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/helper_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Helper_\u\1_\u\2_\u\3/gI" {} \;
Run Code Online (Sandbox Code Playgroud)

开头的./是针对所有文件(递归目录),以.php结尾.我在sed命令后面添加了一个"I"以使搜索大小写不敏感.(源命令:https://askubuntu.com/questions/84007/find-and-replace-text-within-multiple-files)

第一个命令将用Helper_Some_thing_here替换helper_some_thing_here.第二个命令会将helper_some_thing_here转换为Helper_Some_Thing_here等.因此,如果您的类名称中包含超过3个下划线,则可以构建自己的命令.

对于以Model_和Controller_开头的类,也需要做同样的事情

find ./ -name \*.php -exec sed  -i "s/model_\([a-zA-Z]\+\)/Model_\u\1/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/model_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Model_\u\1_\u\2/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/model_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Model_\u\1_\u\2_\u\3/gI" {} \;

find ./ -name \*.php -exec sed  -i "s/controller_\([a-zA-Z]\+\)/Controller_\u\1/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/controller_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Controller_\u\1_\u\2/gI" {} \;
find ./ -name \*.php -exec sed  -i "s/controller_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)/Controller_\u\1_\u\2_\u\3/gI" {} \;
Run Code Online (Sandbox Code Playgroud)

现在一些仅使用1个大写字母的类名现在用完整大写字母(Html,Url,Http,UTF8)编写.在整个应用程序中替换它们.

在application/dir中执行此命令:

find ./ -name \*.php -exec sed -i "s/Url::/URL::/gI" {} \;
find ./ -name \*.php -exec sed -i "s/Html::/HTML::/gI" {} \;
find ./ -name \*.php -exec sed -i "s/Http::/HTTP::/gI" {} \;
find ./ -name \*.php -exec sed -i "s/Utf8::/UTF8::/gI" {} \;
Run Code Online (Sandbox Code Playgroud)

当您使用ORM驱动程序时,您的所有Orm :: factory('some_class')应该是大写的并且大写为ORM :: factory('Some_Class').我使用相同的命令来大写所有ORM类并在工厂中大写类名.

find ./ -name \*.php -exec sed -i  "s/orm::factory(\(\"\|'\)\([a-zA-Z_]\+\)\(\"\|'\)\(,[^,]*\)*)/ORM::factory('\u\2'\4)/gI" {} \;
find ./ -name \*.php -exec sed -i  "s/orm::factory(\(\"\|'\)\([a-zA-Z]\+\)_\([a-zA-Z]\+\)\(\"\|'\)\(,[^,]*\)*)/ORM::factory('\u\2_\u\3'\5)/gI" {} \;
find ./ -name \*.php -exec sed -i  "s/orm::factory(\(\"\|'\)\([a-zA-Z]\+\)_\([a-zA-Z]\+\)_\([a-zA-Z]\+\)\(\"\|'\)\(,[^,]*\)*)/ORM::factory('\u\2_\u\3_\u\4'\6)/gI" {} \;
Run Code Online (Sandbox Code Playgroud)

现在我的模块从3.3开始不再兼容了,并非所有模块都升级了.当你想自己升级它们时,你可能需要单独检查它们去每个模块的类目录,大写它的文件和它的类名.您可以使用以前的命令.

对我来说,升级应用程序时这是一个清单,就像我说的那样,请随时提供帮助,以便更轻松地进行升级.