海滨擎蟹

禾匠小程序商城安装脚本解析

前言

没什么好说的,买的源码,yii2 框架,是禾匠科技开发的。从根目录的 version.json 文件内容 {"version": "2.9.35"} 了解了版本信息。禾匠科技官网上有两个版本,一个授权版,一个是开源版。授权版好处是可以得到支持和更新,但开户的小程序数量有限制,会收费;开源版可以一次性给到核心版源码(当然也是要收费的),后续开发需要自己解决,禾匠不会提供更新版本。对比各种信息,买的应该是开源版,版本有点低,官网上显示的已经到 4.0 版本了。

安装过程中出现的问题

在设置虚拟主机时,需要配置根目录。yii2 框架的根目录一般设置为项目目录下的 web 文件夹,这里做了一个适配,在项目目录下有一入口文件,具体内容如下:

<?php
if (file_exists(__DIR__ . '/install.lock.php')) {

    header('Location: web/');
} else {
    header('Location: web/install.php');
}

也就是说,不管是否已经安装过数据库,都跳转到 web 目录下。

填写完数据库相关的一些配置后,选择提交,然后就报了这错。

不确定是否是 yii2 框架内携带的方法,全局查找了一下,没有找到定义的位置。但在 README.md 中有意外发现:

在 Controller 中,可直接返回数组,以输出 JSON 数据:

return ['code' => $code, ...];

...
切勿在输出响应时使用废弃的 json_encoderenderJson 方法,将会引发 app\hejiang\exceptions\InvaildResponseException

那应该就是自定义的方法了,版本更迭,原来调用这个方法处理返回数据,现在直接返回数组,就可以。

改成直接返回 return $res; 后再次提交表单,又报错了,还是这个位置 →_→ 。

按照提示去找原因,调试经过层层调用,最后返回的错误信息大概意思是 “你不能将数组作为返回内容”。得了,肯定是内部没有处理返回的数组。尝试用 json_encode 处理结果,表单提交成功。

检查了一遍,数据库连接没有问题。想到大部分安装类的脚本好像都没有去创建数据库(可能没有操作权限,或者怕存在重复数据库,造成数据库覆盖,原有数据丢失),数据库本身需要用户自己手动创建。

手动创建一下即可。

.env 文件由 .env.example 文件复制而来,已经被添加到了 git 的忽视列表中,所以比较适合配置不同环境下的系统参数。

我这边在安装成功后,访问后台页面却出现空白页面,返回值为空。大部分情况下,这因为数据库连接参数问题导致的。复制来的 .env 文件内容(数据库相关的)如下:

...
## 数据库模式(可选值 "stand-alone" / "we7")
DB_MODE="we7"
## 数据库 DSN
DB_DSN="null"
## 数据库用户名
DB_USER="root"
## 数据库密码
DB_PASS=""
## 表名前缀
DB_PREFIX="hjmall_"
...

可以看到,DB_MODE 模式有两个选项,这两者都不太懂什么意思,也不知道具体有什么区别。yii2 框架 web 应用配置文件 config\web.php 中显示,配置数据库的文件为 config/db.php,查看该文件:

<?php

function handle_old_db_config() // before 2018.5.27
{
    $ind_db_file = __DIR__ . '/ind_db.php';
    if (file_exists($ind_db_file)) {
        return include $ind_db_file;
    } else {
        return select_db_config('we7');
    }
}

function select_db_config($mode)
{
    switch ($mode) {
        case 'stand-alone':
            return include __DIR__ . '/db-stand-alone.php';
        case 'we7':
            return include __DIR__ . '/db-we7.php';
        case null:
            return handle_old_db_config();
        default:
            throw new Exception('Unknown app mode.');
    }
}

$db_config = select_db_config(
    env('DB_MODE')
);

$db_config['enableSchemaCache'] = env('ENABLE_SCHEMA_CACHE', false);
$db_config['schemaCacheDuration'] = env('SCHEMA_CACHE_DURATION', 3600);
$db_config['schemaCache'] = env('SCHEMA_CACHE', 'cache');

$db_config['on afterOpen'] = function ($event) {
    $event->sender->createCommand(
        "SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"
    )->execute();
};

return $db_config;

从代码来看,禾匠定义的数据库模式应该是三种:stand-alonewe7 和空。三种模式分别引入不同的数据库配置文件,空模式是对旧版本的支持。但从这个版本的安装脚本来看,安装配置写入到了 config/ind_db.php 文件中,也就是说默认为空模式。该文件也在 git 忽视列表中。所以,在选择配置 .env 文件时,DB_MODE 设置空字符串即可。

在寻找 stand-alonewe7 模式的信息时,看到一则帖子对于 stand-alone 模式的配置(.env 文件):

DB_MODE="stand-alone"
DB_DSN="mysql:host=localhost;port=3306;dbname=数据库名"
DB_USER="数据库用户名"
DB_PASS="数据库密码"
DB_PREFIX="hjmallind_"

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »