如何避免BaseController重定向AuthController时的循环?哪种方案更合适?
两种解决方案的对比与推荐
方案1:在AuthController中重写initController方法
这种方式更贴合面向对象的多态设计思想:
- AuthController作为登录认证的入口,本身就不需要执行登录检查逻辑,直接重写父类的
initController方法,跳过登录校验和重定向逻辑即可。 - 代码职责清晰,BaseController专注于通用的登录检查逻辑,AuthController负责自身的初始化逻辑,后续如果新增其他无需登录的控制器(比如公开的首页控制器),只需同样重写
initController即可,扩展性强。 - 示例代码:
class AuthController extends BaseController { public function initController() { // 跳过父类的登录检查逻辑,直接执行自身初始化 // 这里可以写AuthController专属的初始化代码,比如初始化OIDC客户端 } }
方案2:在BaseController的initController中用get_class($this)判断控制器
这种方式虽然实现简单,但存在明显弊端:
- 硬编码类名,后续如果AuthController修改类名或命名空间,必须同步修改BaseController中的判断条件,维护成本高。
- 违反开闭原则,如果新增其他无需登录的控制器,需要不断在BaseController中添加判断分支,导致BaseController的逻辑越来越臃肿,职责混乱。
- 示例代码:
class BaseController { public function initController() { // 检查当前控制器是否为AuthController if (get_class($this) !== AuthController::class) { // 执行登录检查逻辑 if (!$this->isLoggedIn()) { $this->redirectToAuth(); } } } }
最终推荐
优先选择方案1,它更符合面向对象的设计原则,代码结构更清晰,维护和扩展性都更强。
内容的提问来源于stack exchange,提问作者b126
相关产品推荐
相关产品推荐

