thinkphp 3.2 只能使用默认的控制器与操作方法

CKJ172 2014-11-11 05:57:06
事情是这样的,我不能建立自己的控制器,只能使用默认的 /Home/Controller/IndexController/Index/index 方法下的逻辑。

意思就是说即使我在 /Home/Controller/IndexController/Index/hello 访问,依然不生效,以下是代码:



<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>[ 您现在访问的是Home模块的Index控制器 ]</div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8');
}

public function hello(){
echo 'hello';
}
}



不过我修改了惯例配置里面的 默认模块 / 默认控制器 / 默认操作,改成自己的控制器与操作,这样是可以使用自己的控制器的,那就是我只能使用一个控制器了!?求各位php大神指教!是我的配置环境有问题吗?

我的controller名字等没有写错,我下载了别人声称能运行的代码,到我这边就不可以了!
我用的是thinkphp 3.2 版本
...全文
837 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
CKJ172 2014-11-11
  • 打赏
  • 举报
回复
终于还是自己解决了问题,看了ThinkPHP里面的源代码,发现用 http://localhost:9999/index.php?c=Read&a=index 这样的URL是能正常访问我自己的控制器和操作的,那问题就在于我的thinkphp不支持PATHINFO方式了! 为什么偏偏我的不支持呢?再看3.2的开发手册,原来是低版本的nginx不支持,如何解决参考以下文章 http://www.smzdy.com/nginx-kai-qi-pathinfo-di-ling-yi-zhong-xie-fa-yi-jing-yong.html by the way,我的nginx 版本是1.1.19,的确有点旧了!
CKJ172 2014-11-11
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
看上去你什么也没动 那么访问应是 http://localhost/home/index/index http://localhost/home/index/hello
是的,我也原来这样以为,实际上两个URL的访问结果都一样,都是http://localhost/home/index/index,这是我迷惑的地方。 我尝试了,如果在惯例配置文件里配置了,是可以使用http://localhost/home/index/hello的。另外,在入口文件index.php中也可以通过常量的设置BIND_MODULE BIND_CONTROLLER BIND_ACTION指定的默认模块 控制器 操作 可惜,我就是用不到自己的控制器,自己的操作,好晕啊!!!望各大神帮忙!
xuzuning 2014-11-11
  • 打赏
  • 举报
回复
看上去你什么也没动 那么访问应是 http://localhost/home/index/index http://localhost/home/index/hello
CKJ172 2014-11-11
  • 打赏
  • 举报
回复
3.2版本开始就没有action了,用controller代替~~~我没有改了什么配置啊,莫名其妙
KazJ 2014-11-11
  • 打赏
  • 举报
