文件结构

Phalcon不会强制要求应用程序的开发遵循特定的文件结构。因为它是松散耦合的,你可以实现Phalcon驱动的应用程序,以及使用对你来说最舒服的文件结构。

本教程的目的以此为起点,我们建议使用以下结构:

tutorial/

app/

controllers/

models/

views/

public/

css/

img/

js/

优美的 URL(Beautiful URLs)¶

在本教程中,我们将使用相当(友好)URL。友好的URL不但利于SEO而且便于用户记忆。Phalcon支持一些最流行的Web服务器提供重写模块。让你的应用程序的URL友好不是必要的,没有它们你可以同样轻松地开发。

在这个例子中,我们将使用Apache的重写模块。 让我们在 /tutorial/.htaccess 文件中创建几个重写规则:

#/tutorial/.htaccess

RewriteEngine on

RewriteRule ^$ public/ [L]

RewriteRule ((?s).*) public/$1 [L]

对该项目的所有请求都将被重定向到为public/文档根目录。此步骤可确保内部项目的文件夹仍然对公共访客隐藏,从而消除了一些安全威胁。

第二组规则将检查是否存在所请求的文件,如果存在所要请求的文件,就不需要Web服务器模块来重写:

#/tutorial/public/.htaccess

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]

引导程序(Bootstrap)¶

你需要创建的第一个文件是引导文件。这个文件很重要; 因为它作为你的应用程序的基础,用它来控制应用程序的各个方面。 在这个文件中,你可以实现组件的初始化和应用程序的行为。

这个引导文件 tutorial/public/index.php 文件基本内容如下:

try {

// Register an autoloader

$loader = new Phalcon\Loader();

$loader->registerDirs(array(

'../app/controllers/',

'../app/models/'

))->register();

// Create a DI

$di = new Phalcon\DIFactoryDefault();

// Setup the view component

$di->set('view', function () {

$view = new Phalcon\Mvc\View();

$view->setViewsDir('../app/views/');

return $view;

});

// Setup a base URI so that all generated URIs include the "tutorial" folder

$di->set('url', function () {

$url = new Phalcon\Mvc\Url();

$url->setBaseUri('/tutorial/');

return $url;

});

// Handle the request

$application = new Phalcon\Mvc\Application($di);

echo $application->handle()->getContent();

} catch (\Exception $e) {

echo "Exception: ", $e->getMessage();

}

自动加载

我们可以看出,引导程序的第一部分是注册一个自动加载器。在这个应用程序里,它将用于加载控制器和模型类。例如,我们可以为控制器注册一个或多个目录来增加应用程序的灵活性的。在我们的例子中,我们使用了 Phalcon\Loader 组件。

有了它,我们可以加载使用各种策略类,但在这个例子中,我们选择了在预定义的目录中查找类:

use Phalcon\Loader;

// ...

$loader = new Loader();

$loader->registerDirs(

array(

'../app/controllers/',

'../app/models/'

)

)->register();

依赖管理

在使用Phalcon时必须理解的一个非常重要的概念是 依赖注入容器(dependency injection container). 这听起来复杂,但实际上非常简单实用。

服务容器是一个全局存储的将要被使用的应用程序功能包。每次框架需要的一个组件时,会请求这个使用协定好名称的服务容器。因为Phalcon是一个高度解耦的框架, Phalcon\Di 作为黏合剂,促使不同组件的集成,以一个透明的方式实现他们一起进行工作。

use Phalcon\DI\FactoryDefault;

// ...

// Create a DI

$di = new FactoryDefault();

Phalcon\Di\FactoryDefault 是 Phalcon\Di 的一个变体。为了让事情变得更容易,它已注册了Phalcon的大多数组件。 因此,我们不需要一个一个注册这些组件。在以后更换工厂服务的时候也不会有什么问题。

在接下来的部分,我们注册了“视图(view)”服务,指示框架将去指定的目录寻找视图文件。由于视图并非PHP类,它们不能被自动加载器加载。

