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

本文概述

  • The Mixin
  • 服务和资源标识符和定位器:将类名与对象分离
  • 加起来
每个人都有自己的一套工具。作为PHP开发人员, 我最喜欢的一个是称为” Nooku” 的快速应用程序开发框架。用开发小组的话来说:” Nooku不仅仅是一个Web开发工具包, 而是一个框架” 。
如果你不熟悉它, 请看一看。这是一个开源项目, 大量利用了业界公认的设计模式来生产易于扩展和重用的高度组件化的应用程序(最初由领先的Joomla!开发人员创建)。开箱即用, Nooku为你提供了许多快速的应用程序开发工具, 以帮助更快地启动项目。一个小而强大的样本:
  • MVC的默认实现, 你需要做的就是编写布局(这吸引了我)
  • HMVC立即可用
  • 支持所有数据的不同输出格式(如JSON和XML)(即在几分钟内公开你的API)
  • 默认的管理和前端实施
Nooku的核心是” 组成高于继承” 的设计原则(实际上, 这是Nooku简介页上的第一个概念。总之, 你应该着眼于组成(或加总)多个对象的功能以创建一些对象。一种复合对象, 而不是依赖于子类。
RAD框架的工程内部…作为Nooku的PHP开发人员

文章图片
该原理使你可以减少编写代码, 并经常带来一些非常优雅的解决方案。那么, 它到底如何被提升?好吧, 在代码级别, 最好的示例来自使用Mixins和资源/服务标识符。让我们来看看。
The Mixin 在PHP 5.4之前, 该语言没有Traits的概念。这些是类的结构, 当对象” 使用” 时, 它们提供某种类型的功能(类似于多重继承)。多年来(从PHP 5.2开始), Nooku使用Mixin解决了这个问题。
Mixin不仅可以让你将对象组合在一起, 还可以将每个混合对象的方法添加到组合对象的界面中。使用mixin的对象似乎” 继承” 了混合对象的方法。
/** * Mixin an object * * When using mixin(), the calling object inherits the methods of the mixed * in objects, in a LIFO order. * * @paramKMixinInterface$object An object that implements KMinxInterface * @returnKObject */ 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类, 通过检查你可以看到它立即利用了Mixing功能。每当构造此类的实例时, KMixinCommand和KMixinBehavior功能都会立即添加到其接口中。因此, Nooku中的每个控制器都通过各自的对象组成了命令链和行为管理功能。
为什么在所有班级名称前面都加上K? Nooku的主库代码为” Koowa” 。
回到Nooku控制器:KMixinBehavior类保留了所有内容, 使KControllerAbstract能够在运行时加载特定的Behavior。行为策略是描述可被其他类(例如, 可编辑, 可排序)分离并使用的过程或逻辑的类。 KMixinBehavior非常简单, 只有四个方法:getBehavior, hasBehavior, addBehavior和getBehaviors。这就是我们需要赋予对象处理和封装不同行为策略的能力。
同样, KMixinCommand只有三种方法:getCommandContext, getCommandChain, setCommandChain。如果你没有想到, 这三种方法可使KControllerAbstract实施命令链, 但可以在运行时执行。
你可以将这种混合视为简单的算术加法:
RAD框架的工程内部…作为Nooku的PHP开发人员

文章图片
给我们一个看起来像这样的界面:
RAD框架的工程内部…作为Nooku的PHP开发人员

文章图片
按照定义, 抽象类是要扩展的, 因此继承的魔力使所有属于KControllerAbstract的子对象或实例的对象也具有在运行时添加行为和命令链的能力。
听起来不错。但这实际上意味着什么?简而言之, Nooku提供了组件化功能。也就是说, Nooku允许你在运行时将功能模块化并跨模块组合功能。
这两个例子用来说明组成。它们还可以证明Nooku RAD框架对进一步构图的支持。这是一个重要的优势。上面添加到KControllerAbstract的方法通过为开发人员提供工具来封装在编写一行代码之前所发生的变化, 从而支持” 策略设计模式” 。 mixin()方法是KObject的每个扩展的一部分, 这一事实意味着你可以在运行时随时为大多数对象定义并添加其他行为管理接口。
服务和资源标识符和定位器:将类名与对象分离 Nooku中的服务和资源标识符和定位器还为关注点分离提供了强大的支持。
再次, 让我们再次看一下KObject, 还有KService。我们可以将Nooku中的大多数事物视为服务或资源, 并以完全相同的方式实例化和询问它们。
将服务视为从中获取资源的某种东西。所有服务都是资源, 但并非所有资源都是服务
当你去杂货店购买产品时, 请将商店视为服务, 即你可以浏览的一系列商品;产品作为资源, 即单个项目/解决方案逻辑可以是:
  • 专门查看(阅读)(例如, 查看一罐番茄汤)
  • 在商店内移动(已编辑)(例如, 将汤移到农产品过道上)
  • 添加到商店库存中或从商店库存中删除(添加和删除)(例如, 添加一种新汤并去除番茄)
再以这个示例为例, 想象一下杂货店有一个特许经营部门, 并且你想开展业务。在这种情况下, 服务部门是特许经营部门, 资源是你购买的杂货店。它非常是上下文分类。总体而言, 这就是BREAD操作模式(你会在KControllerService和KControllerResource之间以” _action” (即_actionRead())开头表示每个模式)。
模型可以是服务, 表对象可以被视为服务, 特定的MVC三元组可以实例化为资源或服务, 而查询该服务所产生的特定记录可以被视为资源。
Nooku中的每个对象都是对象的组合, 其中每个对象都在” 服务容器” 中包含对整个应用程序实例化服务的引用, 以及一种访问服务的方法, 称为getService()。 KObject :: getService()方法所需要做的就是传递一个有效的资源标识符, 并且该标识符将返回一个可供使用的实例化服务。
在PHP快速的应用程序开发中, 资源标识符为我们提供了一种强大的方法, 可以将对象的实例化与其类名分离, 从而为该标识提供别名。这对应用程序的可维护性具有重要意义。通过别名, 开发人员可以通过使用KService :: addAlias()添加一行代码来更改每个对象的类, 该类使用给定的标识符实例化。
我们熟悉的资源标识符的一个示例是URI或统一资源标识符:
RAD框架的工程内部…作为Nooku的PHP开发人员

文章图片
这是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’ )加载数据库对象。
这使我们脱钩, 并在维护和扩展应用程序方面提供了明显的优势。我们可以根据需要自由创建除” 站点” 和” 管理员” 之外的应用程序, 并且通过此处所述的标识符可以轻松使用其他应用程序中的服务来帮助我们的解决方案满足其要求。再次, 这是Nooku如何为PHP和RAD开发人员和团队免费提供不仅支持单个类对象, 还支持整个服务和应用程序组成的另一个示例。
加起来 【RAD框架的工程内部… 作为Nooku的PHP开发人员】核心在于继承之上的组成;为支持进一步的汞齐而存在的聪明的, 预先存在的成分和结构;以及带有此处所述标识符的面向服务的免费体系结构, Nooku提供了一个功能强大的RAD框架, 它比任何其他对等PHP开发工具都具有明显的领先优势。

    推荐阅读