在 CakePHP 中,parent::initialize() 是做什么的?
In CakePHP, what does parent::initialize() do?
我看到线了
parent::initialize();
在 CakePHP 3.x 和所有 3.x 文档中的所有预加载方法中。
删除该行,或忘记为新方法添加该行,似乎没有任何负面影响。
这引出了一个问题,它有什么作用?
抱歉,这是一个完全菜鸟的问题..
在控制器的 initialize()
方法中,您可以定义要加载的任何组件,以及任何
它们的配置数据:
public function initialize()
{
parent::initialize();
$this->loadComponent('Security');
$this->loadComponent('Paginator');
$this->loadComponent('RequestHandler');
}
It is simple OOP. 它调用同名的 parent 方法。
Aclass {
public function foo() { echo 'bar'; };
}
Bclass extends Aclass {
public function foo() { parent::foo(); echo 'foobar'; }
}
只需尝试并删除 parent 调用,您就会看到它的作用。通常应该调用 parents,尤其是在像 initialize() 回调这样的方法中。但是,何时打电话或不打电话是您必须做出的决定。这取决于您是否想要或需要调用 parent 方法逻辑。这叫做"overloading".
这允许您在方法的 parent 调用之前或之后添加功能,这是很常见的事情。我建议您阅读 php 手册的 read the OOP chapter。
这正是它所说的 运行 来自父 class 的方法。例如。
class AppController extends Controller {
public function initialize() {
echo 'hello world';
// do more sh*t
}
}
class UsersController extends AppController {
public function initialize() {
parent::initialize(); // this will run the method initialize from app controller that will echo 'hello world'
// do more sh*t
}
}
当您删除它时它没有做任何事情,因为父初始化函数中没有任何内容,但是它存在以防万一您想要将功能从父控制器扩展到子控制器.例如:
在 AppController 中有一个 beforeFilter 函数定义了我想要在页面加载之前 运行 的内容。假设我想要在每个页面上使用 运行 的函数 - 如果用户未登录,则需要一个简单的重定向函数:
if (!$this->Auth->user()) {
$this->redirect('Users/login');
}
我可以将它放在 AppController 的 beforeFilter 中,而不是放在 每个控制器 的 beforeFilter 中。
我的其他控制器,如 UsersController,从 AppController 扩展:
class UsersController extends AppController {
所以在我的 UsersController 的 beforeFilter 中,我可以这样做:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
现在我从父控制器 (AppController) 继承了这种重定向行为,所以我的子控制器 (UsersController) 中也有相同的代码 运行 - 而且没有不管用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面。
这与 parent::initialize() 的工作方式相同;您正在继承父控制器中初始化函数中存在的功能。这只是用于消除冗余代码的功能。
所以基本上,如果您在每个页面上都看到您正在使用的代码,请找到一种方法来使其有点面向对象,方法是将其删除并将其放置在您的代码可以继承的文件中。将页眉和页脚代码从 HTML 文档中移出并将它们放在自己的 php 文件中的思路是一样的,这样您就可以在一个区域进行更改并更新所有受影响的衍生产品,而不是在每个 HTML 文档中编辑页眉和页脚。
我看到线了
parent::initialize();
在 CakePHP 3.x 和所有 3.x 文档中的所有预加载方法中。
删除该行,或忘记为新方法添加该行,似乎没有任何负面影响。
这引出了一个问题,它有什么作用?
抱歉,这是一个完全菜鸟的问题..
在控制器的 initialize()
方法中,您可以定义要加载的任何组件,以及任何
它们的配置数据:
public function initialize()
{
parent::initialize();
$this->loadComponent('Security');
$this->loadComponent('Paginator');
$this->loadComponent('RequestHandler');
}
It is simple OOP. 它调用同名的 parent 方法。
Aclass {
public function foo() { echo 'bar'; };
}
Bclass extends Aclass {
public function foo() { parent::foo(); echo 'foobar'; }
}
只需尝试并删除 parent 调用,您就会看到它的作用。通常应该调用 parents,尤其是在像 initialize() 回调这样的方法中。但是,何时打电话或不打电话是您必须做出的决定。这取决于您是否想要或需要调用 parent 方法逻辑。这叫做"overloading".
这允许您在方法的 parent 调用之前或之后添加功能,这是很常见的事情。我建议您阅读 php 手册的 read the OOP chapter。
这正是它所说的 运行 来自父 class 的方法。例如。
class AppController extends Controller {
public function initialize() {
echo 'hello world';
// do more sh*t
}
}
class UsersController extends AppController {
public function initialize() {
parent::initialize(); // this will run the method initialize from app controller that will echo 'hello world'
// do more sh*t
}
}
当您删除它时它没有做任何事情,因为父初始化函数中没有任何内容,但是它存在以防万一您想要将功能从父控制器扩展到子控制器.例如:
在 AppController 中有一个 beforeFilter 函数定义了我想要在页面加载之前 运行 的内容。假设我想要在每个页面上使用 运行 的函数 - 如果用户未登录,则需要一个简单的重定向函数:
if (!$this->Auth->user()) {
$this->redirect('Users/login');
}
我可以将它放在 AppController 的 beforeFilter 中,而不是放在 每个控制器 的 beforeFilter 中。
我的其他控制器,如 UsersController,从 AppController 扩展:
class UsersController extends AppController {
所以在我的 UsersController 的 beforeFilter 中,我可以这样做:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
现在我从父控制器 (AppController) 继承了这种重定向行为,所以我的子控制器 (UsersController) 中也有相同的代码 运行 - 而且没有不管用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面。
这与 parent::initialize() 的工作方式相同;您正在继承父控制器中初始化函数中存在的功能。这只是用于消除冗余代码的功能。
所以基本上,如果您在每个页面上都看到您正在使用的代码,请找到一种方法来使其有点面向对象,方法是将其删除并将其放置在您的代码可以继承的文件中。将页眉和页脚代码从 HTML 文档中移出并将它们放在自己的 php 文件中的思路是一样的,这样您就可以在一个区域进行更改并更新所有受影响的衍生产品,而不是在每个 HTML 文档中编辑页眉和页脚。