服务可以通过多种方式进行登记,但在我们的教程中,我们将使用一个匿名函数 anonymous function:

use Phalcon\Mvc\View;

// ...

// Setup the view component

$di->set('view', function () {

$view = new View();

$view->setViewsDir('../app/views/');

return $view;

});

接下来,我们注册一个基础URI,这样通过Phalcon生成包括我们之前设置的“tutorial”文件夹在内的所有的URI。 我们使用类 Phalcon\Tag 生成超链接,这将在本教程后续部分很重要。

use Phalcon\Mvc\Url as UrlProvider;

// ...

// Setup a base URI so that all generated URIs include the "tutorial" folder

$di->set('url', function () {

$url = new UrlProvider();

$url->setBaseUri('/tutorial/');

return $url;

});

在这个文件的最后部分,我们发现 Phalcon\Mvc\Application。其目的是初始化请求环境,并接收路由到来的请求,接着分发任何发现的动作;收集所有的响应,并在过程完成后返回它们。

use Phalcon\Mvc\Application;

// ...

$application = new Application($di);

echo $application->handle()->getContent();

正如你所看到的,引导文件很短,我们并不需要引入任何其他文件。在不到30行的代码里,我们已经为自己设定一个灵活的MVC应用程序。

创建控制器

默认情况下Phalcon会寻找一个名为“Index”的控制器。当请求中没有控制器或动作时,则使用“Index”控制器作为起点。这个“Index”控制器 (app/controllers/IndexController.php) 看起来类似:

use Phalcon\Mvc\Controller;

class IndexController extends Controller

{

public function indexAction()

{

echo "

Hello!

";

}

}

该控制器类必须有“Controller”后缀,且控制器动作必须有“Action”后缀。

输出到视图

从控制器发送输出到屏幕上有时是必要的,但是在MVC社区,大多数纯粹主义者证明这样做不可取。一切必须传递给视图,视图负责在屏幕上输出数据。Phalcon将在最后执行的控制器的同名目录中,查找最后执行的动作的同名的视图。在我们的例子 (app/views/index/index.phtml) :

<?php echo "

Hello!";

我们的控制器 (app/controllers/IndexController.php) 现在定义了一个空的动作:

use Phalcon\Mvc\Controller;

class IndexController extends Controller

{

public function indexAction()

{

}

}

浏览器输出应该保持不变。当这个动作已经执行结束 Phalcon\Mvc\View 静态组件会自动创建。

学习更多关于 视图使用教程 。

设计注册表单

现在我们将改变index.phtml视图文件,添加一个链接到一个名为“signup”的新控制器。我们的目标是在应用程序中允许用户注册。

echo "

Hello!

";

echo $this->tag->linkTo("signup", "Sign Up Here!");

生成的HTML代码显示一个锚 (“a”) HTML标签链接到一个新的控制器:

Hello!

Sign Up Here!

我们使用类 Phalcon\Tag 去生成标记。 这是一个让我们构建HTML标记的实用类。 关于生成HTML更详细的文章可以查看 视图助手

这是一个注册控制器 (app/controllers/SignupController.php):

use Phalcon\Mvc\Controller;

class SignupController extends Controller

{

public function indexAction()

{

}

}

这个空index动作整洁的传递了表单定义给一个视图 (app/views/signup/index.phtml):

Sign up using this form

<?php echo $this->tag->form("signup/register"); ?>

Name

<?php echo $this->tag->textField("name") ?>

E-Mail

<?php echo $this->tag->textField("email") ?>

<?php echo $this->tag->submitButton("Register") ?>

