phalcon 自动加载_创建 Phalcon7 项目
文件结构
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") ?>
<?php echo $this->tag->textField("email") ?>
<?php echo $this->tag->submitButton("Register") ?>
phalcon 自动加载_创建 Phalcon7 项目相关推荐
- java中项目启动时加载_如何在项目启动时,加载或解析某配置文件
在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...
- mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
原文链接:https://www.cnblogs.com/homejim/p/8076481.html 在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加 ...
- vue路由懒加载_优化vue项目的首屏加载速度
最近使用vue-cli3构建了一个小型的博客系统,完工之后,build打包出来发现一个chunk-vendors包就有1.1m,部署上去之后,访问的时候,首屏加载非常慢.居然需要21s,体验极差. 这 ...
- thinkphp 框架自动加载原理_这下你应该理解ThinkPHP的Loader自动加载了
想了很久终于要开始系列文章的编写了,期望是写出提升和面试都可以搞定的系列文章. 当你看到本文时,如果你发现咔咔没有编写到的面试热点问题或者技术难点,期待评论区指出,一起完善. 前言 目前再整理PHP进 ...
- phper必知必会之类库自动加载的七种方式(三)
## php自动加载 下面显示例子的文件目录结构图 一.没有使用命名空间的几种实现 test/oneClass.php class oneClass{public function show(){ec ...
- [PHP] 项目实践中的自动加载实现
1.使用spl_autoload_register函数注册一个自己定义的自动加载函数 2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中 3.兼容了两种 ...
- ubuntu linux开机启动自动加载ko驱动程序_一文讲透 CentOS 开机流程
一.Linux开机流程: BIOS: (Basic Input Output System)基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片 上的程序,保存着计算机最重要的基本输入输出的程 ...
- SpringBoot项目中自动加载datasourceConfig配置导致启动失败
在自己学习搭建SpringBoot的项目中并没有使用到数据库,但在启动的时候报没有找到数据源,网上查了一下发现原因是SpringBoot项目启动时会自动加载datasourceConfig配置 经过尝 ...
- Eclipse下Tomcat自动加载web项目,无需重启了
Eclipse下Tomcat自动加载web项目,无需重启了 1.双击打开Tomcat Overview文件 2.点击Moduls 3.首先点Add External Web Module按钮弹出对话框 ...
- 天正lisp文件夹_天正启动时加载那些lisp_怎么在启动CAD时自动加载Lisp的工具和插件...
怎么在启动 CAD 时自动加载 Lisp 的工具和插件 网上有很多非常有用的 CAD 插件, 能给绘图带来很多便利. 这些 工具手动加载后就可以执行, 但每次用的时候都要加载挺麻烦的, 能 不能在启动 ...
最新文章
- 域名买了,DNS解析怎么选?一键按需定制解析服务不是梦!
- leetcode算法题--删除一次得到子数组最大和★
- 数据集干货:一文读懂Mapsidejoin
- 科大星云诗社动态20210411
- html5 打印api,HTML5的API(一)
- 异常规范之阿里巴巴开发手册中的异常规范讲解
- c++编写算法判断二叉树是否为完全二叉树_字节面试官:连这90道LeetCode算法题都不会也来面试?...
- Best Practices for AWS Security Using CloudCheckr
- bzoj 3884: 上帝与集合的正确用法(欧拉函数)
- android space边框,Android中的图片视图的边框?
- mac卸载python3.8_如何使用Homebrew在Mac上默认设置Python3.8?
- C语言练习题~分数求和
- bootice添加黑苹果引导_Clover Configurator黑苹果 Clover 引导配置工具
- 2020最新版本js车牌号检验规则
- 【数学建模】预测模型——多元回归分析 SPSS实现
- 【网络】TCP报文头部
- C#全局钩子参考文章
- html个人所得税计算器,个税计算器2021 - 个人所得税计算器2021 -
- matlab:已知传递函数,求单位阶跃响应
- 如何使用DD-WRT增强Wi-Fi网络信号并增加范围
热门文章
- Power BI中使用图片作为切片器
- 数加平台协助汇合营销快速行动,捕获转瞬即逝的商机。
- 机器学习——决策树算法之代码+数学实例解析
- css3(属性选择器,结构伪类选择器,伪元素选择器 ,css3盒子模型,滤镜filter, cale, 过渡transition))
- VScode窗口保持
- 【Hadoop实训】统计文件中所有单词的平均长度
- STM32工具使用---STM32CubeProgrammer更新固件
- Kali离线安装Nessus及过程中可能遇到的问题解决方案
- 网页显示不正常怎么修复
- 2018校园招聘笔经面经合集:算法,机器学习,大数据方向