在CakePHP中,parent::initialize()做什么?
我明白了在CakePHP中,parent::initialize()做什么?,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我明白了 parent::initialize(); 在CakePHP3.x和所有3.x文档中的所有预加载方法中 删除该行,或者忘记将该行添加到新方法中,似乎没有任何负面影响 这就引出了一个问题:它有什么作用 抱歉,这是一个完全没有问题的问题。在控制器的initialize()方法中,您可以定义要加载的任何组件,以及 它们的配置数据: public function initialize() { parent::initialize(); $this->loadCompone
parent::initialize();
在CakePHP3.x和所有3.x文档中的所有预加载方法中
删除该行,或者忘记将该行添加到新方法中,似乎没有任何负面影响
这就引出了一个问题:它有什么作用
抱歉,这是一个完全没有问题的问题。在控制器的
initialize()
方法中,您可以定义要加载的任何组件,以及
它们的配置数据:
public function initialize()
{
parent::initialize();
$this->loadComponent('Security');
$this->loadComponent('Paginator');
$this->loadComponent('RequestHandler');
}
在控制器的
initialize()
方法中,可以定义要加载的任何组件,以及
它们的配置数据:
public function initialize()
{
parent::initialize();
$this->loadComponent('Security');
$this->loadComponent('Paginator');
$this->loadComponent('RequestHandler');
}
它调用同名的父方法
Aclass {
public function foo() { echo 'bar'; };
}
Bclass extends Aclass {
public function foo() { parent::foo(); echo 'foobar'; }
}
只要尝试一下并删除父调用,您就会看到它的作用。通常应该调用父级,特别是在initialize()回调之类的方法中。然而,何时打电话或不打电话是你必须做出的决定。这取决于您是否希望或需要调用父方法逻辑。这称为“过载”
这允许您在方法的父调用之前或之后添加功能,这是一件非常常见的事情。我建议您使用php手册的一部分。它调用相同名称的父方法
Aclass {
public function foo() { echo 'bar'; };
}
Bclass extends Aclass {
public function foo() { parent::foo(); echo 'foobar'; }
}
只要尝试一下并删除父调用,您就会看到它的作用。通常应该调用父级,特别是在initialize()回调之类的方法中。然而,何时打电话或不打电话是你必须做出的决定。这取决于您是否希望或需要调用父方法逻辑。这称为“过载”
这允许您在方法的父调用之前或之后添加功能,这是一件非常常见的事情。我建议您阅读php手册。这正是它所说的从父类运行方法。例如,美国
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
}
}
这正是它所说的从父类运行方法。例如,美国
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 {
因此,在myUsersController中的beforeFilter中,我可以执行以下操作:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
现在,我从父控制器(AppController)继承了此重定向行为,因此,相同的代码也会在我的子控制器(UsersController)中运行。-无论用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面
这与parent::initialize()的工作方式相同;您正在继承父控制器中的initialize函数中存在的功能。这只是为了消除冗余代码而包含的功能
所以,基本上,如果您在每个页面上都看到了您正在使用的代码,请找到一种方法,将其删除并放置在您的代码可以从中继承的文件中,使其具有一点面向对象的特性。这与将页眉和页脚代码从HTML文档中移出,并将它们放在它们自己的php文件中的做法相同,因此您可以在一个区域进行更改,并更新所有受影响的衍生工具,而不是编辑每个HTML文档中的页眉和页脚。删除它时,它不会做任何事情,因为父级初始化函数中没有任何内容,但它存在于那里,以防您希望将功能从父级控制器扩展到子级控制器。。例如: 在AppController中,有一个beforeFilter函数,用于定义在加载页面之前要运行的内容。假设我希望在每个页面上都运行一个函数—如果用户未登录,则使用一个简单的重定向函数:
if (!$this->Auth->user()) {
$this->redirect('Users/login');
}
我可以将它放在AppController的beforeFilter中,而不是将它放在每个控制器上的beforeFilter中
我的其他控制器,如UsersController,从AppController扩展而来:
class UsersController extends AppController {
因此,在myUsersController中的beforeFilter中,我可以执行以下操作:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
现在,我从父控制器(AppController)继承了此重定向行为,因此,相同的代码也会在我的子控制器(UsersController)中运行。-无论用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面
这与parent::initialize()的工作方式相同;您正在继承父控制器中的initialize函数中存在的功能。这只是为了消除冗余代码而包含的功能
所以,基本上,如果您在每个页面上都看到了您正在使用的代码,请找到一种方法,将其删除并放置在您的代码可以从中继承的文件中,使其具有一点面向对象的特性。将页眉和页脚代码从HTML文档中移出,并将它们放在自己的php文件中,这样您就可以在一个区域进行更改并更新所有受影响的衍生工具,而不是在每个HTML文档中编辑页眉和页脚。抱歉,我没有意识到我从未为此选择过答案。一年后,我知道这个问题有多愚蠢。(但我真的很感谢所有花时间回答的人!)抱歉,我没有意识到我从来没有为此选择过答案。一年后,我知道这个问题有多愚蠢。(但我真的很感谢所有花时间回答这个问题的人!)