第4章-页面创建的基础知识
奇怪的是,程序员在学习新语言或框架时遵循的第一个教程是在屏幕上显示“Hello, world!”的教程。把计算机想象成可以欢迎全世界的东西是很奇怪的,因为迄今为止,人工智能领域的每一次尝试都导致了糟糕的对话能力。但是syob娱乐下载mfony并不比其他程序更笨,证明就是,你可以创建一个页面,上面写着“你好,<你的名字在这里>
“带着它。< / p >
本章将教你如何创建模块,这是一个对页面进行分组的结构元素。您还将学习如何创建页面,由于采用MVC模式,页面被分为动作和模板。链接和表单是基本的网络交互;您将看到如何在模板中插入它们并在操作中处理它们。< / p >
创建模块骨架
正如第2章所解释的,symfony将页面分组为模ob娱乐下载块。在创建页面之前,您需要创建一个模块,该模块最初是一个空shell,具有symfony可以识别的文件结构。ob娱乐下载< / p >
symfob娱乐下载ony命令行自动创建模块。你只需要打电话给生成:模块
使用应用程序名称和模块名称作为参数初始化。在前一章中,您创建了一个前端
应用程序。要添加内容
模块,输入以下命令:< / p >
cd ~ / myproject php syob娱乐下载mfony生成:美元模块前端内容> > dir + ~ / myproject /应用程序/前端/模块/内容/行动> >文件+ ~ / myproject /应用程序/前端/模块/内容/行动/ actions.class.php > > dir + ~ / myproject /应用程序/前端/模块/内容/模板> >文件+ ~ / myproject /应用程序/前端/模块/内容/模板/ indexSuccess.php > >文件+ ~ / myproject /测试/功能/前端/ contentActionsTest.php > >标记~ / myproject /测试/功能/前端/ contentActionsTest.php > >标记~/myproject/apps/frontend/modules/content/actions/actions.class.php >> token ~/myproject/apps/frontend/modules/content/templates/indexSuccess.php
除了行为/
,模板/
目录,这个命令只创建了三个文件。那个在测试/
文件夹是关于功能测试的,在第15章之前你不需要担心它。的actions.class.php
(如清单4-1所示)转发到默认的模块祝贺页面。的模板/ indexSuccess.php
文件为空。< / p >
清单4-1 -默认生成的动作,在行动/ actions.class.php
<?php类contentActions扩展sfActions{公共函数executeIndex(){这个美元->向前(“默认”,“模块”);}}
请注意< / p >
如果你看一个实际的actions.class.php
文件中,您会发现不止这几行,还包括许多注释。这是因为symfony建议使用Pob娱乐下载HP注释来记录项目,并准备每个类文件与< a href ="http://www.phpdoc.org/">phpDocumentor工具.< / p >
对于每个新模块,symfony都会创建一个ob娱乐下载默认的模块指数
行动。它由一个名为executeIndex
一个模板文件叫做indexSuccess.php
.的意义执行
前缀和成功
后缀将分别在第6章和第7章解释。同时,您可以认为这种命名是一种约定。通过以下URL可以看到相应的页面(如图4-1所示):< / p >
http://localhost/frontend_dev.php/content/index
默认的指数
操作将在本章中不使用,因此您可以删除executeIndex ()
方法。actions.class.php
文件,并删除indexSuccess.php
文件来自模板/
目录中。< / p >
请注意< / p >
ob娱乐下载Symfony提供了除命令行之外的其他方法来初始化模块。其中之一是自己创建目录和文件。在许多情况下,模块的操作和模板意味着操作给定表的数据。由于从表中创建、检索、更新和删除记录所需的代码通常是相同的,因此symfony提供了一种机制来为您生成这些代码。ob娱乐下载< / p >
图4-1 -默认生成的索引页面< / p >
添加页面
在syob娱乐下载mfony中,页面背后的逻辑存储在操作中,而表示则存储在模板中。没有逻辑的页面(仍然)需要一个空操作。< / p >
添加动作
“Hello, world!”页面将通过显示
行动。要创建它,只需添加一个executeShow
方法。contentActions
类,如清单4-2所示。< / p >
清单4-2 -添加一个动作就像给动作类添加一个Execute方法< / p >
<?php类contentActions扩展sfActions{公共函数executeShow(){}}
动作方法的名称总是executeXxx ()
,其中名称的第二部分是动作名,第一个字母大写。< / p >
现在,如果你请求下面的URL:< / p >
http://localhost/frontend_dev.php/content/show
ob娱乐下载Symfony会抱怨showSuccess.php
模板缺失。这是正常的;在syob娱乐下载mfony中,页面总是由动作和模板组成。< / p >
谨慎< / p >
url(不是域名)是区分大小写的,symfony也是如此(即使在PHP中方法名是不区分大小写的)。ob娱乐下载这意味着如果您调用symfonyob娱乐下载将返回404错误显示
使用浏览器。< / p >
侧边栏< / p >
url是响应的一部分< / p >
ob娱乐下载Symfony包含一个路由系统,它允许您在实际操作名称和调用它所需的URL形式之间完全分离。这允许自定义URL格式,就像它是响应的一部分一样。您不再受到文件结构或请求参数的限制;动作的URL可以看起来像你想要的短语。例如,调用名为article的模块的索引动作通常是这样的:< / p >
http://localhost/frontend_dev.php/article/index?id=123
这个URL从数据库中检索给定的文章。在本例中,它检索一篇文章(使用id = 123
),在专门讨论法国金融的欧洲部分。但是URL可以用完全不同的方式编写,只需简单地更改routing.yml
配置文件:< / p >
http://localhost/articles/europe/france/finance.html
所得到的URL不仅对搜索引擎友好,而且对用户也很重要,用户可以使用地址栏作为伪命令行来进行自定义查询,如下所示:< / p >
http://localhost/articles/tagged/finance+france+euro
ob娱乐下载Symfony知道如何为用户解析和生成智能url。路由系统自动从智能URL中剥离请求参数,并使它们对操作可用。它还格式化响应中包含的超链接,使它们看起来“聪明”。你将在第9章学到更多关于这个特性的知识。< / p >
总的来说,这意味着为应用程序的操作命名的方式不应该受到用于调用它们的URL的外观的影响,而应该受到应用程序中操作的函数的影响。动作名称解释了动作的实际作用,通常是动词不定式形式(如显示
,列表
,编辑
,等等)。操作名可以对最终用户完全不可见,所以不要犹豫使用显式的操作名(比如listByName
或showWithComments
).你将节省代码注释来解释你的动作函数,而且代码将更容易阅读。< / p >
添加模板
该操作期望模板呈现自己。模板是位于模板/
模块的目录,由动作和动作终止符命名。默认操作终止是“成功”,因此要为显示
行动是被召唤的showSuccess.php
.< / p >
模板应该只包含表示型代码,所以尽量少使用PHP代码。事实上,一个显示“Hello, world!”的页面可以有一个简单的模板,如清单4-3所示。< / p >
清单4-3 -内容/模板/ showSuccess.php
模板< / p >
< p >你好,世界!< / p >
如果需要在模板中执行一些PHP代码,应该避免使用常见的PHP语法,如清单4-4所示。相反,使用PHP替代语法编写模板,如清单4-5所示,以使代码对于非PHP程序员来说是可以理解的。不仅最终的代码将被正确地缩进,而且它还将帮助您保持复杂的PHP代码在操作中,因为只有控制语句(如果
,foreach
,而
,等等)有另一种语法。< / p >
清单4-4 -常用的PHP语法,适合操作,但不适合模板< / p >
< p >你好,世界!< / p ><?php如果(美元的测试){回声“< p > ".时间()." < / p > ";}? >
清单4-5 -替代PHP语法,适用于模板< / p >
< p >你好,世界!< / p ><?php如果(美元的测试):? >< p > < ?php回声时间();? > < / p ><?phpendif;? >
提示< / p >
一个检验模板语法是否足够可读的经验法则是,该文件不应该包含PHP回显的HTML代码或花括号。大多数时候,当打开一个<?php
,你会用? >
在同一行。< / p >
将信息从动作传递给模板
该操作的任务是执行所有复杂的计算、数据检索和测试,并为要回显或测试的模板设置变量。ob娱乐下载Symfony使操作类的属性(通过$ this - > variableName
在操作中),可以直接访问全局命名空间中的模板(通过variableName美元
).清单4-6和4-7显示了如何将信息从操作传递到模板。< / p >
清单4-6 -在Action中设置Action属性以使其对模板可用< / p >
<?php类contentActions扩展sfActions{公共函数executeShow(){今天美元=获取当前日期();这个美元->小时=今天美元[“小时”];}}
清单4-7 -模板可以直接访问Action属性< / p >
< p >你好,世界!< / p ><?php如果(美元每小时> =18):? >或者我该说晚上好?已经是了<?php回声美元每小时? >. < / p ><?phpendif;? >
注意,短开始标记的使用(<?=
,相当于<?php echo
)不推荐用于专业的web应用程序,因为您的生产web服务器可能能够理解多种脚本语言,因此会感到困惑。此外,短的开始标记不能使用默认的PHP配置,需要服务器调整才能激活。最终,当您必须处理XML和验证时,它会有不足,因为<?
在XML中有特殊的含义。< / p >
请注意< / p >
模板已经可以访问一些数据,而不需要在操作中设置任何变量。类的方法sf_request美元
,sf_params美元
,sf_response美元
,sf_user美元
对象。它们包含与当前请求、请求参数、响应和会话相关的数据。你很快就会学会如何有效地使用它们。< / p >
链接到另一个动作
您已经知道,在动作名称和用于调用它的URL之间存在完全解耦。如果你创建一个链接到更新
在清单4-8所示的模板中,它只适用于默认路由。如果稍后决定更改url的外观,则需要检查所有模板以更改超链接。< / p >
清单4-8 -超链接,经典方式< / p >
< a href =“/ frontend_dev.php /内容/更新呢?name =匿名”我从来不说我的名字
为了避免这种麻烦,您应该始终使用link_to ()
帮助程序创建到应用程序操作的超链接。如果您只想生成URL部分,则url_for ()
就是你要找的帮手。< / p >
helper是由symfony定义的PHP函数,用于模板中。ob娱乐下载它输出一些HTML代码,使用起来比自己编写实际的HTML代码要快。清单4-9演示了超链接助手的使用。< / p >
清单4-9 - Thelink_to ()
,url_for ()
助手< / p >
< p >你好,世界!< / p ><?php如果(美元每小时> =18):? >或者我该说晚上好?已经是了<?php回声美元每小时? >. < / p ><?phpendif;? ><形式方法=“职位”action =“< ?PHP echo url_for('content/update') ?> <标签为=“名称”你叫什么名字? “文本”name =“名称”id =“名称”值=""/> “提交”值=“Ok”/><?php回声link_to(“我从来不说我的名字”,的内容/更新吗?name =匿名的)? >> < /形式
生成的HTML将与前面相同,除了当您更改路由规则时,所有模板都将正确运行并相应地重新格式化url。< / p >
表单操作值得用一整个章节来描述,因为symfony提供了许多工具来简化表单操作。ob娱乐下载你将在第10章学到更多关于这些助手的知识。< / p >
的link_to ()
Helper与许多其他Helper一样,接受用于特殊选项和附加标记属性的另一个参数。清单4-10显示了一个选项参数示例和生成的HTML。option参数可以是一个关联数组,也可以是一个简单的字符串键=值
情侣之间隔着空白。< / p >
清单4-10 -大多数helper接受一个Option参数< / p >
//作为关联数组的选项参数<?php回声link_to(“我从来不说我的名字”,的内容/更新吗?name =匿名的,数组(“类”= >“special_link”,“确认”= >“你确定吗?”,“绝对”= >真正的))? >//作为字符串的选项参数<?php回声link_to(“我从来不说我的名字”,的内容/更新吗?name =匿名的,'class=special_link confirm=你确定?绝对= true”)? >//两个调用输出相同= > <一类=“special_link”onclick ="return confirm('Are you sure?');"href =“http://localhost/frontend_dev.php/content/update/name/anonymous”我从来不说我的名字
每当使用输出HTML标记的symfonob娱乐下载y帮助器时,您都可以插入额外的标记属性(例如类
属性(在清单4-10的例子中)中。您甚至可以用“快速而粗糙”的HTML 4.0方式(没有双引号)编写这些属性,symfony将以格式良好的XHTML输出它们。ob娱乐下载这也是为什么helper比HTML编写得更快的另一个原因。< / p >
请注意< / p >
因为它需要额外的解析和转换,所以字符串语法比数组语法慢一些。< / p >
像所有symfonob娱乐下载y助手一样,链接助手数量众多,有很多选项。第9章将详细描述它们。< / p >
从请求中获取信息
方法无论用户是通过表单(通常是POST请求)还是通过URL (GET请求)发送信息,都可以从操作检索相关数据getParameter ()
方法sfRequest
对象。清单4-11展示了如何在更新
的值的名字
参数。< / p >
清单4-11 -从Action中的Request参数获取数据< / p >
<?php类contentActions扩展sfActions{/ /……公共函数executeUpdate(美元的请求){这个美元->的名字=美元的请求->getParameter(“名字”);}}
为了方便起见,全部executeXxx ()
方法取电流sfRequest
对象作为它的第一个参数。< / p >
如果数据操作很简单,您甚至不需要使用操作来检索请求参数。模板可以访问一个名为sf_params美元
,该网站提供得到
方法来检索请求参数,就像getParameter ()
在行动中。< / p >
如果executeUpdate ()
是空的,清单4-12显示了updateSuccess.php
模板将检索相同的的名字
参数。< / p >
清单4-12 -直接从模板中的请求参数获取数据< / p >
< p >你好,<?php回声sf_params美元->得到(“名字”)? >< / p > !
请注意< / p >
为什么不使用$ _POST
,$ _GET
,或$ _REQUEST
变量呢?因为这样你的url会被格式化的不同(如在http://localhost/articles/europe/france/finance.html
,没有?
也不=
),通常的PHP变量将不再工作,只有路由系统将能够检索请求参数。您可能希望添加输入过滤以防止恶意代码注入,这只有在将所有请求参数保存在一个干净的参数holder中时才有可能实现。< / p >
的sf_params美元
对象比仅仅提供一个与数组等效的getter更强大。例如,如果只想测试请求参数是否存在,可以简单地使用$ sf_params - > ()
方法,而不是测试实际值get ()
如清单4-13所示。< / p >
清单4-13 -测试模板中是否存在请求参数< / p >
<?php如果(sf_params美元->有(“名字”)):? >< p >你好,<?php回声sf_params美元->得到(“名字”)? >< / p > !<?php其他的:? >你好,John Doe!< / p ><?phpendif;? >
您可能已经猜到这可以写在一行中。与symfony中的大多数getter方法一样,ob娱乐下载请求- > getParameter ()
方法在动作和sf_params - > get ()
方法(实际上,在同一个对象上调用相同的方法)接受第二个参数:如果请求形参不存在,则使用默认值。< / p >
< p >你好,<?php回声sf_params美元->得到(“名字”,“John Doe”)? >< / p > !
总结
在syob娱乐下载mfony中,页面由一个操作(方法中的方法)组成行动/ actions.class.php
文件以执行
)和模板(文件中的模板/
目录,通常以Success.php
).根据它们在应用程序中的功能,将它们分组在模块中。helper可以帮助编写模板,helper是symfony提供的返回HTML代码的函数。ob娱乐下载您需要将URL视为响应的一部分,可以根据需要进行格式化,因此在操作命名或请求参数检索中应该避免使用对URL的任何直接引用。< / p >
一旦你知道了这些基本原则,你就可以用symfony编写一个完整的web应用程序了。ob娱乐下载但是这将花费您太长的时间,因为在应用程序开发过程中,几乎您必须完成的每一项任务都通过某种symfony特性以某种方式实现……ob娱乐下载所以这本书现在还没停。< / p >
本作品在GFDL许可下获得许可。< / p >