介绍
我们从谈论 Kohana 及其安装过程开始我们的系列。 由于该框架不需要任何额外的配置或修改,我们准备开始使用 Kohana 框架学习 Web 应用程序开发基础知识。
在这篇 DigitalOcean 文章中,我们将深入了解 Kohana 是如何设计成与它最重要的部分一起工作的。 我们将回顾 HMVC(分层模型视图控制器)模式并学习如何创建每个模式 - 并让它们一起工作!
注意: 这是我们 Kohana 系列的第二篇文章,重点介绍如何使用框架。 要查看有关安装它的第一个内容,请查看 Kohana 入门 。 要了解如何部署基于 Kohana 的 Web 应用程序,请查看 部署基于 Kohana 的 PHP Web 应用程序。
词汇表
1. 约定优于配置
2. Kohana 的选择及其约定
1. File Naming 2. Coding Style
3. Kohana 和 MVC 模式
4. 控制器 - MVC 模式的“C”
1. Conventions 2. How does it work?
5. 行动
1. Conventions 2. How does it work?
6. 模型 - MVC 模式的“M”
1. Conventions 2. How does it work?
7. 查看 - MVC 模式的“V”
1. Conventions 2. How does it work?
8. 路由
1. Conventions 2. How does it work?
9. 使用 Kohana 处理错误
1. Registering HTTP Error Page Controllers 2. Throwing HTTP Errors
10. 会话和 Cookie
1. Sessions 2. Cookies
约定优于配置
在应用程序编程中,Convention-over-Configuration(或按约定编码)是用于描述某种类型的设计(即 应用程序结构化/建模),应用程序相信正在构建的代码尊重规则和核心指令(即 自动连接模型和控制器 - 使用名称识别)。
这种应用程序开发范式用于减少基于文件的经典配置(例如 config.xml)。 它基于组件 [形成应用程序] 遵循已经建立的约定以使事情顺利进行 - 因此无需额外的配置。
Kohana 对这一概念的严格依赖使其成为使用框架最简单、最简单的方法之一。 如果您遵循 Kohana 的约定(包括 - 并且非常重要的 - 编码风格),那么一切都将更容易创建和维护。
Kohana 的选择及其约定
文件命名
为了方便 PHP 自动加载所需文件(即 那些后来创建的),Kohana 使用严格的风格:类名的第一个字母大写,下划线用于分隔组成它的每个单词 - 根据 PSR-0 自动加载标准 。
例子:
# Class Name - Class File Location 1. MyClass classes/MyClass.php 2. Controller_ClassOne classes/MyWork/ClassOne.php 2. Controller_ClassTwo classes/MyWork/ClassTwo.php
注意: 请记住,按照惯例,所有类定义文件都必须存在于classes
目录下。
编码风格
尽管并非绝对必要,但出于上述原因,Kohana 建议在编写代码时坚持 BSD/Allman 风格。
这个过程包括在自己的行上放置花括号。
例子:
// for (int i=0; i<x; i++) if (a == b) { proc1(); } finally();
注意:类名后面的大括号要在同一层级。
例子:
class MyClass { // ... // .. / .
记住: 要了解更多关于 Kohana 的约定,您可以选择参考位于 here 的文档。
Kohana 和 MVC 模式
本节和以下相关部分(控制器、操作、模型、视图)构成了 Kohana 应用程序开发基础的第一主要部分——创建过程(函数)来处理请求。 这之后的部分涵盖了其他关键领域(例如 定义路线、处理错误等)。 建议您在继续构建生产就绪应用程序之前尽可能多地在您的 droplet 上尝试这些示例。
正如我们详细讨论过的,Kohana 使用 (H)MVC 模式来处理请求。 使用 Kohana 开发的应用程序最好尽可能彻底地遵循这种风格,以创建流畅的运行程序。
控制器 - MVC 模式的“C”
控制器是纯文本文件,构成处理传入请求的主要部分之一。 它将构成 MVC 模式的其余部分粘合在一起,并使它们共同工作以创建和返回响应。 每个传入的请求,在被路由之后,被传递给一个匹配的控制器并通过调用一个动作来处理(例如 打印名称)。
约定
Kohana 的约定也适用于其控制者,因此,每个控制者必须:
- 存在于
classes/Controller/*
下。 - 使其名称与文件名匹配(即
Controller_Name
在classes/Controller/
中作为Name.php
)。 - 遵循其余的命名和样式约定。
- 扩展父 Controller 类。
例子:
# Each one of the below examples represent the top - # section (definition) of a class on a single [class] file. # Example [1] // classes/Controller/ClassOne.php class Controller_ClassOne extends Controller { # Example [2] // classes/Controller/Namegroup/ClassOne.php class Controller_Namegroup_ClassOne extends Controller { # Example [3] // classes/Controller/ClassTwo.php class Controller_ClassTwo extends Controller_ClassOne {
它是如何工作的?
控制器的工作方式与以下类似:
- Request - 控制器接收包装为对象的请求数据,附加到 [object] 变量
$this->request
。 - With Models - 控制器将信息传递给模型以修改数据库和数据对象,并且它们从模型请求/接收数据以处理数据(可能通过视图传递)。
- With Views - 控制器在处理收到的请求信息和来自模型的数据后,通过视图层传递此信息以返回最终响应及其呈现(即 风景)。
- Response - 控制器返回包装为由
$this->response
定义的对象 [变量] 的最终响应(例如 最终视图主体可以通过$this->response->body($my_resp)
设置。)
行动
行动是 [公共] 程序(即 函数)在类下定义。 它们由用于处理请求的可调用对象组成。
约定
按照 Kohana 的约定,actions 必须有:
action_
前缀添加到他们的名字。 (IEaction_print_names
)。- public分类(即
public function action_print_names()
)。 $this->response->body($view)
在其执行周期结束时设置,以向用户返回视图。
注意: 动作有两个主要的例外。 这些都是:
- before (public function before()) - 用于执行代码 before 一切。
- after (public function after()) - 用于执行代码 after 一切。
模型 - MVC 模式的“M”
Kohana 中的模型是纯文本文件,包含类或其他数据形成/包含对象,这些对象代表数据库(或任何数据源)正上方的层。 这些对象的独特性质(即 那些用于表示实际数据的模型)通过允许分离与直接创建、修改、更新或删除数据相关的所有过程,使 models 成为 MVC 范式的完美组成部分。
约定
按照惯例,模型下定义的类——类似于控制器——必须:
- 在
classes/Models/*
下存在。 - 使其名称与文件名匹配(即
Model_Name
在classes/Model/
中作为Name.php
)。 - 遵循其余的命名和样式约定。
- 扩展父 Model 类。
它是如何工作的?
通常模型使用对象关系映射器 (ORM) 解决方案来向控制器类公开数据和与之交互的方式。 Kohana 带有自己的 ORM 模块,可以设计和创建结构良好的对象。
在接收到命令(可能带有更多变量)后,模型执行所需的操作以发送回对数据请求的响应,或者使用给定的内容更新数据库。
查看 - MVC 模式的“V”
查看文件形成与最终响应表示相关的所有内容。 当然,这些文件并不直接包含第三方资源(例如 图像或其他运行时依赖项); 但是,它们构成了提供给最终用户的基础。 如果您正在设计基于 Web 的 API,则可以使用视图以易于维护的结构化方式返回所需的数据。 (例如 json 响应 ajax 请求)。
使用视图时,最好远离所有会修改视图文件中要表示的数据的逻辑操作。 应(尽可能)使用视图来形成数据的显示方式。
约定
- 查看文件必须存在于
views/
目录下(例如views/login.php
) - 他们应该尽可能“愚蠢”。
- 除了使用提供的数据来形成表示之外,它们应该 not 用于任何其他用途。
它是如何工作的?
为了形成最终视图,控制器将某个有效负载(数据)传递给视图文件,视图文件通过它们处理它们(例如 遍历列表以形成表的列)。 编译完所有内容(处理了有效负载/数据的模板文件)后,控制器会传输视图的表示作为对请求的最终响应。
路由
正如我们在 Kohana 系列的第一篇文章中图解和讨论的那样,每个请求都被解析(处理)和路由。 其工作方式主要取决于您的应用程序中路由的定义方式。
这些元素形成 patterns,它们与请求匹配(按写入顺序),以决定使用请求有效负载调用哪个 action。
约定
除非您严格开发自己的模块,否则路由通常在 bootstrap.php
文件下定义 - 在最后。
这些路由机制定义在它们的运作方式上非常灵活和慷慨——可能是现有最灵活的。 您可以非常简单地使用它们来实现伟大的事情 - 只需遵循正确的模式。
- 所有路由名称必须是唯一的。
- 它们必须在默认路由之前定义。
- 不得包含特殊令牌参数 (
(), <>
)。
例子:
# Route Syntax: set([name], [pattern]) # Pattern Syntax: (.. item ..) <- optional elements, <controller> <- match a controller, <action> <- match an action, <id> <- request variable # Example [1] Route::set('default', '(<controller>(/<action>(/<id>)))') ->defaults(array( 'controller' => 'Welcome', 'action' => 'index', )); # Route explained: # By default, match all requests - optionally with: # /controller, and, # - optionally with: # /controller/action, and, # /controller/action/id # Use controller "Welcome" by default if none other matched, # Use action "index" by default if one is not matched. # Example [2] Route::set('logops', '<action>', array( 'action' => '(login|logout)' )) ->defaults(array( 'controller' => 'logops', )); # Route explained: # Match all incoming requests to /login and /logout with # "logops" controller and call the related action (i.e. login or logout)
注: 路由匹配后,程序停止。 因此,所有额外的路线(即 all bar 默认路由)必须在默认路由之前创建。
它是如何工作的?
请求对象在匹配到路由后,会连同它们的数据一起传输。 这个匹配和请求路由过程包括:
- 将请求与路由匹配
- 在
classes/Controller
目录下找到相关的类。 - 找到控制器。
- 查找并调用控制器的 action 可调用对象。
- 返回响应(即 视图)。
使用 Kohana 处理错误
与单元测试一起,处理错误(以理智的方式)是几乎所有应用程序中最关键的部分之一。 Kohana 使用 PHP 的 ErrorException 将错误转换为异常,并允许使用其助手处理它们。
注册 HTTP 错误页面控制器
一个健壮的 Web 应用程序将很好地处理错误并提供结果(即 响应)正确返回给用户。 为此,Kohana 提供了一个特殊的错误处理系统(没有双关语 - 见上文)。
要注册 HTTP 错误页面以引发异常:
class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 { public function get_response() { $response = Response::factory(); $view = View::factory('errors/404'); $view->message = $this->getMessage(); $response->body($view->render()); return $response; } }
引发 HTTP 错误
Kohana 有一个非常好的和易于操作的错误处理机制,用于抛出 HTTP 错误/异常。
例子:
# To create an error (exception) for 404 - Not Found Error throw HTTP_Exception::factory(404, 'Not Found');
会话和 Cookie
为了方便使用会话和 cookie,Kohana 提供了帮助类,让您可以安全地使用它们。
会话
使用会话时,您需要有一个访问 会话实例 的变量。
# Accesing the session instance $session = Session::instance();
通过您对会话实例的访问,您可以通过以下方式在数组中获取所有这些实例:
# Accessing the session variables $svars = $session->as_array();
要将新值附加到会话变量:
# Usage: $session_instance->set($session_key, $value); $session->set('uid', 1234567890);
要获得一个的值:
# Usage: $session_instance->get($session_key, $optional_default_value); $uid = $session->get('uid', 0);
最后,要删除:
# Usage: $session_instance->delete($session_key); $session->delete('uid');
饼干
Kohana 仅处理安全 cookie。 为此,必须在 bootstrap.php
文件中定义字符串、设置为和引用为 Cookie::$salt
,如下所示:
# Usage: Cookie::$salt = 'secure_cookie_key'; Cookie::$salt = '1234567890';
要设置 cookie 值,您可以使用与 Sessions 相同的方法:
# Usage: Cookie::set($cookie_key, $cookie_value); Cookie::set('uid', 1234..);
要获取 cookie 的值:
# Usage: $variable = Cookie::get($cookie_key, $optional_default_value); $var = Cookie::get('uid', 0);
最后,删除:
# Usage: Cookie::delete($cookie_key); Cookie::delete('uid');
注意: 要了解如何使用 Kohana 处理 cookie 等,请查看 其官方文档 (最新版)。