- 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文件。