海豚PHP是一套很不错的后端开发框架,尤其是其集成的Zbuilder更是让后端开发节省不少时间。波波刚好在最近一个项目中对该框架简单使用了一下,也遇到很多问题。今天记录的是API接口的开发。
海豚PHP尽管是一套基于ThinkPHP5.1开发的一套框架,但是在部分使用方面跟ThinkPHP还是存在不少差异。比如其模块的目录结构。
通常情况下,ThinkPHP的目录是在模块目录下直接建立controller、module、validate、view即可,但是海豚PHP似乎是为了让用户开发的模块包含前后端,在任意模块目录下均可建立admin目录作为模块后端的控制器。
废话不多说了,每个系统基本上都包含了开发者独特的思路。既然选择了我们还是要按对方的思路进行功能的开发。
为了给前后端分离的项目提供API接口,我直接在cms模块下建立了一个api目录,目录下是我写的控制器,写完以后,把"public"目录下的admin.php复制一份,改名“api.php”。
代码修改部分如下:(原先为admin)
- // 定义入口为api
- de fine('ENTRANCE', 'api');
同理,index.php文件中也需要增加一行。
- // 定义后台入口文件
- de fine('ADMIN_FILE', 'admin.php');
- de fine('API_FILE', 'api.php');
修改完毕,我们进行访问测试,api.index/模块名/控制器/方法,卧槽,竟然404了!!!
别急!核心操作了!打开“common/behavior/Config.php”,在第90行附近if...else...结构中增加一个api的判断即可。参考代码如下:
- // 如果定义了入口为admin,则修改默认的访问控制器层
- if(de fined('ENTRANCE') && ENTRANCE == 'admin') {
- de fine('ADMIN_FILE', substr($base_file, strripos($base_file, '/') + 1));
- if ($module == '') {
- header("Location: ".$base_file.'/admin', true, 302);exit();
- }
- if (!in_array($module, config('module.default_controller_layer'))) {
- // 修改默认访问控制器层
- config('url_controller_layer', 'admin');
- // 修改视图模板路径
- config('template.view_path', Env::get('app_path'). $module. '/view/admin/');
- }
- // 插件静态资源目录
- config('template.tpl_replace_string.__PLUGINS__', '/plugins');
- }elseif (de fined('ENTRANCE') && ENTRANCE == 'api'){
- //定义api访问行为
- config('default_return_type', 'json');
- de fine('API_FILE', substr($base_file, strripos($base_file, '/') + 1));
- if ($module == '') {
- header("Location: " . $base_file . '/api', true, 302);
- exit();
- }
- if (!in_array($module, config('module.default_controller_layer'))) {
- // 修改默认访问控制器层
- config('url_controller_layer', 'api');
- }
- // 插件静态资源目录
- config('view_replace_str.__PLUGINS__', '/plugins');
- } else {
- if ($module == 'admin') {
- header("Location: ".$base_dir.ADMIN_FILE.'/admin', true, 302);exit();
- }
- if ($module != '' && !in_array($module, config('module.default_controller_layer'))) {
- // 修改默认访问控制器层
- config('url_controller_layer', 'home');
- }
- }
修改完毕,再次通过url访问测试。终于OK了。
温馨提示:上述代码中“de fine”字符中间有空格,复制的话记得删除。