RAD 框架的工程内部结构......作为 Nooku 的 PHP 开发人员

已发表: 2022-03-11

每个人都有自己的一套工具。 作为一名 PHP 开发人员,我最喜欢的一个是名为“Nooku”的快速应用程序开发框架。 用开发组的话来说:“Nooku 更像是一个 Web 开发工具包,而不是一个框架”。

如果您不熟悉它,请看一下。 这是一个开源项目,大量使用行业接受的设计模式来生成高度组件化的应用程序,这些应用程序易于扩展和重用(最初由 Joomla! 的主要开发人员之一创建)。 开箱即用,Nooku 为您提供大量快速应用程序开发工具,帮助您更快地启动项目。 一个小而强大的样本:

  • MVC 的默认实现,您需要做的就是编写布局(这就是吸引我的地方)
  • HMVC 立即可用
  • 支持所有数据的不同输出格式,例如 JSON 和 XML(即,在几分钟内公开您的 API)
  • 默认管理和前端实现

Nooku 的核心是“组合优于继承”设计原则(事实上,这是 Nooku 介绍页面上的第一个概念。一句话:您应该旨在组合(或叠加)多个对象的功能以创建一些一种复合对象,而不是依赖于子类化。

PHP 快速应用程序开发 (RAD) 中组合优于继承原则的可视化。

这个原则可以让你编写更少的代码,并且通常会导致一些非常优雅的解决方案。 那么具体是如何推广的呢? 好吧,在代码级别,最好的例子来自于使用 Mixins 和资源/服务标识符。 让我们来看看。

混音

在 PHP 5.4 之前,该语言没有Traits的概念。 这些是类结构,当被对象“使用”时,提供某种类型的功能(类似于多重继承)。 Nooku 多年来一直在使用Mixin解决这个问题(从 PHP 5.2 开始)。

Mixin 不仅可以让您将对象组合在一起,而且还可以将每个混合对象的方法添加到组合对象的接口中。 使用 mixin 的对象似乎“继承”了混合对象的方法。

 /** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @param KMixinInterface $object An object that implements KMinxInterface * @return KObject */ public function mixin(KMixinInterface $object) { $methods = $object->getMixableMethods($this); foreach($methods as $method) { $this->_mixed_methods[$method] = $object; } // Set the mixer $object->setMixer($this); return $this; }

Nooku 中几乎所有的对象都具有这种能力,因为它们扩展了定义mixin方法的基类 KObject。

Nooku 控制器架构中的主要类也是从 KObject 派生的。 抽象控制器是 KControllerAbstract 类,通过检查您可以看到它立即利用了混合能力。 每当构造此类的实例时,KMixinCommand 和 KMixinBehavior 功能都会立即添加到其接口中。 因此,Nooku 中的每个控制器都通过各自的对象由命令链和行为管理功能组成。

为什么所有类名前面都有K? Nooku 的主库代号为“Koowa”。

回到 Nooku 控制器:KMixinBehavior 类包含所有部分,使 KControllerAbstract 能够在运行时加载特定行为。 行为策略是描述可以被其他类分离和使用的过程或逻辑的类(例如,可编辑的、可排序的)。 KMixinBehavior 相当简单,只有四个方法:getBehavior、hasBehavior、addBehavior 和 getBehaviors。 这就是我们需要赋予对象处理和封装不同行为策略的能力。

同样,KMixinCommand 只有三个方法:getCommandContext、getCommandChain、setCommandChain。 如果您没有猜到,这三个方法为 KControllerAbstract 提供了实现命令链的能力,但让它在运行时这样做。

您可以将此混合视为简单的算术加法:

在这个快速应用程序开发框架中将 Nooku 的混合描述为算术加法。

给我们一个看起来像这样的界面:

这就是这个特定 RAD 框架中生成的界面的样子。

根据定义,抽象类旨在扩展,因此通过继承的魔力,所有作为 KControllerAbstract 的子对象或实例的对象也获得了在运行时添加行为和命令链的能力。

听起来很酷。 但这实际上意味着什么? 简而言之,Nooku 提供了组件化的功能; 也就是说,Nooku 允许您模块化您的功能并在运行时跨模块组合功能。

这两个示例用于演示组合。 它们还用于展示 Nooku RAD 框架对进一步组合的核心支持。 这是一个重要的优势。 上面添加到 KControllerAbstract 的方法通过为开发人员提供工具来封装在编写一行代码之前发生的变化,从而支持“策略设计模式”。 mixin() 方法是 KObject 的每个扩展的一部分这一事实意味着您可以在运行时轻松地为大多数对象定义和添加其他行为管理接口。

服务和资源标识符和定位器:将我的类名与我的对象分离

Nooku 中的服务和资源标识符和定位器也为关注点分离提供了强大的支持。

再一次,让我们再看看 KObject,还有 KService。 我们可以将 Nooku 中的大多数事物视为服务或资源,并以完全相同的方式实例化和查询它们。

将服务视为您从中获取资源的东西。 所有服务都是资源,但并非所有资源都是服务

当您去杂货店购买产品时,将商店视为服务,即您可以浏览的商品集合; 以及作为资源的产品,即单个项目/解决方案逻辑,可以是:


  • 专门看(读)(例如,看一罐番茄汤)
  • 在商店周围移动(编辑)(例如,将汤移动到产品过道
  • 添加到商店的库存中或从商店的库存中删除( A dd 和D删除)(例如,添加一种新的汤并去掉番茄)

更进一步地举这个例子,想象杂货店有一个特许经营部门,你想开展业务。 在这种情况下,服务是特许经营部门,资源是您购买的杂货店。 这在很大程度上是一个上下文分类。 作为一个整体,这被称为BREAD动作模式(您将看到在 KControllerService 和 KControllerResource 之间表示的每一个都以 '_action' 开头,即 _actionRead())。

模型可以是服务,表对象可以被认为是服务,特定的 MVC 三元组被实例化为资源或服务,而查询服务产生的特定记录可以被认为是资源。

Nooku 中的每个对象都是对象的组合,其中每个对象都包含对“服务容器”中整个应用程序实例化服务的引用和访问服务的方法,称为 getService()。 KObject::getService() 方法所需要的只是我们传递一个有效的资源标识符,它会返回一个实例化的服务以供使用。

在 PHP 快速应用程序开发中,资源标识符为我们提供了一种强大的方法来将对象的实例化与其类名分离,从而为该标识提供别名。 这对应用程序的可维护性具有重要意义。 通过别名,开发人员可以通过使用 KService::addAlias() 添加一行代码来更改使用给定标识符实例化的每个对象使用的类。

我们熟悉的资源标识符的一个示例是 URI 或统一资源标识符:

此 Nooku RAD 框架教程中的示例资源标识符。

这是 KService 定位和加载适当类所需的所有信息。 这些部分与 Nooku 的类命名和放置约定相匹配,这些约定提供了放置和实例化的可预测性。 上面的标识符示例 (com://site/user.database.table.user) 尝试加载文件 /components/com_user/databases/tables/user.php,该文件的类名为 ComUserDatabaseTableUser。 顺便说一句,如果该文件不存在,框架将为您提供一个默认表对象,并根据数据库命名和 id 模式约定构建它(这让我更加着迷)。 如前所述,KService 还允许您为标识符设置别名。 使用KService::setAlias('maindbaseadapter','com://admin/default.database.adapter.mysqli') ; 让我们用KService::getService('maindbaseadapter')加载一个 db 对象。

这为我们提供了我们谈到的解耦,并为我们的应用程序的维护和扩展提供了显着的优势。 如果需要,我们可以自由创建“站点”和“管理员”以外的应用程序,并且通过此处描述的标识符可以轻松使用位于其他应用程序中的服务来帮助我们的解决方案满足他们的要求。 同样,这是 Nooku 如何为 PHP 和 RAD 开发人员和团队提供的另一个示例,不仅支持单个类对象的组合,还支持整个服务和应用程序的组合……免费。

加起来

以组合重于继承为核心; 为支持进一步的汞合金而存在的智能、预先存在的组合物和结构; 以及带有此处描述的标识符的免费的面向服务的架构,Nooku 提供了一个强大的 RAD 框架,与任何同行 PHP 开发工具相比具有显着的领先优势。