【问题标题】:Is controller-based class loading better? (CodeIgniter/KohanaPHP/etc..)基于控制器的类加载更好吗? (CodeIgniter/KohanaPHP/etc..)
【发布时间】:2009-11-01 20:09:32
【问题描述】:

如果您使用过一些框架,例如 CodeIgniter 或 KohanaPHP,那么您可能已经看到它们的构建是为了让 控制器加载所有内容。因此,如果您在库中并希望加载其他资源,则必须获取控制器实例的副本,然后使用它来加载其他类。

$this->c = get_instance();
$this->c->load->library('other_lib');

我想知道将类加载卸载到另一个库是否是一种不好的形式,这样您就不必被绑定到控制器实例。例如,

$this->other_lib = load::library('other_lib');
//vs
$this->load->library('other_lib');

我在这里违反了任何 MVC 原则吗?我知道从模型加载资源是不好的 - 但是控制器不参与的其他库包呢?

【问题讨论】:

    标签: php model-view-controller controller


    【解决方案1】:

    如果您正在开发一个需要访问其他资源的库,请将这些资源添加为您的库的依赖项。这意味着,当您需要库中的类时,请在通过构造函数创建它时传入任何所需的资源。

    例如:

    class MyLib {
        public function __construct(DB $db) {
            $this->db = $db;
        }
    }
    

    【讨论】:

    • 假设库具有可变依赖项(DB 层/图像库)并且直到运行时才知道需要哪些类?
    • Xeon - 您通常可以以某种方式构建您的应用程序,以便在编译时知道这一点。如果不能,通常表明您没有正确分区库。也就是说,在你不能的情况下,你可以使用工厂/注册表来代替。
    • 我认为你没有抓住重点。由于这是一个可能与它正在加载的库项目无关的控制器 - 它与它们所暗示的逻辑完全脱节,因此无法知道加载时应该传递哪些对象。这最好由库包本身处理,它有两个选项 - 让控制器实例加载其他类 - 或者自己加载它们。
    • Xeon - 我明白你关于断开连接的观点,当你受到框架的限制时,你确实需要解决方法。也就是说,当您设计一个库时,它不应依赖于框架或某种单例注册表。它应该在创建时将其所有依赖项传递给它。使用控制器加载工厂(您可以在其中控制创建逻辑)并从中检索库中的对象。再次强调,我们的目标是让库与框架分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2011-10-28
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多