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

Phalcon Windows 版

步骤 2 - 下载所需的 dll 文件。检查系统的适当配置并下载所需的 dll 文件。下载文件后,将phalcon-php.dll解压到xampp文件夹中的/php/ext中。

步骤 3 - 编辑php.ini 文件中的路径,以与其他.dll文件类似的方式进行配置。

法尔康 PHP

步骤 4 - 编辑路径后,重新启动xampp/wamp堆栈。一旦正确设置了dll文件,它将在仪表板中清晰可见。

dll文件

步骤 5 - 下载软件包后,在系统属性中设置路径变量。

设置路径

步骤 6 - dll文件和 Phalcon 工具一起帮助创建项目/Web 应用程序。用户可以通过命令提示符验证Phalcon框架是否已成功安装。输出将显示如下屏幕截图所示。

Web应用程序

步骤 7 - 收到必要的输出后,使用以下命令创建一个项目 -

phalcon create-project <project-name> 

将显示以下输出。

输出

步骤 8 - Web 应用程序已成功创建。单击以下 URL - http://localhost/demo1

输出将显示如下屏幕截图所示。这是 Phalcon PHP 的欢迎页面。

欢迎页面

Phalcon - 应用程序结构

在本章中,我们将讨论 Phalcon 的应用程序结构。以下是 Phalcon 项目的完整目录结构。

结构

有一个根文件夹被视为代码库,并且可供 Web 服务器公开使用。它也称为Web 目录。Web 根目录之外的其他文件夹被认为是 Web 服务器和 Phalcon 项目无法访问的。

创建项目后,在wamp/xampp文件夹中将显示如下目录结构。考虑我们在上一章中创建的项目。

演示1

以下是该项目的文件夹和子文件夹。

应用程序

该文件夹包含所有重要的脚本文件和文件夹。完整的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的工作流程

工作流程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"; 
   } 
}

输出-

PHP框架

Phalcon - 模型

MVC架构中的模型包含应用程序的逻辑。模型是与数据库交互的核心。它应该能够根据用户的请求管理记录的更新、删除、插入和获取。

为了理解 Phalcon PHP 框架中的模型交互,应遵循以下步骤。

步骤 1 - 创建数据库。

对于任何LAMP、WAMP、XAMPP软件堆栈,借助phpmyadmin数据库工具创建数据库都非常容易。

以下是创建数据库的 SQL 查询。

create database <database-name> 

步骤 2 - 在phpmyadmin部分中,单击“数据库”选项卡,提及数据库名称,然后单击“创建”按钮,如以下屏幕截图所示。

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

演示1窗口

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> 

脚手架

Bolg-教程

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 生命周期

作为一种高级语言,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”文件夹内的迁移目录中。

用户.php

这样,表就迁移成功了。

了解迁移文件的剖析

迁移的文件有一个独特的类,它扩展了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文件。