回复
最近在用3.1.3 没遇到你的情况 定义自己的控制器 只要继承框架的Action 应该不会有问题的 楼主在仔细看下 自己安装到使用 有没配置过什么特殊的操作
ThinkPHP3.2 集成 php-resque: PHP Resque Worker =========================================== php-resque是php环境中一个轻量级的队列服务。具体队列服务是做什么用的,请自行百度! ## 运行环境 ## * PHP 5.2+ * Redis 2.2+ ## 集成方法 ## ### 将源码放到ThinkPHP的Vendor目录中 ### 将源码更新到 ThinkPHP/Library/Vendor/php-resque/ 目录中 注意要定义应用目录,之前发的内容没定义应用目录导致部分小伙伴引发了找不到Queue类的异常 ### 在项目根目录中创建resque入口脚本 ### #!/usr/bin/env php <?php ini_set('display_errors', true); error_reporting(E_ERROR); set_time_limit(0); // 定义应用目录 define('APP_PATH','./Application/'); define('MODE_NAME', 'cli'); // 自定义cli模式 define('BIND_MODULE', 'Home'); // 绑定到Home模块 define('BIND_CONTROLLER', 'Queue'); // 绑定到Queue控制器 define('BIND_ACTION', 'index'); // 绑定到index方法 // 处理自定义参数 $act = isset($argv[1]) ? $argv[1] : 'start'; putenv("Q_ACTION={$act}"); putenv("Q_ARGV=" . json_encode($argv)); require './ThinkPHP/ThinkPHP.php'; ### 创建Queue控制器 ### 在`Home`模块的`Controller`中创建`Queue`控制器 <?php namespace Home\\\\\\\\Controller; if (!IS_CLI) die('The file can only be run in cli mode!'); use Exception; use Resque; /*** * queue入口 * Class Worker * @package Common\\\\\\\\Controller */ class QueueController { protected $vendor; protected $args = []; protected $keys = []; protected $queues = '*'; public function __construct() { vendor('php-resque.autoload'); $argv = json_decode(getenv('Q_ARGV')); foreach ($argv as $item) { if (strpos($item, '=')) { list($key, $val) = explode('=', $item); } else { $key = $val = $item; } $this->keys[] = $key; $this->args[$key] = $val; } $this->init(); } /** * 执行队列 * 环境变量参数值: * --queue|QUEUE: 需要执行的队列的名字 * --interval|INTERVAL:在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒 * --app|APP_INCLUDE:需要自动载入PHP文件路径,Worker需要知道你的Job的位置并载入Job * --count|COUNT:需要创建的Worker的数量。所有的Worker都具有相同的属性。默认是创建1个Worker * --debug|VVERBOSE:设置“1”启用更啰嗦模式,会输出详细的调试信息 * --pid|PIDFILE:手动指定PID文件的位置,适用于单Worker运行方式 */ private function init() { $is_sington = false; //是否单例运行,单例运行会在tmp目录下建立一个唯一的PID // 根据参数设置QUEUE环境变量 $QUEUE = in_array('--queue', $this->keys) ? $this->args['--queue'] : '*'; if (empty($QUEUE)) { die("Set QUEUE env var containing the list of queues to work.\n"); } $this->queues = explode(',', $QUEUE); // 根据参数设置INTERVAL环境变量 $interval = in_array('--interval', $this->keys) ? $this->args['--interval'] : 5; putenv("INTERVAL={$interval}"); // 根据参数设置COUNT环境变量 $count = in_array('--count', $this->keys) ? $this->args['--count'] : 1; putenv("COUNT={$count}"); // 根据参数设置APP_INCLUDE环境变量 $app = in_array('--app', $this->keys) ? $this->args['--app'] : ''; putenv("APP_INCLUDE={$app}"); // 根据参数设置PIDFILE环境变量 $pid = in_array('--pid', $this->keys) ? $this->args['--pid'] : ''; putenv("PIDFILE={$pid}"); // 根据参数设置VVERBOSE环境变量 $debug = in_array('--debug', $this->keys) ? $this->args['--debug'] : ''; putenv("VVERBOSE={$debug}"); } public function index() { $act = getenv('Q_ACTION'); switch ($act) { case 'stop': $this->stop(); break; case 'status': $this->status(); break; default: $this->start(); } } /** * 开始队列 */ public function start() { // 载入任务类 $path = COMMON_PATH . "Job"; $flag = \FilesystemIterator::KEY_AS_FILENAME; $glob = new \FilesystemIterator($path, $flag); foreach ($glob as $file) { if('php' === pathinfo($file, PATHINFO_EXTENSION)) require realpath($file); } $logLevel = 0; $LOGGING = getenv('LOGGING'); $VERBOSE = getenv('VERBOSE'); $VVERBOSE = getenv('VVERBOSE'); if (!empty($LOGGING) || !empty($VERBOSE)) { $logLevel = Resque\Worker::LOG_NORMAL; } else { if (!empty($VVERBOSE)) { $logLevel = Resque\Worker::LOG_VERBOSE; } } $APP_INCLUDE = getenv('APP_INCLUDE'); if ($APP_INCLUDE) { if (!file_exists($APP_INCLUDE)) { die('APP_INCLUDE (' . $APP_INCLUDE . ") does not exist.\n"); } require_once $APP_INCLUDE; } $interval = 5; $INTERVAL = getenv('INTERVAL'); if (!empty($INTERVAL)) { $interval = $INTERVAL; } $count = 1; $COUNT = getenv('COUNT'); if (!empty($COUNT) && $COUNT > 1) { $count = $COUNT; } if ($count > 1) { for ($i = 0; $i < $count; ++$i) { $pid = pcntl_fork(); if ($pid == -1) { die("Could not fork worker " . $i . "\n"); } // Child, start the worker else { if (!$pid) { $worker = new Resque\Worker($this->queues); $worker->logLevel = $logLevel; fwrite(STDOUT, '*** Starting worker ' . $worker . "\n"); $worker->work($interval); break; } } } } // Start a single worker else { $worker = new Resque\Worker($this->queues); $worker->logLevel = $logLevel; $PIDFILE = getenv('PIDFILE'); if ($PIDFILE) { file_put_contents($PIDFILE, getmypid()) or die('Could not write PID information to ' . $PIDFILE); } fwrite(STDOUT, '*** Starting worker ' . $worker . "\n"); $worker->work($interval); } } /** * 停止队列 */ public function stop() { $worker = new Resque\Worker($this->queues); $worker->shutdown(); } /** * 查看某个任务状态 */ public function status() { $id = in_array('--id', $this->keys) ? $this->args['--id'] : ''; $status = new \Resque\Job\Status($id); if (!$status->isTracking()) { die("Resque is not tracking the status of this job.\n"); } echo "Tracking status of " . $id . ". Press [break] to stop.\n\n"; while (true) { fwrite(STDOUT, "Status of " . $id . " is: " . $status->get() . "\n"); sleep(1); } } } ### 新增队列配置 ### 在公共`config.php`中新增队列配置,如下 /* 消息队列配置 */ 'QUEUE' => array( 'type' => 'redis', 'host' => '127.0.0.1', 'port' => '6379', 'persistent' => false, //是否启用 'prefix' => 'queue', 'password' => '', // 密码 ), ### 新增队列初始化行为 ### 在`app_init`行为中新增队列初始化的行为,`run`内容为 public function run() { // 处理队列配置 $config = C('QUEUE'); if ($config) { vendor('php-resque.autoload'); // 初始化队列服务 $select = isset($config['select']) ? $config['select'] : 0; $password = isset($config['password']) ? $config['password'] : null; $persistent = isset($config['persistent']) ? $config['persistent'] : false; $timeout = isset($config['timeout']) ? $config['timeout'] : 30; $server = $config['host'] . ":" . $config['port']; \Resque::setBackend($server, $select, $password, $persistent, $timeout); // 初始化缓存前缀 if(isset($config['prefix']) && !empty($config['prefix'])){ \Resque\Redis::prefix($config['prefix']); } } } 到此,整个队列服务基本已配置完成。 接下来就要创建队列执行的任务了 ## Jobs ## ### 创建 Jobs ### 目前任务类固定在`Common`模块的`Job`中,命名格式为`XxxxJob.class.php` <?php namespace Common\Job; class XxxxJob { public function perform() { $args = $this->args; fwrite(STDOUT, json_encode($args) . PHP_EOL); } } 要获取队列中传入的参数值请使用`$this->args` 任务perform方法中抛出的任何异常都会导致任务失败,所以在写任务业务时要小心,并且处理异常情况。 任务也有`setUp`和`tearDown`方法,如果定义了一个`setUp`方法,那么它将在`perform`方法之前调用,如果定义了一个`tearDown`方法,那么它将会在`perform`方法之后调用。 <?php namespace Common\Job; class XxxxJob { public function setUp() { // ... Set up environment for this job } public function perform() { // .. Run job } public function tearDown() { // ... Remove environment for this job } } ### 添加任务到队列中 ### 在程序控制器的任意方法中引入队列类库时,使用`Resque::enqueue`方法执行入栈,`Resque::enqueue`方法有四个参数,第一个是当前的队列名称,第二个参数为任务类,第三个是传入的参数,第四个表示是否返回工作状态的令牌 vendor('php-resque.autoload'); // 引入队列类库 $job = '\\Common\\Job\\XxxxJob'; // 定义任务类 // 定义参数 $args = array( 'time' => time(), 'array' => array( 'test' => 'test', ), ); // 入栈 $jobId = \Resque::enqueue('default', $job, $args, true); echo "Queued job ".$jobId."\n\n"; 如果要查看当前任务的工作状态可以使用如下方法: $status = new \Resque\Job\Status($jobId); echo $status->get(); // Outputs the status 任务的工作状态值有专门的常量``\Resque\Job\Status``对应类。 具体的对应关系如下: * `Resque\Job\Status::STATUS_WAITING` - 任务在队列中 * `Resque\Job\Status::STATUS_RUNNING` - 任务正在运行 * `Resque\Job\Status::STATUS_FAILED` - 任务执行失败 * `Resque\Job\Status::STATUS_COMPLETE` - 任务执行完成 * `false` - 无法获取状态 - 检查令牌是否有效? 任务的过期时间为任务完成后的24小时后,也可以定义过期类的`stop()`方法 ## 队列任务启动 ## 在命令行中转到项目根目录,执行 $ php resque start 即可启动服务 启动时也可以加入部分参数: * `--queue` - 需要执行的队列的名字,可以为空,也可以多个以`,`分割 * `--interval` -在队列中循环的间隔时间,即完成一个任务后的等待时间,默认是5秒 * `--count` - 需要创建的Worker的数量。所有的Worker都具有相同的属性。默认是创建1个Worker * `--debug` - 设置“1”启用更啰嗦模式,会输出详细的调试信息 * `--pid` - 手动指定PID文件的位置,适用于单Worker运行方式 如: $ php resque start --queue=default --pid=/tmp/resque.pid --debug=1 如果要使用守护进程方式启动则需要在最后加入`&`即可 如: $ php resque start --queue=default --pid=/tmp/resque.pid --debug=1 & 也可以配合supervisord实现进程长驻 更多的操作请参考php-resque官方文档。
目 录 第1章 ThinkPHP入门 1 1.1MVC模式概述 1 1.2ThinkPHP是什么 2 1.3 搭建PHP开发环境 2 1.3.1获取UPUPW 2 1.3.2安装UPUPW 3 1.3.3目录结构说明 4 1.3.4添加虚拟主机 4 1.3.5安装集成开发环境PHPStorm 6 1.4 个ThinkPHP程序 7 1.5 应用结构说明 8 1.5.1目录说明 8 1.5.2入口文件 8 1.5.3自动生成 9 1.5.4模块 9 1.5.5控制器 9 1.6 术语解释 1.7 小结 11 第2章 配 置 12 2.1 配置类型 13 2.1.1默认配置 13 2.1.2公共配置 13 2.1.3模式配置 13 2.1.4调试配置 14 2.1.5场景配置 14 2.1.6模块配置 14 2.1.7扩展配置 14 2.1.8动态配置 15 2.2 配置操作 15 2.2.1C函数 16 2.2.2读取配置 17 2.2.3加载扩展配置 19 2.2.4写入配置 20 2.3 小结 23 第3章 路 由 24 3.1URL的三种模式 24 3.1.1动态URL 24 3.1.2静态URL 25 3.1.3伪静态URL 25 3.2ThinkPHP的路由 25 3.2.1路由模式 25 3.2.2路由配置 29 3.3 小结 34 第4章 控制器 35 4.1 控制器的定义 35 4.2 前置操作和后置操作 37 4.3 动作参数绑定 38 4.4 伪静态 40 4.5URL大小写 40 4.6URL生成 41 4.6.1地址表达式 41 4.6.2参数 41 4.6.3伪静态后缀 41 4.6.4URL模式处理 41 4.6.5生成路由地址 42 4.7Ajax返回 42 4.8 重定向和页面跳转 43 4.8.1重定向 43 4.8.2页面跳转 44 4.9HTTP请求方法 46 4.读取输入 48 4.11空操作 50 4.12空控制器 51 4.13小结 52 第5章 模 型 53 5.1 准备工作 53 5.2 模型定义 54 5.3 模型实例化 54 5.3.1new实例化 54 5.3.2M函数实例化 55 5.3.3D函数实例化 55 5.3.4空模型实例化 55 5.4 连贯操作 55 5.4.1where 56 5.4.2table 57 5.4.3alias 57 5.4.4data 58 5.4.5field 58 5.4.6order 59 5.4.7limit 60 5.4.8page 61 5.4.9group 61 5.4.having 61 5.4.11join 61 5.4.12union 62 5.4.13distinct 62 5.4.14lock 62 5.4.15cache 63 5.4.16fetchSql 63 5.4.17strict 64 5.4.18index 64 5.5CURD操作 64 5.5.1创建数据 64 5.5.2插入数据 65 5.5.3读取数据 65 5.5.4更新数据 66 5.5.5删除数据 67 5.6 查询语言 68 5.6.1查询方式 68 5.6.2表达式查询 68 5.6.3快捷查询 70 5.6.4区间查询 71 5.6.5统计查询 71 5.7 自动验证 72 5.8 自动完成 78 5.9 视图模型 82 5.关联模型 85 5..1HAS_ONE 85 5..2BELONGS_TO 88 5..3HAS_MANY 89 5..4MANY_TO_MANY 90 5.11小结 91 第6章 视 图 92 6.1 模板定义 92 6.2 模板主题 92 6.3 模板赋值 93 6.4 模板渲染 93 6.5 总结 94 第7章 模 板 95 7.1 变量输出 95 7.1.1输出形式 95 7.1.2测试 96 7.2 系统变量 98 7.2.1语法形式 98 7.2.2配置输出 98 7.2.3测试 98 7.3 函数 0 7.3.1函数类型 0 7.3.2测试 0 7.4 变量默认值 1 7.4.1语法形式 1 7.4.2测试 2 7.5 算术运算符 3 7.5.1语法形式 3 7.5.2测试 3 7.6 模板继承 5 7.6.1语法形式 5 7.6.2测试 6 7.7 视图含 7 7.7.1语法形式 7 7.7.2模板表达式 7 7.7.3模板文件 7 7.7.4测试 7 7.8 内置标签 8 7.8.1volist标签 9 7.8.2foreach标签 1 7.8.3for标签 1 7.8.4switch标签 111 7.8.5比较标签 111 7.8.6empty标签 114 7.8.7defined标签 114 7.8.8标签嵌套 114 7.8.9import标签 115 7.8.使用原生PHP 115 7.8.11不解析输出 115 7.9 模板布局 116 7.模板常量替换 116 7.11模板注释 117 7.12测试 118 7.13总结 126 第8章 调 试 127 8.1 调试模式 127 8.2 异常处理 127 8.3 日志 128 8.3.1日志级别 129 8.3.2记录方式 129 8.3.3写入日志 129 8.4 变量输出 130 8.5 执行统计 130 8.6SQL输出 131 8.7 测试 131 8.7.1异常测试 131 8.7.2日志测试 132 8.7.3变量输出测试 133 8.7.4执行统计测试 133 8.7.5SQL输出测试 134 8.8 总结 135 第9章 缓 存 136 9.1 数据缓存 136 9.1.1写入缓存 136 9.1.2读取缓存 136 9.1.3删除缓存 137 9.2 页面缓存 137 9.3 数据库查询缓存 138 9.4 总结 139 第章 专 题 140 .1session操作 140 .1.1session写入 140 .1.2session读取 140 .1.3session删除 140 .2cookie操作 141 .2.1cookie写入 141 .2.2cookie读取 141 .2.3读取所有cookie 141 .2.4cookie删除 141 .3分页 141 .3.1分页语法 141 .3.2测试 142 .4文件上传 145 .5验证码 146 .6图像处理 149 .6.1实例化Image 149 .6.2获取图片基本信息 149 .6.3图像裁剪 150 .6.4图像缩略图 151 .6.5水印 152 .7总结 153 第11章 留言板项目实战 154 11.1项目目的 154 11.2项目需求 154 11.3数据表设计 154 11.4模块设计 155 11.5编码实现 155 11.5.1编写模型 155 11.5.2编写留言控制器 156 11.5.3编写用户控制器 159 11.5.4编写留言列表 162 11.5.5编写留言发表页面 163 11.5.6编写用户登录界面 163 11.5.7编写用户注册页面 164 11.6运行效果 165 11.6.1留言界面 165 11.6.2用户登录 166 11.6.3登录后留言列表 166 11.6.4发表留言 166 11.6.5留言成功 166 11.6.6注册页面 167 11.7项目总结 167 第12章 系统项目实战 168 12.1项目目的 168 12.2需求分析 168 12.3功能设计 168 12.4数据库设计 169 12.5数据库字典 169 12.6模块设计 171 12.6.1Admin模块 171 12.6.2Common模块 175 12.6.3Home模块 177 12.7项目总结 182 第13章 论坛系统项目实战 183 13.1项目目的 183 13.2功能设计 183 13.3数据库设计 183 13.4数据库字典 184 13.5模块设计 186 13.5.1Common模块 186 13.5.2Admin模块 190 13.5.3Home模块 192 13.6项目总结 193 第14章 公众号开发 195 14.1项目目的 195 14.2功能设计 195 14.3开通测试公众号 196 14.4下载开发类库 197 14.5开始会话开发 197 14.5.1注册流程 199 14.5.2登录流程 200 14.5.3查看个人资料流程 200 14.5.4上传头像流程 200 14.5.5退出登录流程 200 14.5.6全局回复处理 201 14.5.7示例代码 201 14.5.8测试 212 14.6自定义菜单开发 213 14.6.1获取AccessToken 213 14.6.2创建自定义菜单 214 14.6.3响应自定义菜单 216 14.7项目总结 216 结 语 217

4,251

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