- Phalcon 教程
- Phalcon - 主页
- Phalcon - 概述
- Phalcon - 环境设置
- Phalcon - 应用程序结构
- Phalcon - 功能
- Phalcon - 配置
- Phalcon - 控制器
- Phalcon - 模型
- Phalcon - 景观
- Phalcon - 路由
- Phalcon - 数据库连接
- Phalcon - 切换数据库
- Phalcon - 脚手架应用
- Phalcon - 查询语言
- Phalcon - 数据库迁移
- Phalcon - Cookie 管理
- Phalcon - 会话管理
- Phalcon - 多语言支持
- Phalcon - 资产管理
- Phalcon - 使用表单
- Phalcon - 对象文档映射器
- Phalcon - 安全功能
- Phalcon 有用资源
- Phalcon - 快速指南
- Phalcon - 有用资源
- Phalcon - 讨论
Phalcon - 快速指南
Phalcon - 概述
Phalcon 是最近推出的 PHP 框架之一,由一群热情的开发人员开发。Phalcon 是一个松散耦合的框架,这意味着它允许根据应用程序的需要将其对象视为粘合组件。
与 PHP 中的其他框架(传统的或现有的)相比,Phalcon 提供了一些独特的功能。以下是 Phalcon 的一些最突出的特点 -
它是一个全栈开源框架。
用户需要相当少的代码来利用多个组件。
可以根据需要使用它来创建独立的框架。例如,如果我们只需要 Phalcon 的 Cache 组件,我们可以在任何用纯 PHP 或使用框架编写的应用程序中使用它。
对于了解模型-视图-控制器(MVC) 和对象关系建模(ORM) 的开发人员来说,使用 Phalcon 简直就是小菜一碟。
表现
Phalcon 的性能是它区别于其他传统 PHP 框架的一个特点。Phalcon 结合了 PHP 和 C;它们中的每一个都可以用作独立模块。Phalcon 中每个请求的编译都会以更高的速度进行考虑,这使得一切看起来都是开箱即用的。
C语言
Phalcon 与 C 兼容,提高了编译速度。此外,C 与 Phalcon 结合提供了对象关系映射 (ORM),它提供了与创建的模型的一致性。Phalcon中创建的每个模型都与关系数据库的表相关联。Phalcon 中的 ORM 纯粹是用 C 实现的。
开发者工具
开发人员工具用于开发 Web 应用程序。这些工具有助于生成具有所有功能组合的脚手架应用程序(C – 创建、R – 读取、U – 更新、D – 删除)。开发人员工具还包括对在 Phalcon 中实现的第三方库的可扩展支持。
对象关系映射
Phalcon 支持多种数据库。它不限于关系数据库的访问。它同时支持关系型和非关系型数据库,这就像为 Phalcon 框架添加了一根羽毛。
Phalcon 与其他框架的比较
下表重点介绍了 Phalcon 与其他流行框架(例如 Yii 和 Laravel)的不同之处。
| 伊伊 | 拉维尔 | 菲尔康 | |
|---|---|---|---|
| 项目类型 | Yii 有助于创建大型项目,如论坛、门户、CMS、RESTful Web 服务等。 | Laravel 用于构建 Web 应用程序。它以精致复杂的语法而闻名。 | Phalcon 用于设计各种项目。 |
| 数据库支持 | Yii 支持所有关系型和非关系型数据库。 | Laravel 支持所有关系数据库。 | Phalcon 对关系型数据库和非关系型数据库给予同等支持。 |
| 语言 | Yii 框架纯粹用 PHP 编写。 | Laravel 使用 PHP 编写,遵循 MVC 模式。 | Phalcon 包括 PHP 和 C。 |
| 可扩展性 | Yii 对于中小型项目来说具有相当的可扩展性。 | Laravel 对于各种项目来说都具有很高的可扩展性。 | 适合中型项目。 |
| 表现 | 相对较低。 | 与 Phalcon 相比较高但较低。 | 高性能。 |
Phalcon - 环境设置
先决条件- 我们需要此框架的 WAMP/LAMP/MAMP 或 XAMPP 堆栈。
以下是在 Windows 中安装 Phalcon 框架的步骤。
步骤 1 - Phalcon 安装完全依赖于dll文件。DLL(动态链接库)创建 Phalcon 所需的包和插件。
以下链接用于下载 dll 文件 - https://phalconphp.com/en/download
步骤 2 - 下载所需的 dll 文件。检查系统的适当配置并下载所需的 dll 文件。下载文件后,将phalcon-php.dll解压到xampp文件夹中的/php/ext中。
步骤 3 - 编辑php.ini 文件中的路径,以与其他.dll文件类似的方式进行配置。
步骤 4 - 编辑路径后,重新启动xampp/wamp堆栈。一旦正确设置了dll文件,它将在仪表板中清晰可见。
步骤 5 - 下载软件包后,在系统属性中设置路径变量。
步骤 6 - dll文件和 Phalcon 工具一起帮助创建项目/Web 应用程序。用户可以通过命令提示符验证Phalcon框架是否已成功安装。输出将显示如下屏幕截图所示。
步骤 7 - 收到必要的输出后,使用以下命令创建一个项目 -
phalcon create-project <project-name>
将显示以下输出。
步骤 8 - Web 应用程序已成功创建。单击以下 URL - http://localhost/demo1
输出将显示如下屏幕截图所示。这是 Phalcon PHP 的欢迎页面。
Phalcon - 应用程序结构
在本章中,我们将讨论 Phalcon 的应用程序结构。以下是 Phalcon 项目的完整目录结构。
有一个根文件夹被视为代码库,并且可供 Web 服务器公开使用。它也称为Web 目录。Web 根目录之外的其他文件夹被认为是 Web 服务器和 Phalcon 项目无法访问的。
创建项目后,在wamp/xampp文件夹中将显示如下目录结构。考虑我们在上一章中创建的项目。
以下是该项目的文件夹和子文件夹。
应用程序
该文件夹包含所有重要的脚本文件和文件夹。完整的Web应用程序是在“app”文件夹的基础上设计的。配置文件有助于协助进行必要的配置以顺利运行应用程序。
以下是给定 Phalcon Web 应用程序的应用程序文件夹的详细视图。
它由配置、控制器、库、迁移、模型和视图组成。
配置
Phalcon 中 Web 应用程序所需的所有配置都包含在此文件夹中。它包括与数据库连接、要添加的第三方库(如果有)以及要包含的服务相关的信息。
控制器
所有控制器都包含在此文件夹中。它们用于处理请求并生成响应。
图书馆
Web 应用程序的第三方库(除了现有的 Phalcon 框架)。
迁移
该子文件夹包含与数据迁移相关的所有文件,也可以在任何其他框架中使用。
楷模
模型包括与数据库交互所需的所有逻辑。它实际上用于数据表示。
意见
它构成了与 Web 应用程序相关的所有视图。这些视图在控制器的帮助下显示给最终用户。
缓存
该目录包含与缓存相关的数据,这有助于提高性能。
民众
它包括用于资产管理目的的所有文件夹,其中包括 CSS、JavaScript、要上传的文件和一些元数据。
.htaccess 文件
在 Apache Web Server 软件上运行的 Web 服务器使用.htaccess作为配置文件。当它被放置在一个目录中时,一旦服务器启动,所有必要的配置就会被加载。
例如,可以配置一个网站,使其仅对具有.htaccess文件的特定 IP 地址可用。
Phalcon - 功能
模型视图控制器 (MVC)是一种用于开发基于 Web 应用程序的软件设计和结构模式。该软件架构将信息的表示与用户与其交互分开。
MVC 模型定义了具有三个逻辑层的 Web 应用程序。
模型
模型是代表知识的对象。模型与其部件之间应该存在一对一的关系。它包括用于数据库连接和执行 CRUD 操作的所有逻辑。
看法
视图是其模型的视觉表示。视图与模型或其部分进行交互,并从模型中获取呈现所需的数据。这是通过发送请求并接收适当的响应来实现的。视图包括最终用户看到的所有数据。
控制器
控制器充当用户和系统(模型和视图)之间的中介。它接受来自用户的请求,通过视图将其发送到模型。模型对其进行操作并将响应发送到控制器,该响应通过视图显示为最终用户的输出。
控制器接收此类用户输出并将其转换为适当的消息。视图使用这些消息来显示适当的响应。
Phalcon 中的工作流程
Phalcon 中的工作流程如下 -
用户与用户界面(视图)交互,并且交互是在某些方法/事件的帮助下维持的。
这些方法和事件由控制器处理。
控制器通过更新用户的操作来访问模型。
视图使用模型生成适当的输出。
视图从其模型中获取数据。该模型与视图没有直接交互。
用户界面等待进一步的用户交互,这从新的请求和响应周期开始。
Phalcon 包含模型、视图和控制器的目录。下面的屏幕截图提供了一个更好的场景。
所有业务逻辑都在控制器中描述,模型与数据库交互,数据库包括与每个表相关的所有文件。
注意-
Phalcon Web 应用程序中创建的所有控制器都扩展了Phalcon\Mvc\Controller。
与数据库表关联的所有模型都扩展了\Phalcon\Mvc\Model。
Phalcon - 配置
Web 应用程序的 config 文件夹包含以下文件 -
- 配置文件
- 加载程序.php
- 服务.php
配置文件
它包括根据目录路径进行数据库连接和路由的配置。
<?php
/*
* Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?:
realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config([
'database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'test',
'charset' => 'utf8',
],
'application' => [
'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH . '/controllers/',
'modelsDir' => APP_PATH . '/models/',
'migrationsDir' => APP_PATH . '/migrations/',
'viewsDir' => APP_PATH . '/views/',
'pluginsDir' => APP_PATH . '/plugins/',
'libraryDir' => APP_PATH . '/library/',
'cacheDir' => BASE_PATH . '/cache/',
'baseUri' => '/demo1/',
]
]);
加载程序.php
它扩展了\Phalcon\Loader()的现有类。加载器类注册需要Web应用程序的目录。
<?php
$loader = new \Phalcon\Loader();
/**
* We're a registering a set of directories taken from the configuration file
*/
$loader->registerDirs( [
$config->application->controllersDir,
$config->application->modelsDir
]
)->register();
服务.php
该文件关联了实现 Web 项目服务的所有函数。它实现了Phalcon\Di接口。它还通过加载服务来实现服务的依赖注入。
基本上,config 文件夹内的 services.php 文件充当所有服务的容器。该接口有助于初始化所有服务,例如数据库连接、设置 cookie、创建新会话或与 NoSQL 数据库连接。
<?php
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Php as PhpEngine;
use Phalcon\Mvc\Url as UrlResolver;
use Phalcon\Mvc\View\Engine\Volt as VoltEngine;
use Phalcon\Mvc\Model\Metadata\Memory as MetaDataAdapter;
use Phalcon\Session\Adapter\Files as SessionAdapter;
use Phalcon\Flash\Direct as Flash;
/**
* Shared configuration service
*/
$di->setShared('config', function () {
return include APP_PATH . "/config/config.php";
});
/**
* The URL component is used to generate all kind of urls in the application
*/
$di->setShared('url', function () {
$config = $this->getConfig();
$url = new UrlResolver();
$url->setBaseUri($config->application->baseUri);
return $url;
});
/**
* Setting up the view component
*/
$di->setShared('view', function () {
$config = $this->getConfig();
$view = new View();
$view->setDI($this);
$view->setViewsDir($config->application->viewsDir);
$view->registerEngines([
'.volt' => function ($view) {
$config = $this->getConfig();
$volt = new VoltEngine($view, $this);
$volt->setOptions([
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_'
]);
return $volt;
},
'.phtml' => PhpEngine::class
]);
return $view;
});
/**
* Database connection is created based in the parameters defined in the configuration
file
*/
$di->setShared('db', function () {
$config = $this->getConfig();
$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
$connection = new $class([
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
'charset' => $config->database->charset
]);
return $connection;
});
Phalcon - 控制器
在MVC框架中,“C”代表Controller,指的是Web应用程序的总机。控制器执行的操作有助于将参数传递给视图,以便它可以相应地显示和响应用户输入。
例如,如果我们通过包含用户详细信息(例如用户名、电子邮件地址和密码)的注册表单进行注册,然后单击“提交”按钮,则用户插入或发布的数据将通过控制器发送相关的动作或功能。
控制器的特点
控制器接受来自视图的输入并与关联的模型交互。
它通过向模型发送命令来帮助更新模型的状态。它还可以向关联视图发送命令,这有助于根据模型的状态更改视图的呈现。
控制器充当模型和视图之间的中介。
Phalcon 中 MVC 的工作流程
下图展示了Phalcon中MVC的工作流程
在 Phalcon 中创建控制器的步骤
步骤 1 - 在命令提示符的帮助下重定向到项目路径。请参阅以下屏幕截图。
如上面的截图所示,“demo”是与 Phalcon PHP 框架相关的项目。
步骤 2 - 使用以下命令创建关联的控制器。
phalcon controller <controller-name>
以下是成功执行上述命令的输出。
注意- 控制器的类名称必须带有后缀“controller”。这意味着 Phalcon 遵循良好的命名约定。
默认情况下,当应用程序在 Phalcon PHP 框架中创建时,它包含一个名为“IndexController”的控制器。默认情况下调用此控制器来触发操作。
与扩展\Phalcon\Mvc\Controller的其他控制器不同,该控制器由controller-base 扩展。
代码-
<?php
class IndexController extends ControllerBase {
public function indexAction() {
echo "This is my first web application in Phalcon";
}
}
输出-
Phalcon - 模型
MVC架构中的模型包含应用程序的逻辑。模型是与数据库交互的核心。它应该能够根据用户的请求管理记录的更新、删除、插入和获取。
为了理解 Phalcon PHP 框架中的模型交互,应遵循以下步骤。
步骤 1 - 创建数据库。
对于任何LAMP、WAMP、XAMPP软件堆栈,借助phpmyadmin数据库工具创建数据库都非常容易。
以下是创建数据库的 SQL 查询。
create database <database-name>
步骤 2 - 在phpmyadmin部分中,单击“数据库”选项卡,提及数据库名称,然后单击“创建”按钮,如以下屏幕截图所示。
步骤 3 - 成功创建数据库后,创建一个表,该表将有助于其关联以在 Phalcon 框架中创建模型。
使用以下查询创建一个名为“users”的新表。
DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25), `emailid` varchar(50), `contactNumber` number PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
创建表后,其结构如下图所示。
步骤 4 - 要创建与我们在上一步中创建的“用户”表关联的模型,请打开命令提示符实例。重定向到适当的项目路径很重要。在此之前,检查数据库配置是否正确设置至关重要,如下图所示。
步骤 5 - 使用以下命令在 Phalcon 框架中创建任何模型。
phalcon model <model-name>
以下是执行上述命令的输出。
这表明模型已经创建成功。
步骤 6 - 成功创建的模型存在于模型文件夹中。使用以下路径查看模型的创建位置。
C:\xampp\htdocs\demo1\app\models
以下是Users.php的完整代码。
<?php
class Users extends \Phalcon\Mvc\Model {
/**
*
* @var integer
* @Primary
* @Identity
* @Column(type = "integer", length = 11, nullable = false)
*/
public $id;
/**
*
* @var string
* @Column(type = "string", length = 25, nullable = true)
*/
public $name;
/**
*
* @var string
* @Column(type = "string", length = 50, nullable = true)
*/
public $emailid;
/**
*
* @var integer
* @Column(type = "integer", length = 11, nullable = true)
*/
public $contactNumber;
/**
* Returns table name mapped in the model.
*
* @return string
*/
public function getSource() {
return 'users';
}
/**
* Allows to query a set of records that match the specified conditions
*
* @param mixed $parameters
* @return Users[]
*/
public static function find($parameters = null) {
return parent::find($parameters);
}
/**
* Allows to query the first record that match the specified conditions
*
* @param mixed $parameters
* @return Users
*/
public static function findFirst($parameters = null) {
return parent::findFirst($parameters);
}
}
步骤 7 - 控制器与模型和视图交互以获得必要的输出。与模型一样,使用以下命令终端创建控制器。
Phalcon controller <controller-name>
成功执行上述命令后,输出如下。
以下是UserController.php的代码。
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
echo "Users Controller has been called";
}
}
如果我们点击以下 URL,将会显示输出 - http://localhost/demo1/users
Phalcon - 景观
视图是呈现给最终用户的信息。视图可以被视为具有要显示的适当响应的网页。通过与模型交互的控制器接收响应。
具体来说,在 Phalcon 中,视图由 Volt 代码、PHP 和 HTML 组成。可以在 Volt 模式下输入一组特殊分隔符。{% ... %}用于执行诸如 for 循环或赋值之类的语句,而{{ ... }}将表达式的结果打印到模板。
Phalcon 中的视图基本上分为两种类型 -
- 伏特
- html
伏特
以下是我们在上一章中为项目demo1创建的输出屏幕截图。
此输出是在文件views/index/index.volt的帮助下实现的。
Volt 文件的特点
它是用 C 语言编写的模板,与其他语言相比速度相当快。
它包括一组高度集成的组件,这在 Phalcon 中非常有用。
它也可以用作独立组件。
Volt 被编译为纯 PHP 代码。
以下是index.volt的代码,它默认为任何项目加载。
<!--<div class = "page-header"> <h1>Congratulations!</h1> </div>--> <p>This is my first web application in Phalcon </p> <!--<p>You're now flying with Phalcon. Great things are about to happen!</p> <p>This page is located at <code>views/index/index.volt</code></p>-->
分层渲染
Phalcon 中的视图支持分层渲染,并且使用Phalcon\Mvc\View作为默认渲染组件。与使用C作为模板语言的volt文件相比,该组件使用PHP作为模板引擎。
这些视图应具有.phtml扩展名。给定项目的默认视图目录包含以下三个文件 -
操作视图- 调用此视图来执行特定操作。当执行“show”动作时调用它。
控制器布局- 此视图存在于布局文件夹内。例如,C:\xampp\htdocs\demo\app\views\layouts。它调用与适当控制器关联的方法调用。布局中实现的代码将在需要时实现。
主布局- 此布局视图将调用主操作,并将为 Web 应用程序中的每个控制器或操作显示。
.volt 和 .phtml 文件之间的区别
| 。伏特 | .phtml |
|---|---|
| 当应用程序中设置的模板引擎是用 C 编写时,使用 .volt 扩展名 | 当模板引擎是 PHP 本身时使用 .phtml |
| 它可以用作独立组件 | 它不能作为独立组件使用 |
| Volt 视图被编译为 PHP 代码 | phtml 文件本身包含 PHP 代码,因此不需要在 Phalcon 框架中编译 |
变量
使用“set”在模板中分配和更改变量。
声明一个数组
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
声明一个字符串
{% set name = ”John Kennedy” %}
评论
还可以使用{# ... #}分隔符将注释添加到模板中。其中的所有文本在最终输出中都会被忽略。
{# note: this is a comment
{% set price = 100; %}
#}
例子
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
<h1>Fruits</h1>
<ul>
{% for fruit in fruits %}
<li>{{ fruit|e }}</li>
{% endfor %}
</ul>
{% set robots = ['Voltron', 'Astro Boy', 'Terminator', 'C3PO'] %}
<ul>
{% for robot in robots %}
<li>{{ robot }}</li>
{% endfor %}
</ul>
输出
该代码将产生以下输出屏幕 -
Phalcon - 路由
路由器组件允许定义映射到应接收请求的控制器或处理程序的路由。路由器根据收到的信息解析 URI。
Web 应用程序中的每个路由器都有两种模式 -
- MVC模式
- 仅匹配模式
第一种模式非常适合使用 MVC 应用程序。以下是在 Phalcon 中定义路由的语法。
$router = new Router();
// Define a route
$router->add(
"<URI-Name>",
[
"controller" => "<controller-name>",
"action" => "<action-name>",
]
);
例子
为了搜索类别,让我们在config文件夹的routes.php中创建一个路由。
考虑创建一个路由,当我们调用“UsersController”时,该路由将调用登录方法。在这种情况下,建议创建一个映射给定 URL 的路由。
<?php
$router = new Phalcon\Mvc\Router();
$router->add('/login', array(
'controller' => 'users',
'action' => 'login',
));
return $router;
输出
该代码将产生以下输出 -
Phalcon - 数据库连接
在本章中,我们将讨论与 Phalcon 相关的数据库连接。
数据库的创建和设计
我们将专注于为博客创建一个数据库,该数据库根据用户的条目维护帖子和类别。
数据库名称:blog-tutorial
用于创建数据库的查询 -
drop database blog-tutorial (if exists) create database blog-tutorial
创建数据库后,将列出该数据库,如下图所示。
Phalcon 使用命令来创建模型、控制器甚至项目。让我们看看它是如何工作的。
步骤 1 - 创建一个名为 blog-tutorial 的项目。
步骤 2 - 配置连接到我们为管理博客创建的数据库的 Web 应用程序。
<?php
return new \Phalcon\Config (array (
'database' => array (
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
// 'dbname' => 'blog_tutorial',
'password' => '',
'name' => 'blog_tutorial',
),
'application' => array (
'controllersDir' => __DIR__ . '/../../app/controllers/',
'modelsDir' => __DIR__ . '/../../app/models/',
'viewsDir' => __DIR__ . '/../../app/views/',
'baseUri' => '/blog-tutorial/',
)
));
Phalcon - 切换数据库
我们在我们的应用程序中使用了 MySQL 数据库。如果我们想中途更改数据库软件,也不会太难,只要我们的新数据库具有相同的数据结构即可。
PostgreSQL
配置将连接到 PostgreSQL 数据库的 Web 应用程序。
这可以使用以下代码来实现。这些服务将包括Phalcon\Db\Adapter\Pdo\Postgresql
use Phalcon\Db\Adapter\Pdo\Postgresql; $config = [ 'host' => 'localhost', 'dbname' => 'blog_tutorial', 'port' => 5432, 'username' => 'root', 'password' => '' ]; $connection = new Postgresql($config);
SQLite
为了实现 SQLite 连接,应该使用Phalcon\Db\Adapter\Pdo\Sqlite抽象类扩展配置。
<?php use Phalcon\Db\Adapter\Pdo\Sqlite; $connection = new Sqlite(['dbname' => '/tmp/blog_tutorial.sqlite']);
甲骨文
为了在 Phalcon 中实现 Oracle 数据库连接,需要使用Phalcon\Db\Adapter\Pdo\Oracle抽象类扩展配置。
<?php use Phalcon\Db\Adapter\Pdo\Oracle; $config = array ( "dbname" => "//localhost/blog_tutorial", "username" => "root", "password" => "" ); $connection = new Phalcon\Db\Adapter\Pdo\Oracle($config);
Phalcon - 脚手架应用
脚手架通常是指一种代码生成类型,我们将其指向 Web 应用程序数据库,从而创建基本的 CRUD(创建、读取、更新、删除)应用程序。
在设计 CRUD 应用程序之前,根据应用程序的需要设计数据库表非常重要。
步骤 1 - 创建一个脚手架应用程序,其中包括所有 CRUD 操作。
Command: phalcon scaffold <table-name>
Phalcon 的脚手架生成器一旦执行,将创建下表中描述的文件和文件夹。
步骤 2 - 创建索引页面(phtml 和 volt 的组合)。
要包含在 users 文件夹中的 index.phtml 中的代码。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css"
href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
默认文件index.volt将包含以下代码。
<?php echo $this->getContent() ?> <div align = "center"> <h1>Welcome!</h1> <p>Welcome to the blog collection of Phalcon</p> </div>
成功执行上述代码会产生以下输出。
步骤 3 - 更改相应型号。
用户.php
<?php
class Users extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $login;
/**
* @var string
*
*/
public $password;
/**
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "users_id");
}
}
名为“initialize”的函数有助于实现 Posts 表中 id 和 users_id 之间的关系,这意味着每个唯一用户在表中都有多个关联的帖子。
帖子.php
<?php
class Posts extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $title;
/**
* @var string
*
*/
public $slug;
/**
* @var string
*
*/
public $content;
/**
* @var string
*
*/
public $created;
/**
* @var integer
*
*/
public $users_id;
/**
* @var integer
*
*/
public $categories_id;
/**
* Initializer method for model.
*/
public function initialize() {
$this->belongsTo("users_id", "Users", "id");
$this->belongsTo("categories_id", "Categories", "id");
}
}
函数“初始化”包括提及与表的外键和主键关系的关系约束。
users_id指的是“Users”表中的id。
categories_id指“Categories”表中的 id。
类别.php
<?php
class Categories extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $name;
/**
* @var string
*
*/
public $slug;
/**
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "categories_id");
}
}
与用户模型类似,“初始化”函数指定它包含给定帖子的许多categories_id 。
创建视图
以下是 Blog-tutorial-master 项目的完整结构。
用户成功登录后显示主页的关联视图是“index.phtml”。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css" href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
Phalcon - 查询语言
Phalcon 查询语言(PHQL)也称为PhalconQL是一种高级 SQL 方言,它标准化了 Phalcon 支持的数据库系统的 SQL 查询。
它包括一个用 C 语言编写的解析器,用于转换目标 RDBMS 中的语法。
以下是 Phalcon 查询语言的一些突出功能的列表 -
为了Web应用程序的安全性,它使用绑定参数。
表被视为模型,而列被视为类属性。
所有数据操作语句都用于防止可能发生的数据丢失。
通过一次保持一个 SQL 查询调用来防止 SQL 注入。
创建 PHQL 查询
查询是通过实例化类Phalcon\Mvc\Model\Query创建的。
例子
// Instantiate the Query $query = new Query( "SELECT * FROM Users", $this->getDI() ); // Execute the query returning a result if any $cars = $query->execute();
在前面的章节中,我们已经了解了名为博客教程的脚手架 Web 应用程序的工作原理。它包括根据名称或别名搜索类别。
以下是 searchAction 包含的代码。
public function searchAction() {
$numberPage = 1;
if ($this->request->isPost()) {
$query = Criteria::fromInput($this->di, "Categories", $_POST);
$this->session->conditions = $query->getConditions();
} else {
$numberPage = $this->request->getQuery("page", "int");
if ($numberPage <= 0) {
$numberPage = 1;
}
}
$parameters = array();
if ($this->session->conditions) {
$parameters["conditions"] = $this->session->conditions;
}
// $parameters["order"] = "id";
$categories = Categories::find($parameters);
if (count($categories) == 0) {
$this->flash->notice("The search did not find any categories");
return $this->dispatcher->forward(array(
"controller" => "categories",
"action" => "index"
));
}
$paginator = new \Phalcon\Paginator\Adapter\Model(array(
"data" => $categories,
"limit"=> 10,
"page" => $numberPage
));
$page = $paginator->getPaginate();
$this->view->setVar("page", $page);
}
在控制器中执行(突出显示)的 PHQL 查询将根据搜索条件获取所有结果。根据条件的任何搜索查询的结果将显示如屏幕截图所示。
以下是成功执行上述代码时收到的输出。
PHQL 生命周期
作为一种高级语言,PHQL 为开发人员提供了根据需求个性化和定制各个方面的能力。
以下是 Phalcon 中执行的每个 PHQL 语句的生命周期 -
每个 PHQL 语句都被解析并转换为中间表示(IR),完全独立于数据库系统实现的 SQL。
IR 根据 Web 应用程序中使用的数据库系统转换为 SQL 语句。生成的 SQL 语句与模型相关联。
所有 PHQL 语句都会被解析一次并缓存在内存中。如果执行相同的语句结果,将有助于提高性能。
Phalcon - 数据库迁移
数据库迁移很重要,原因如下:
数据库迁移有助于在指定存储类型之间传输数据。
数据库迁移是指基于 Web 的应用程序从一个平台迁移到另一个平台的环境。
此过程通常是为了跟踪过时的数据。
Phalcon 按以下方式执行数据库迁移过程 -
步骤 1 -在xampp/wamp目录中创建一个名为“dbProject”的项目。
步骤 2 - 使用适当的数据库连接配置项目。
<?php
/*
* Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config(['database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'demodb',
'charset' => 'utf8', ],
'application' => [ 'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH .
'/controllers/', 'modelsDir' => APP_PATH .
'/models/', 'migrationsDir' => APP_PATH .
'/migrations/', 'viewsDir' => APP_PATH .
'/views/','pluginsDir' => APP_PATH .
'/plugins/', 'libraryDir' => APP_PATH .
'/library/', 'cacheDir' => BASE_PATH .
'/cache/', 'baseUri' => '/dbProject/',
] ]);
步骤 3 - 执行命令以迁移数据库“demodb”中包含的表。目前,它包括一张表“users”。
步骤 4 - 迁移的数据库文件存储在“app”文件夹内的迁移目录中。
这样,表就迁移成功了。
了解迁移文件的剖析
迁移的文件有一个独特的类,它扩展了Phalcon\Mvc\Model\Migration类。Phalcon 中的 Migration 类包括up()和down()方法。up ()方法用于执行迁移,而 down 方法则回滚操作。
用户.php
<?php
use Phalcon\Db\Column;
use Phalcon\Db\Index;
use Phalcon\Db\Reference;
use Phalcon\Mvc\Model\Migration;
/**
* Class UserMigration_100
*/
class UserMigration_100 extends Migration {
/**
* Define the table structure
*
* @return void
*/
public function morph() {
$this->morphTable('user', [
'columns' => [
new Column( 'Id', [
'type' => Column::TYPE_INTEGER,
'notNull' => true,
'autoIncrement' => true,
'size' => 11, 'first' => true ] ),
new Column( 'username', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'Id' ] ),
new Column( 'email', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'username' ] ),
new Column( 'password', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 10,
'after' => 'email' ] )
],
'indexes' => [new Index('PRIMARY', ['Id'], 'PRIMARY') ],
'options' => [ 'TABLE_TYPE' => 'BASE TABLE',
'AUTO_INCREMENT' => '3', 'ENGINE' => 'InnoDB',
'TABLE_COLLATION' => 'latin1_swedish_ci' ],
] );
}
/**
* Run the migrations
* * @return void
*/
public function up() {
}
/**
* Reverse the migrations
*
* @return void
*/
public function down() {
}
}
如上例所示,类UserMigration_100包含具有四个部分的关联数组,它们是 -
列- 包括一组表列。
索引- 包括一组表索引。
引用- 包括所有引用完整性约束(外键)。
选项- 具有一组表创建选项的数组。
如上例所示,1.0.0 版本的数据库已成功迁移。Phalcon 可能包含并运行多个迁移过程,具体取决于数据库内容的保存方式。
Phalcon - Cookie 管理
Cookie 也称为浏览器 cookie,是存储在浏览器中的小文本文件。它保存了与用户身份相关的所有信息。该信息用于在用户浏览不同页面时验证用户。
有两种不同类型的 Cookie -
会话 Cookie - 这些类型的 Cookie 保留在浏览器上并保留信息,直到浏览器关闭。一旦打开浏览器,它将被视为同一用户的新会话。
持久性 Cookie - 它具有规定的寿命,并在给定的寿命内保留在浏览器中。那些使用持久性 Cookie 的网站会跟踪每个用户,即使浏览器已被用户关闭。
现在让我们讨论 cookie 在 Phalcon 中的工作原理。
Phalcon 的cookie
Phalcon 使用Phalcon\Http\Response\Cookies作为 cookie 的全局存储。向服务器发送请求时,Cookie 存储在 Phalcon 中。
以下是设置 Cookie 的语法 -
$this->cookies->set( "<cookie-name>", "<cookie-value>", time );
考虑以下示例。使用以下代码,当用户登录网络应用程序时,我们将创建用户的 cookie。
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
if ($this->cookies->has("login-action")) {
// Get the cookie
$loginCookie = $this->cookies->get("login-action");
// Get the cookie's value
$value = $loginCookie->getValue();
echo($value);
}
$this->cookies->set(
"login-action",
"abc",
time() + 15 * 86400
);
}
}
加密的 cookie 将显示为输出。
描述
已创建名为“loginAction”的 Cookie ,其值为“abc”。
“indexAction”方法检查cookie是否存在并打印相应的值。
Cookie 的加密
Phalcon 中的 Cookie 在作为请求发送到服务器之前会进行加密,并在我们从服务器收到适当的响应后立即解密。这确保了授权用户的安全。
尽管具有加密和解密功能,但始终建议避免在 cookie 中存储敏感数据。cookie 加密的配置包含在services.php文件中。
/**
* Enable encryption key for setting values of cookies
*/
$di->set(
"cookies", function () {
$cookies = new Cookies();
$cookies->useEncryption(false);
return $cookies;
}
);
/**
* Set encryption key
*/
$di->set(
"crypt", function () {
$crypt = new Crypt();
$crypt->setKey('AED@!sft56$'); // Use a unique Key!
return $crypt;
}
);
注意-
始终建议在向服务器发送 cookie 时使用加密。
如果不使用加密,所有内部应用程序都将暴露给攻击者。
还建议在 cookie 中存储小数据和文字。
Phalcon - 会话管理
会话是服务器端信息存储,有助于用户与网站或 Web 应用程序交互。每个会话都使用唯一的会话 ID 进行定义,每当浏览器发出 HTTP 请求时,该会话 ID 就会传递到 Web 服务器。会话 ID 每次都会与内部数据库配对,以便检索所有存储的变量。
Phalcon 会议
Phalcon 使用会话组件(包括包装器)来访问会话数据。
以下是 Phalcon 的功能 -
会话数据可以与同一域上的其他组件隔离。
根据应用程序的需要,可以借助会话适配器来更改会话值。
在 Phalcon 中启动会话
所有会话活动都与适配器文件相关联,这些适配器文件在Web 应用程序的/config文件夹内的Services.php文件中声明。
/**
* Start the session the first time some component requests the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});
创建会话
步骤 1 - 创建一个会话控制器来实例化会话,以便可以适当地检索数据。
步骤 2 - 创建一个具有名称和值的会话。
<?php
class SessionController extends \Phalcon\Mvc\Controller {
public function indexAction() {
//Define a session variable
$this->session->set("user-name", "Omkar");
//Check if the variable is defined
if ($this->session->has("user-name")) {
//Retrieve its value
$name = $this->session->get("user-name");
echo($name);
}
}
}
上面的代码产生以下输出。
删除会话
可以在 Phalcon 中销毁会话或取消设置会话中的某些变量值。
以下是在会话中取消设置变量值的语法。
$this->session->remove(<variable-name>);
如上例所示,会话中创建的变量名称是“data-content”,可以使用以下代码将其删除。
public function removeAction() {
// Remove a session variable with associated session
$this->session->remove("data-content");
}
;
以下是销毁整个会话的语法。
$this->session->destroy();
Phalcon - 多语言支持
Phalcon 包含一个组件Phalcon\Translate,它提供多语言支持,对于创建可以翻译成多种语言的网页非常有帮助。
它包括一个适配器,有助于绑定数组并协助读取翻译消息。
例子
让我们在 Phalcon 中的翻译组件的帮助下创建一个输出,这将有助于按照建议的语言显示输出。
步骤 1 - Phalcon 为每个开发人员提供组织翻译字符串的自由。考虑保留两个不同的文件,即:en.php(对于英语字符串)和fr.php(对于法语字符串)。
该文件将包含一个键值对数组,其中键是唯一的,值将根据所需的翻译而有所不同。
php
<?php // app/messages/en.php $messagesContent = [ "bye" => "Good Bye", "hi-name" => "Hello %name%", "song" => "Your favorite song is %song%", ];
fr.php
<?php // app/messages/fr.php $messagesContent = [ "bye" => "Au revoir", "hello-name" => "Bonjour %name%", "song" => "Votre chanson préférée est %song%", ];
步骤 2 - 在应用程序中,创建一个UserController,它将采用有关哪个文件应用于翻译的参数。
<?php
use Phalcon\Translate\Adapter\NativeArray;
class UserController extends \Phalcon\Mvc\Controller {
protected function getMessageTransalation() {
// Ask for the best language
// Display the output in desired language
require "en.php";
// Return a translation object
return new NativeArray( ["content" => $messagesContent,]);
}
public function indexAction() {
$this->view->name = "Radhika";
$this->view->song= "Ton sourire m'ensorcelle Je suis fou de toi Le désir coule dans mes veines Guidé par ta voix";
$this->view->t = $this->getMessageTransalation();
}
}
对于默认方法,采用两个参数,第一个是名称,第二个是用户最喜欢的歌曲。稍后,调用函数getMessageTranslation返回所需的输出。
现在,我们想要英语的输出。
步骤 3 - 关联的代码视图 demo\app\views\User\index.volt将包含以下代码 -
<p><?php echo $t->_("hello-name", ["name" => $name]); ?></p>
<p><?php echo $t->_("song", ["song" => $song]); ?></p>
如果我们希望完整的输出以法语显示,我们只需要更改文件名即可。
require "fr.php";
以下是法语的输出。
Phalcon - 资产管理
资产都是关于 Phalcon 现有框架之外的附加组件。Phalcon 有一个资产管理器,可以帮助管理所有资产组件,例如 CSS 或 JS 文件。
常用的方法是 -
| 方法 | 重要性 |
|---|---|
| __construct(变量$选项) | 初始化组件 Phalcon\Assets\Manager |
| addCss(字符串$path,变量$local,变量$filter,变量$attributes) | 将 CSS 资源从“css”集合添加到特定视图 |
| addJs(字符串$path,变量$local,变量$filter,变量$attributes) | 将 JavaScript 资源添加到“js”集合中 |
例子
考虑一下 Phalcon “vokuro”的示例项目,它是添加css文件的最佳说明。它将包括用于调用所有css文件的资产/管理器。
项目的默认控制器将调用所有css文件。