提问人: 提问时间:3/15/2010 最后编辑:15 revs, 2 users 100%Pekka 웃 更新时间:11/14/2013 访问量:3320
如何在 Kohana 3 项目中安排业务逻辑
How to arrange business logic in a Kohana 3 project
问:
我正在寻找有关如何使用 Kohana 3 设置中型 Web 应用程序的建议、教程和链接。我过去曾实现过 MVC 模式,但从未使用过“形式化”的 MVC 框架,所以我仍然在研究术语 - 玩弄基本示例、构建视图和模板等等。
我的进展相当顺利,但我想建立一个真实世界的网络项目(我自己的一个项目,我已经计划了很长一段时间)作为学习对象。
我通过示例学习效果最好,但目前 Kohana 3 的基于示例的文档有点稀疏——他们自己在网站上这么说。虽然我并不担心在学习框架的过程中学习,但我想确保代码库从一开始就是健康的结构 - 即控制器被很好地拆分,命名良好并符合标准,最重要的是业务逻辑被分离成适当大小的模型。
从本质上讲,我的应用程序可以被描述为一个具有一系列搜索和列表功能的业务目录,以及每个条目所有者的登录区域。实际的管理数据库后端已经处理好了。
假设我已经制定了所有 API 并就位 - 列出所有企业、编辑企业、按街道名称列出企业、创建以企业身份登录的报价等等,我只是在寻找如何将功能融入 MVC 模式和可以轻松扩展的 Kohana 应用程序结构。
您是否知道“数据库密集型”应用程序的真实示例,例如目录、在线社区......有一个基于 Kohana 3 构建的登录区域,最好是开源的,这样我就可以看看他们是如何做到的?
在 Kohana 项目中,是否有关于如何为最终用户构建可扩展登录区域的约定或最佳实践,该区域不仅能够处理业务目录页面,还能够处理单独页面上的其他产品?
您知道使用 Kohana 构建复杂应用程序的有用资源吗?
你有没有建立过类似的东西,可以给我关于项目结构的建议?
赏金
我把赏金授予@antpaw,因为他为我提供了一个带有一些业务逻辑的 Kohana 应用程序,它给了我很多例子。@Pixel开发人员的出色投入而欢呼 - 像往常一样,我希望有人可以分享赏金!
答:
我会使用 Kohana 附带的 auth 模块进行登录。这将为您提供角色表,您可以在其中设置可能的权限选项,并在以后将它们与用户相关联。之后,您可以在每个控制器的 __constructor() 或 action_function() 内部检查用户是否具有所需的角色,例如使用 ->has() 函数。您还应该使用 ORM 模块,它真是太棒了,因为表之间有很多关系。此外,ORM 对象中的 __get() 方法也非常方便。
通过将新参数设置为 NULL 并在 if 语句中检查它来扩展控制器函数也非常容易。例如,您只需要一个函数即可编辑旧条目或添加新条目。
public funciton action_manage($id = NULL)
{
$entry = ORM::factory('entry', $id); // if id is null a new entry will be returned
}
将视图构建到子文件夹中以避免视图目录混乱也很重要。
评论
这里有很多问题要回答,我会尽力而为。
您是否知道“数据库密集型”应用程序的真实示例,例如目录、在线社区......在 Kohana 3 上构建了一个登录区域,我可以在那里查看他们是如何做到的?
这里有一些示例应用程序。Woody Gilk(Kohana 创始人)已将代码发布到他的个人网站 github 上。对于登录区域,他分配了一个 cookie 值。Kohana 3 / 2.4 对 cookie 进行签名,使其安全并消除了对会话的要求。这可能不符合每个人的口味,因此您始终可以使用同时使用会话和 cookie 的内置身份验证库。
以下是您可能感兴趣的其他一些项目:
在 Kohana 项目中,是否有关于如何为最终用户构建可扩展登录区域的约定或最佳实践,该区域不仅能够处理业务目录页面,还能够处理单独页面上的其他产品?
如果我理解正确,您想为每个页面生成一个登录框吗?使用 Kohana 3 很容易,因为我们可以利用 HMVC 中的 H。Sam de Fressyinet 在 iBuilding 技术博客上写了一篇文章,详细介绍了这一切。使用 HMVC 扩展 Web 应用程序。
然后,您可以执行对登录控制器或操作的内部请求,并将响应转储到视图页面中。
$login = Request::factory('login')->execute()->response;
$login现在包含登录表单,您可以将其放在任何您喜欢的地方。如果请求是内部的,您可能希望返回不同的响应,这就是为什么这段代码很有用的原因:
if (Request::instance() !== $this->request)
{
print 'Internal called made with Request::factory';
}
您知道使用 Kohana 构建复杂应用程序的有用资源吗?
不会有文档向您展示如何构建复杂的应用程序。Kohana 社区的观点是,你是一名 PHP 开发人员,应该能够自己解决这些问题。如果你不能,那么你就不应该使用 Kohana。
你有没有建立过类似的东西,可以给我关于项目结构的建议?
一旦你了解了 Kohana 3 如何查找文件,事情就很容易理解了。
|- classes
|-- controller
|-- model
|- views
例如:
Controller_Mathew extends Controller
将查找在以下位置调用的文件:mathew.php
classes/controller
下划线可用于指定更深层次的目录。例:
Controller_Mathew_Davies extends Controller
将查找在以下位置调用的文件:davies.php
classes/controller/mathew/
如您所见,控制器名称中的下划线充当目录分隔符。这适用于模型和原版课程。
上一个:检测实际的形状变化?
评论