phalcon笔记大全.docx
《phalcon笔记大全.docx》由会员分享,可在线阅读,更多相关《phalcon笔记大全.docx(36页珍藏版)》请在冰豆网上搜索。
phalcon笔记大全
路由执行事件
依次按以下顺序执行:
dispatch:
beforeDispatchLoop
开始循环匹配路由
dispatch:
beforeDispatch
dispatch:
beforeNotFoundAction
dispatch:
beforeExecuteRoute
beforeExecuteRoute($dispatcher)
initialize()->dispatch:
afterInitialize
执行路由到的方法
dispatch:
afterExecuteRoute
dispatch:
afterDispatch
afterExecuteRoute($dispatcher)
结束循环匹配路由
dispatch:
afterDispatchLoop
其中,以“dispatch:
”开头的均为eventManager中定义的事件名称。
“xxx(...)”这种格式的均为控制器中的方法。
控制器命名
默认调用IndexController控制器中的indexAction方法。
控制器名称需要加Controller后缀,动作名称需要加Action后缀。
控制器的首字母要大写且继承自Phalcon\Mvc\Controller。
控制器的文件名称与控制器全名完全相同并加扩展名“.php”。
视图渲染
Phalcon\Mvc\View 默认采用PHP本身作为模板引擎,此时应该以.phtml作为视图文件扩展名。
可以在控制器方法中使用$this->view->setVar("postId",$postId);来传递变量到视图,然后在视图中用php来使用此变量,比如:
phpecho$postId;?
>,setVar方法也可以通过接收关键字索引数组来一次传递多个值(类似于smarty中assign的批量赋值)。
Phalcon\Mvc\View 支持视图分层。
分层渲染
第一步、渲染模板:
视图文件目录/小写的控制器名(不含后缀)/方法名(不含后缀).phtml
并保存结果。
级别代号LEVEL_ACTION_VIEW。
可在此模板中通过调用
phpecho$this->getContent()?
>输出控制器中的输出内容(比如在控制器中使用echo输出一些内容)。
第二步、渲染模板(如果有):
视图文件目录/layouts/小写的控制器名(不含后缀).phtml
并保存结果。
级别代号LEVEL_LAYOUT。
可在此模板中通过调用
phpecho$this->getContent()?
>输出第一步的模板结果。
第三步、渲染模板(如果有):
视图文件目录/index.phtml
并保存结果。
级别代号LEVEL_MAIN_LAYOUT。
同样的,可在此模板中通过调用
phpecho$this->getContent()?
>输出第二步的模板结果。
最后保存的结果就是视图的最终结果。
可以在控制器方法中使用$this->view->setTemplateAfter('common');来在第三步之前插入一个渲染操作,比如这里渲染模板:
视图文件目录/layouts/common.phtml
渲染级别控制
可以在控制器方法中使用$this->view->setRenderLevel(View:
:
LEVEL_NO_RENDER);来关闭渲染,或者仅仅渲染某个级别$this->view->setRenderLevel(View:
:
LEVEL_ACTION_VIEW);
也可以使用$this->view->disableLevel(View:
:
LEVEL_MAIN_LAYOUT);来禁止某个级别的渲染。
可以用$this->view->pick('index/pick');选择视图:
1.如果pick方法接收到一个不包含“/”的字符串则仅仅设置LEVEL_ACTION_VIEW级视图;如果包含“/”则同时还会把第一个“/”前面的部分作为LEVEL_LAYOUT级视图,比如这里会使用“视图文件目录/layouts/index.phtml”文件
2.如果接收到一个数字索引数组,则会将编号为0的元素作为LEVEL_ACTION_VIEW级视图,将编号为1的元素作为LEVEL_LAYOUT级视图
关闭视图
如果你的控制器不在视图里产生(或没有)任何输出,你可以禁用视图组件来避免不必要的处理:
$this->view->disable();
在模板中包含局部模板
php$this->partial('shared/login');?
>
或者同时传递变量给局部模板,每一个索引最终会作为变量在局部模板中被赋值:
php
$this->partial('shared/login',array(
'var1'=>'val1',
'var2'=>'val2'
));
?
>
缓存视图
在控制器方法中的代码例子:
//Checkwhetherthecachewithkey"downloads"existsorhasexpired
if($this->view->getCache()->exists('downloads')){
//Querythelatestdownloads
$latest=Downloads:
:
find(array(
'order'=>'created_atDESC'
));
$this->view->latest=$latest;
}
//Enablethecachewiththesamekey"downloads"
$this->view->cache(array(
'service'=>'myCache',//使用自己的缓存服务,不设置时默认为viewCache
'lifetime'=>86400,//缓存时间
'key'=>'downloads'//缓存索引名
));
注册缓存服务:
php
usePhalcon\Cache\Frontend\OutputasOutputFrontend;
usePhalcon\Cache\Backend\MemcacheasMemcacheBackend;
//Settheviewscacheservice
$di->set('viewCache',function(){
//Cachedataforonedaybydefault
$frontCache=newOutputFrontend(array(
'lifetime'=>86400
));
//Memcachedconnectionsettings
$cache=newMemcacheBackend($frontCache,array(
'host'=>'localhost',
'port'=>'11211'
));
return$cache;
});
其中“Phalcon\Cache\Frontend”中包含了对前台数据的处理操作(比如数据格式编码等);
“Phalcon\Cache\Backend”中包含了对各种后台缓存引擎的操作。
使用模板引擎
∙在控制器方法中指定模板引擎:
∙//Usingmorethanonetemplateengine
∙$this->view->registerEngines(
∙array(
∙'.my-html'=>'MyTemplateAdapter',
∙'.phtml'=>'Phalcon\Mvc\View\Engine\Php'
∙)
);
方法Phalcon\Mvc\View:
:
registerEngines()接受一个包含定义模板引擎数据的数组。
每个引擎的键名是一个区别于其他引擎的拓展名。
模板文件和特定的引擎关联必须有这些扩展名。
Phalcon\Mvc\View:
:
registerEngines()会按照相关模板引擎定义的顺序来执行。
如果Phalcon\Mvc\View发现视图文件具有相同名称但扩展名不同,它只会使用第一个。
∙在注册view服务时全局指定模板引擎:
∙
php
∙usePhalcon\Mvc\View;
∙//Settinguptheviewcomponent
∙$di->set('view',function(){
∙$view=newView();
∙//Atrailingdirectoryseparatorisrequired
∙$view->setViewsDir('../app/views/');
∙$view->registerEngines(array(
∙'.my-html'='MyTemplateAdapter'//元素值可以是类名、服务名或返回模板引擎对象的匿名函数
∙));
∙return$view;
},true);
Volt视图最终会被编译成纯PHP代码
Volt模板引擎语法
3种不同含义的起始标签
1.{%...%}包裹的标签用于赋值或执行for循环、if条件判断等语句
2.{{...}}包裹的标签用于打印表达式的结果到模板
3.{#...#}包裹注释,前后标签可以处于不同行
语法详解
∙{{post.title}}相当于$post->title;
{{post.getTypes().name}}相当于$post->getTypes()->name;
∙{{post['title']}}相当于$post['title'];
∙{{post.title|e}}使用过滤器,竖线左边表达式的值将会作为过滤器的第一个参数;
{{'%.2f'|format(post.price)}}相当于执行sprintf('%.2f',$post->price);
默认过滤器列表:
Filter
Description
e
AppliesPhalcon\Escaper->escapeHtmltothevalue
escape
AppliesPhalcon\Escaper->escapeHtmltothevalue
escape_css
AppliesPhalcon\Escaper->escapeCsstothevalue
escape_js
AppliesPhalcon\Escaper->escapeJstothevalue
escape_attr
AppliesPhalcon\Escaper->escapeHtmlAttrtothevalue
trim
Appliesthe trim PHPfunctiontothevalue.Removingextraspaces
left_trim
Appliesthe ltrim PHPfunctiontothevalue.Removingextraspaces
right_trim
Appliesthe rtrim PHPfunctiontothevalue.Removingextraspaces
striptags
Appliesthe striptags PHPfunctiontothevalue.RemovingHTMLtags
slashes
Appliesthe slashes PHPfunctiontothevalue.Escapingvalues
stripslashes
Appliesthe stripslashes PHPfunctiontothevalue.Removingescapedquotes
capitalize
Capitalizesastringbyapplyingthe ucwords PHPfunctiontothevalue
lower
Changethecaseofastringtolowercase
upper
Changethecaseofastringtouppercase
length
Countsthestringlengthorhowmanyitemsareinanarrayorobject
nl2br
Changesnewlines\nbylinebreaks(
).UsesthePHPfunction nl2br
sort
SortsanarrayusingthePHPfunction asort
keys
Returnsthearraykeysusing array_keys
join
Joinsthearraypartsusingaseparator join
format
Formatsastringusing sprintf.
json_encode
Convertsavalueintoits JSON representation
json_decode
Convertsavaluefromits JSON representationtoaPHPrepresentation
abs
Appliesthe abs PHPfunctiontoavalue.
url_encode
Appliesthe urlencode PHPfunctiontothevalue
default
Setsadefaultvalueincasethattheevaluatedexpressionisempty(isnotsetorevaluatestoafalsyvalue)
convert_encoding
Convertsastringfromonecharsettoanother
∙for循环用法
基础用法:
{%forrobotinrobots%}
{{robot.name|e}}
{%endfor%}
嵌套循环:
{%forrobotinrobots%}
{%forpartinrobot.parts%}
Robot:
{{robot.name|e}}Part:
{{part.name|e}}
{%endfor%}
{%endfor%}
获取索引值
{%setnumbers=['one':
1,'two':
2,'three':
3]%}
{%forname,valueinnumbers%}
Name:
{{name}}Value:
{{value}}
{%endfor%}
用if进行筛选
{%forvalueinnumbersifvalue<2%}
Value:
{{value}}
{%endfor%}
{%forname,valueinnumbersifname!
='two'%}
Name:
{{name}}Value:
{{value}}
{%endfor%}
else、elsefor
{%forrobotinrobots%}
Robot:
{{robot.name|e}}Part:
{{part.name|e}}
{%else%}{#else也可以写成elsefor#}
Therearenorobotstoshow
{%endfor%}
可以在for结构中使用{%break%}和{%continue%}来跳出和执行下一次循环
∙if条件判断
基本用法
∙{%ifrobot.type=="cyborg"%}
∙{{robot.name|e}}
∙{%endif%}
∙
∙{%ifrobot.type=="cyborg"%}
∙{{robot.name|e}}
∙{%else%}
∙{{robot.name|e}}(notacyborg)
∙{%endif%}
∙
∙{%ifrobot.type=="cyborg"%}
∙Robotisacyborg
∙{%elseifrobot.type=="virtual"%}
∙Robotisvirtual
∙{%elseifrobot.type=="mechanical"%}
∙Robotismechanical
{%endif%}
if中可以使用的内置变量:
Variable
Description
loop.index
Thecurrentiterationoftheloop.(1indexed)
loop.index0
Thecurrentiterationoftheloop.(0indexed)
loop.revindex
Thenumberofiterationsfromtheendoftheloop(1indexed)
loop.revindex0
Thenumberofiterationsfromtheendoftheloop(0indexed)
loop.first
Trueifinthefirstiteration.
loop.last
Trueifinthelastiteration.
loop.length
Thenumberofitemstoiterate
∙赋值
o单个变量赋值:
o{%setfruits=['Apple','Banana','Orange']%}
{%setname=robot.name%}
▪多个变量赋值:
{%setfruits=['Apple','Banana','Orange'],name=robot.name,active=true%}
o支持的字面值:
字面值
说明
“thisisastring”
被单引号或双引号括起来的内容作为字符串
100.25
带小数部分的数字作为(double/float)
100
不带小数的数字作为整数(integer)
false
静态内容“false”作为布尔值中false
true
Constant“true”isthebooleantruevalue
null
Constant“null”istheNullvalue
数组可以用中括号或花括号定义
{#Othersimplearray#}
{{['Apple',1,2.5,false,null]}}
{#Multi-Dimensionalarray#}
{{[[1,2],[3,4],[5,6]]}}
{#Hash-stylearray#}
{{['first':
1,'second':
4/2,'third':
'3']}}
{%setmyArray={'Apple','Banana','Orange'}%}
{%setmyHash={'first':
1,'second':
4/2,'third':
'3'}%}
算术运算符和比较符与PHP语法中的一致,逻辑运算符为:
or,and,not
∙if中的is测试操作
内置支持的测试:
Test
Description
defined
Checksifavariableisdefined(isset)
empty
Checksifavariableisempty
even
Checksifanumericvalueiseven
odd
Checksifanumericvalueisodd
numeric
Checksifvalueisnumeric
scalar
Checksifvalueisscalar(notanarrayorobject)
iterable
Checksifavalueisiterable.Canbetraversedbya“for”statement
divisibleby
Checksifavalueisdivisiblebyothervalue
sameas
Checksifavalueisidenticaltoothervalue
type
Checksifavalueisofthespecifiedtype
∙宏定义:
∙{%-macromy_input(name,class="input-text")%}
∙{%returntext_field(name,'class':
class)%}
∙{%-endmacro%}
∙
∙{#Callthemacro#}
∙{{'
'~my_input('name')~'
'}}
{{'
'~my_input('name','input-text')~'
'}}
由以上代码可见,模板中字符串间连接符为~!
∙使用标签助手:
Method
Voltfunction
Phalcon\Tag:
:
linkTo
link_to
Phalcon\Tag:
:
textField
text_field
Phalcon\Tag:
:
passwordField
password_field
Phalcon\Tag:
:
hiddenField
hidden_field
Phalcon\Tag:
:
fileField
file_field
Phalcon\Tag:
:
checkField
check_field
Phalcon\Tag:
:
radioField
radio_field
Phalcon\Tag:
:
dateField
date_field
Phalcon\Tag:
:
emailField
email_field
Phalcon\Tag:
:
numberField
number_field