【发布时间】:2020-02-18 16:07:21
【问题描述】:
我正在使用主要基于 CodeIgniter 的自定义 PHP 框架。
在我的一个控制器文件中,我设置了一个名为 $orderId 的类属性。用户填写表格并提交后,我将进行数据库插入,获取订单号。并使用该订单号覆盖 $orderId 类属性值。
然后我将重定向到我想要访问更新后的 $orderId 类属性值的提交页面。这最后一部分不起作用,提交类获取属性 $orderId 的空白值。
请问我哪里错了?下面的基本示例。也许由于重定向我不能这样做,应该改用会话变量?
谢谢!
[EDIT] 或者我可以将 orderId 作为重定向中的第三个 URL 参数传递。例如。 redirect('orders/submit/'.self::$orderId); 在这种情况下,我会将所有 self:: 实例转换为 $this-> 以用于类级别范围。
class Orders extends Controller {
private static $orderId;
public function __construct() {
// assign db model
}
public function index() {
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$data = [
// form data to pass to db model
];
self::$orderId = 12345; // example order no. return from db model
if(!empty(self::$orderId)) {
redirect('orders/submit');
}
}
}
public function submit() {
$data = [
'orderId' => self::$orderId
];
$this->view('orders/submit', $data);
}
}
【问题讨论】:
-
这个问题本身就是一个基本的架构问题。 static 仅在您使用同一实例时才有效。但是由于您正在重定向,因此框架正在重新初始化。失去静态财产的价值。执行此操作的最佳方法是将订单 ID 存储在会话变量中,然后读取该变量。只要浏览器窗口打开,会话就会持续。
-
@ProSamHDx 谢谢。是的,我已经走了会话变量路线。我尝试将 orderId 添加为第三个 URL 参数的一部分,效果很好,但我不喜欢该解决方案,因为用户可以修改该参数并且输出页面会相应更改。虽然它不会在数据库中添加任何新内容,但让用户像这样乱搞输出页面看起来很不专业。
标签: php scope class-properties