升级Laravel框架到5.4 并非通用类型的教程,仅仅是自己给小站做框架升级时的一份记录。 原框架版本:Laravel 5.0.35 现框架版本:Laravel 5.4.16

前言

由于版本跨度较大,并且在使用composer自动升级的过程中一直有问题,因此我没有选择常规的按引导一个版本一个版本迭代升级,而是直接Check了最新版本的Laravel项目代码,然后将旧版本的业务逻辑代码填进去。事实证明这么干效率反而高>_<当然前提是项目规模并不大、业务逻辑相对简单。

其实有件挺尴尬的事儿,之所以升级到了5.4.16这个目前最新的版本,完全是个意外,本来是打算用5.1、也就是官方提供的第一个TLS版本,但在创建项目时忘记改配置了,结果就当做是5.1去改直到最后收尾习惯性地“php artisan —version”的时候才发觉原来升到了5.4.16。


直观改变

  • 文件目录结构变动,职责划分更明确
    如路由,5.0时代所有路由默认都是写在 app/Http/route.php 文件中;5.4版本在根目录下新增了routes目录专门存放路由文件,默认创建了api.php、web.php等,并且使用不同模式解析不同类型的路由,使得接口请求响应得更快。
  • 更多地使用缓存,页面响应速度大大提升
    文件缓存主要位于两处,一是和之前一样的storage目录,主要缓存view、session等;二是位于 bootstrap/cache 目录下,主要存放route、service、config等。

升级过程中纠结过的地方

  • 尽管Laravel5.4文档中要求PHP版本大于等于5.6.4,但至少PHP 5.6.27 也是可以使用绝大部分功能的。暂时还未发现具体哪些功能不支持。
  • php artisan optimize (—force)命令不会起作用,准确的来说是不再会生成一个complied.php的压缩文件。常用缓存命令有以下这些:
    1. php artisan config:cache
    2. php artisan route:cache
  • PHP 5.6.* 已经废弃了$HTTP_RAW_POST_DATA,因此Laravel在解析某些请求时会报错:

    Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version.

    解决方法是修改php.ini中的“always_populate_raw_post_data”项的值为-1

  • 在使用模型(Eloquent ORM)进行数据库操作时,Laravel 5.4.* 默认使用自增主键ID,其类型也默认为是int,因此对于char型主键,会造成查询的主键值不正确。因此对于自定义数据库表,需要加上 public $incrementing = false 即关闭自增主键的标识。
  • Laravel默认使用的缓存策略为文件缓存,因此需要赋予 storage、bootstrap/cache 两个目录读写权限,Linux下命令为 chmod -R 777 storage

使用Laravel过程中的小坑

  • 时区问题。Laravel以config/app.php下的 timezone 配置为准来获取时区,而默认为UTC,需要更改为PRC或Asia/Shanghai|Chongqing,而php.ini中的 date.timezone 设置会忽略。

待续……