Codeigniter和多重继承?

5

不知道这是否可能或者是PHP的一个限制,通过谷歌搜索似乎是这样,但也许我在这里错过了一些聪明的解决方案。

希望这有意义。现在我的网站分为两个部分,一个是管理员端和客户端。我已经能够将它分成两个控制器(admin和client),并从一个基本的MY_Controller类继承,但问题是如何实现我的身份验证控制器。

客户端和管理员登录之间有很多共享代码,现在我要么为每个管理员和客户端创建一个扩展基础的auth控制器(这意味着大量重复的代码),要么只是扩展MY_Controller类并在每个函数中使用if/then语句,这变得有点混乱(而且也绕过了管理员/客户端父类,这违背了它们的目的...)。

我想知道是否有一种方式可以使Auth控制器“中立”,并能够从管理员/客户端控制器继承,因此如果X是基本控制器,Y是Auth...

X -> Admin Controller -> Y
X -> Client Controller -> Y

我正在使用一个认证库来封装一些底层函数,不想在那里添加布局逻辑等内容。如果这是一个愚蠢的问题,请原谅。谢谢!


如果您找到了其他答案,请将此主题重命名为[closed]或将一个答案标记为您的答案。 - ITroubs
2个回答

3

不支持多继承。您可以使用接口,也可以使用访问者设计模式,例如:

<?php

class A {
    public $avar = 'I\'m A';
    function accept(Visitor $v){
        $v->visitA($this);
    }
}

class B {
    public $bvar = 'B reporting';
    function accept(Visitor $v){
        $v->visitB($this);
    }
}


class Visitor {
    function visitA(A $a){
        echo $a->avar;
    }

    function visitB(B $b){
        echo $b->bvar;
    }
}


$A = new A();
$B = new B();
$visitor = new Visitor();

$A->accept($visitor);
$B->accept($visitor);

?>

不幸的是,PHP目前还不能像Java一样通过参数区分方法调用,否则此示例看起来会像这样:

class A {
    public String avar = 'I\'m A';
    function accept(Visitor v){
        v.visit(this);
    }
}

class B {
    public String bvar = 'B reporting';
    function accept(Visitor v){
        v.visit(this);
    }
}


class Visitor {
    function visit(A a){
        System.out.println(a.avar);
    }

    function visit(B b){
        System.out.println(b.bvar);
    }
}


A = new A();
B = new B();
visitor = new Visitor();

A.accept(visitor);
B.accept(visitor);

当您拥有多个访问方法,这些方法是通过其参数类型进行区分的


所以在这里,您可以执行类似于Admincontroller->accept($visitor)的操作,在访问者中有两种方法,一种名为visitAdmin,另一种名为visitUser。当您不知道要访问的控制器类型时,这并不是问题,因为您将访问者提供给控制器,它会决定调用哪个访问者方法。 - ITroubs
你还应该实现一个小的访问者接口,只包含 accept 方法,并让这两个控制器实现该接口,以便在将控制器传递给方法时使用类型提示,以确保它们具有该 accept 方法。 - ITroubs
尝试玩弄这个方法! - Jeff

0

PHP不支持多重继承。但我想知道,为什么你需要两个独立的登录控制器?你能解释一下在这些控制器中你在做什么吗?

编辑:
不确定你的代码是否允许,但你可以尝试将所有通用部分放在客户端控制器中,并让管理员控制器从这个控制器继承。

X -> Admin Ctrlr -> Client Ctrlr -> Y
X -> Client Ctrlr -> Y

我有单独的逻辑来处理登录/注册,具体取决于用户是在网站的管理员部分还是客户端部分。例如,如果用户在管理员部分注册,我会处理更多的表单字段,或者要求邀请码等。登录中也有一些相同的部分,比如忘记密码、重置等。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接