phalcon 自动加载_创建 Phalcon7 项目相关推荐

  1. java中项目启动时加载_如何在项目启动时,加载或解析某配置文件

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  2. mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?

    原文链接:https://www.cnblogs.com/homejim/p/8076481.html 在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加 ...

  3. vue路由懒加载_优化vue项目的首屏加载速度

    最近使用vue-cli3构建了一个小型的博客系统,完工之后,build打包出来发现一个chunk-vendors包就有1.1m,部署上去之后,访问的时候,首屏加载非常慢.居然需要21s,体验极差. 这 ...

  4. thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了

    想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...

  5. phper必知必会之类库自动加载的七种方式(三)

    ## php自动加载 下面显示例子的文件目录结构图 一.没有使用命名空间的几种实现 test/oneClass.php class oneClass{public function show(){ec ...

  6. [PHP] 项目实践中的自动加载实现

    1.使用spl_autoload_register函数注册一个自己定义的自动加载函数 2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中 3.兼容了两种 ...

  7. ubuntu linux开机启动自动加载ko驱动程序_一文讲透 CentOS 开机流程

    一.Linux开机流程: BIOS: (Basic Input Output System)基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片 上的程序,保存着计算机最重要的基本输入输出的程 ...

  8. SpringBoot项目中自动加载datasourceConfig配置导致启动失败

    在自己学习搭建SpringBoot的项目中并没有使用到数据库,但在启动的时候报没有找到数据源,网上查了一下发现原因是SpringBoot项目启动时会自动加载datasourceConfig配置 经过尝 ...

  9. Eclipse下Tomcat自动加载web项目,无需重启了

    Eclipse下Tomcat自动加载web项目,无需重启了 1.双击打开Tomcat Overview文件 2.点击Moduls 3.首先点Add External Web Module按钮弹出对话框 ...

  10. 天正lisp文件夹_天正启动时加载那些lisp_怎么在启动CAD时自动加载Lisp的工具和插件...

    怎么在启动 CAD 时自动加载 Lisp 的工具和插件 网上有很多非常有用的 CAD 插件, 能给绘图带来很多便利. 这些 工具手动加载后就可以执行, 但每次用的时候都要加载挺麻烦的, 能 不能在启动 ...

最新文章

  1. 域名买了,DNS解析怎么选?一键按需定制解析服务不是梦!
  2. leetcode算法题--删除一次得到子数组最大和★
  3. 数据集干货:一文读懂Mapsidejoin
  4. 科大星云诗社动态20210411
  5. html5 打印api,HTML5的API(一)
  6. 异常规范之阿里巴巴开发手册中的异常规范讲解
  7. c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...
  8. Best Practices for AWS Security Using CloudCheckr
  9. bzoj 3884: 上帝与集合的正确用法(欧拉函数)
  10. android space边框,Android中的图片视图的边框?
  11. mac卸载python3.8_如何使用Homebrew在Mac上默认设置Python3.8?
  12. C语言练习题~分数求和
  13. bootice添加黑苹果引导_Clover Configurator黑苹果 Clover 引导配置工具
  14. 2020最新版本js车牌号检验规则
  15. 【数学建模】预测模型——多元回归分析 SPSS实现
  16. 【网络】TCP报文头部
  17. C#全局钩子参考文章
  18. html个人所得税计算器,个税计算器2021 - 个人所得税计算器2021 -
  19. matlab:已知传递函数,求单位阶跃响应
  20. 如何使用DD-WRT增强Wi-Fi网络信号并增加范围

热门文章

  1. Power BI中使用图片作为切片器
  2. 数加平台协助汇合营销快速行动,捕获转瞬即逝的商机。
  3. 机器学习——决策树算法之代码+数学实例解析
  4. css3(属性选择器,结构伪类选择器,伪元素选择器 ,css3盒子模型,滤镜filter, cale, 过渡transition))
  5. VScode窗口保持
  6. 【Hadoop实训】统计文件中所有单词的平均长度
  7. STM32工具使用---STM32CubeProgrammer更新固件
  8. Kali离线安装Nessus及过程中可能遇到的问题解决方案
  9. 网页显示不正常怎么修复
  10. 2018校园招聘笔经面经合集:算法,机器学习,大数据方向