在每个用户的模型中重新定义基于 Codeigniter slug 的常量
Redefining Codeigniter slug-based constants in the model per user
我有一个内容管理系统,其中为模型中的一个或所有控制器定义了每个登录用户的适当目录的基于 slug 的常量。我通过尝试为每个登录用户重新定义常量而偶然发现了这个发现。
我认为重新定义常量是不可能的,但我想我不明白 Codeigniter 或 PHP 如何能够以这种方式重新定义常量。我没有收到任何 PHP 错误,表明它无法重新定义常量,所以我是否相信每个控制器的模型或控制器实例都未设置?
控制器:
class Content extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->model('main_model');
...
get slug from logged_in user
...
$this->main->set_slug_based_constants($slug)
}
}
一个主力模型(我知道这样做不好):
class Main_model extends CI_Model{
public function set_slug_based_constants($slug)
{
define('CLOUDFRONT_DIRECTORY', $slug.'_cloudfront_directory');
}
}
From Codeigniter Docs:
动态实例化。在 CodeIgniter 中,仅在请求时加载组件和执行例程,而不是全局执行。
因此,根据 Codeigniter 文档,我相信我的假设在这种情况下是正确的。
与其说是 "unset",不如说是 "not yet defined"。每个对 URL(控制器)的浏览器请求在服务器中都是唯一的进程。所以常量没有重新定义,而是为每个 URL 请求重新实例化。
如果您第二次尝试 运行 $this->main_model->set_slug_based_constants($slug);
,您 将 收到一条 PHP 错误消息,指出常量 CLOUDFRONT_DIRECTORY 已经定义。
试试这个版本的控制器看看错误。
class Content extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->model('main_model');
$this->main_model->set_slug_based_constants("Dave");
}
function index()
{
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";
$this->main_model->set_slug_based_constants("jruser");
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";;
}
}
它会产生类似这样的输出。
The constant's value is Dave_cloudfront_directory
A PHP Error was encountered
Severity: Notice
Message: Constant CLOUDFRONT_DIRECTORY already defined
Filename: models/Main_model.php
Line Number: 13
The constant's value is Dave_cloudfront_directory
我有一个内容管理系统,其中为模型中的一个或所有控制器定义了每个登录用户的适当目录的基于 slug 的常量。我通过尝试为每个登录用户重新定义常量而偶然发现了这个发现。
我认为重新定义常量是不可能的,但我想我不明白 Codeigniter 或 PHP 如何能够以这种方式重新定义常量。我没有收到任何 PHP 错误,表明它无法重新定义常量,所以我是否相信每个控制器的模型或控制器实例都未设置?
控制器:
class Content extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->model('main_model');
...
get slug from logged_in user
...
$this->main->set_slug_based_constants($slug)
}
}
一个主力模型(我知道这样做不好):
class Main_model extends CI_Model{
public function set_slug_based_constants($slug)
{
define('CLOUDFRONT_DIRECTORY', $slug.'_cloudfront_directory');
}
}
From Codeigniter Docs: 动态实例化。在 CodeIgniter 中,仅在请求时加载组件和执行例程,而不是全局执行。
因此,根据 Codeigniter 文档,我相信我的假设在这种情况下是正确的。
与其说是 "unset",不如说是 "not yet defined"。每个对 URL(控制器)的浏览器请求在服务器中都是唯一的进程。所以常量没有重新定义,而是为每个 URL 请求重新实例化。
如果您第二次尝试 运行 $this->main_model->set_slug_based_constants($slug);
,您 将 收到一条 PHP 错误消息,指出常量 CLOUDFRONT_DIRECTORY 已经定义。
试试这个版本的控制器看看错误。
class Content extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->model('main_model');
$this->main_model->set_slug_based_constants("Dave");
}
function index()
{
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";
$this->main_model->set_slug_based_constants("jruser");
echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";;
}
}
它会产生类似这样的输出。
The constant's value is Dave_cloudfront_directory
A PHP Error was encountered
Severity: Notice
Message: Constant CLOUDFRONT_DIRECTORY already defined
Filename: models/Main_model.php
Line Number: 13
The constant's value is Dave_cloudfront_directory