18天:过滤器
以前在symfonyob娱乐下载
昨天我们看到如何使用服务可以通过一个XML API。今天的节目将专注于过滤器,我们将说明他们使用子域名使用的创建。例如,“php.askeet.com”将只显示PHP标记问题,和任何新问题张贴在这一领域将被标记为“PHP”。我们称这个新功能“askeet宇宙”和发展它。
可配置的特性
首先,这个新功能是可选的。使用应该是一个软件,可以安装在任何配置,您可能不希望允许子域,说,一个企业内部网。
所以我们会在应用程序中添加一个新的参数配置。启用宇宙特性,必须设置在
。添加一个自定义参数,打开使用/应用程序/前端/ config / app.yml
文件并添加:
:.global:宇宙:
这个参数目前可用的所有应用程序的行为。得到它的值,使用sfConfig: get (“app_universe”)
调用。
你会发现更多的关于自定义设置配置章symfonyob娱乐下载的书。
创建一个过滤器
一个过滤器是每个动作执行前执行一段代码。这就是我们需要检查主机名在所有操作之前,在搜索领域的标记名称。
过滤器必须执行一个特殊的配置文件中声明,使用/应用程序/前端/ config / filters.yml
文件。这个文件创建默认情况下当你启动一个应用程序,它是空的。打开它并添加:
myTagFilter:类:myTagFilter
这声明一个新myTagFilter
过滤器。我们将创建一个myTagFilter.class.php
类文件的使用/应用程序/前端/ lib /
目录可用于整个前端
应用程序:
< ? php类myTagFilter扩展sfFilter{公共函数执行(filterChain美元){/ /执行这个过滤一次如果(sfConfig::得到(“app_universe”)& &这个美元- >isFirstCall()){/ /做事情}/ /执行下一个过滤器filterChain美元- >执行();}}? >
这是一个过滤器的总体结构。如果app_universe
参数没有设置在
,过滤不执行。我们希望每个请求的过滤器只执行一次(尽管会有超过一个动作要求,因为我们使用转发),我们检查- > isFirstCall ()
方法。它是真正的
只有第一次过滤器执行一个给定的请求。
一个词的filterChain
对象:所有步骤的执行一个请求(配置、前端控制器操作,视图)是一个过滤器链。自定义过滤器很早就在这个链(前一个操作的执行),并且必须不破坏链的其他步骤的执行过滤器。这就是为什么自定义过滤器必须结束$ filterChain - > execute ();
。
请注意
的sfFilter
类有一个初始化()
方法,创建时执行过滤器对象。你可以覆盖您的自定义过滤器如果你需要处理过滤器参数以你自己的方式。
从域名获得永久性标记
我们想检查主机名来检查它是否包含子域,可能是一个标签。像“www”或“使用”的标签,必须被忽略。此外,我们希望能够修改规则忽视的子域,例如如果我们使用负载平衡技术等其它域名“www1”,“www2”等等。这就是为什么我们决定把宇宙法则忽略(正则表达式)的一个参数filters.yml
配置文件:
myTagFilter:类:myTagFilter参数:host_exclude_regex: / ^ (www | askeet) /
现在是时候看一看的内容execute ()
行动的过滤器(取代了/ /做事情
评论):
/ /主机名的标签吗?美元的主机名=这个美元- >getContext()- >getRequest()- >getHost();如果(!preg_match(这个美元- >getParameter(“host_exclude_regex”),美元的主机名)& &pos美元=大小写敏感(美元的主机名,“。”)){美元的标记=标签::正常化(字符串的子串(美元的主机名,0,pos美元));/ /添加一个永久的标签定制的配置参数sfConfig::集(“app_permanent_tag”,美元的标记);/ /添加一个定制的样式表这个美元- >getContext()- >getResponse()- >addStylesheet(美元的标记);}
过滤器寻找可能永久的标签URI。如果找到一个,它被添加作为一个自定义的参数,一个定制的样式表添加到视图中。所以,例如:
/ /调用这个URI http://php.askeet.com显示PHP宇宙/ /将创建一个常数sfConfig::设置(“app_permanent_tag”、“PHP”);/ /和包括一个定制的样式表视图中的< link rel = "样式表" type = " text / css "媒体= "屏幕" href = " http://www.symfony-project.org/css/php.cssob娱乐下载 " / >
请注意
的执行一个自定义过滤器过滤器链中的早期发生,甚至早于视图解析配置,自定义样式表将显示在输出HTML文件之前另一个样式表。如果你必须覆盖风格设置的主要使用在一个定制的样式表,这些设置需要声明重要的!
。
模型修改
我们现在需要修改行为和模型方法,应考虑永久性标记。当我们想保持模型层内模型逻辑,因为重构变得非常必要,我们利用永久性标签修改的推动请求采取行动,并把它们在模型中。如果你看一下今天的发布修改的列表askeet trac,你会发现一些新创建的模型方法,调用这些方法,行动而不是做doSelect ()
自己:
答案- >getRecent()问题- >getPopularAnswers()QuestionPeer::getPopular()QuestionPeer::getRecent()QuestionTagPeer::getForUserLike()
过滤器列表根据永久性标记
当一个问题列表,标签,或者答案显示在一个使用宇宙,所有的请求都必须考虑一个新的搜索参数。在syob娱乐下载mfony中,搜索参数调用- > add ()
的方法标准
对象。
所以添加以下方法QuestionPeer
和AnswerPeer
类:
私人静态函数addPermanentTagToCriteria(美元标准){如果(sfConfig::得到(“app_permanent_tag”)){美元标准- >addJoin(自我::ID,QuestionTagPeer::QUESTION_ID标准::LEFT_JOIN);美元标准- >添加(QuestionTagPeer::NORMALIZED_TAG,sfConfig::得到(“app_permanent_tag”));美元标准- >setDistinct();}返回美元标准;}
我们现在需要寻找返回一个列表的所有模型方法在宇宙必须过滤,并添加到标准
定义以下行:
$ c= self::addPermanentTagToCriteria($ c);
例如,QuestionPeer: getHomepagePager ()
有要修改的样子:
公共静态函数getHomepagePager(美元的页面){美元寻呼机=新sfPropelPager(“问题”,sfConfig::得到(“app_pager_homepage_max”));$ c=新标准();$ c- >addDescendingOrderByColumn(自我::INTERESTED_USERS);/ /添加这一行$ c= self::addPermanentTagToCriteria($ c);美元寻呼机- >setCriteria($ c);美元寻呼机- >setPage(美元的页面);美元寻呼机- >setPeerMethod(“doSelectJoinUser”);美元寻呼机- >初始化();返回美元寻呼机;}
相同的修改必须重复很多次,在以下方法:
QuestionPeer::getHomepagePager()QuestionPeer::getPopular()QuestionPeer::getPopular()QuestionPeer::getRecentPager()QuestionPeer::getRecent()AnswerPeer::getPager()AnswerPeer::getRecentPager()AnswerPeer::getRecent()
对于复杂的请求不使用标准
对象,我们需要添加作为一个永久性的标记在哪里
语句的SQL代码。看看我们做了它QuestionTagPeer: getPopularTags ()
和QuestionTagPeer: getPopularTagsFor ()
方法askeet trac或在SVN储存库。
标记为一个问题或一个用户列表
PHP的宇宙的所有的问题与PHP的标记。但如果用户浏览问题PHP的宇宙中,PHP的标签不能显示在标签的列表,因为它是隐含的。当输出的标签列表一个问题或一个用户在一个宇宙中,永久标记必须省略。可以在循环中容易被绕过它,比如在问题- > getTags ()
方法:
公共函数getTags(){$ c=新标准();$ c- >添加(QuestionTagPeer::QUESTION_ID,这个美元- >getId());$ c- >addGroupByColumn(QuestionTagPeer::NORMALIZED_TAG);$ c- >setDistinct();$ c- >addAscendingOrderByColumn(QuestionTagPeer::NORMALIZED_TAG);美元的标记=数组();foreach(QuestionTagPeer::doSelect($ c)作为美元的标记){如果(sfConfig::得到(“app_permanent_tag”)= =美元的标记){继续;}美元的标记(]=美元的标记- >getNormalizedTag();}返回美元的标记;}
同样的技术中使用以下方法:
问题- >getTags()问题- >getPopularTags()用户- >getTagsFor()用户- >getPopularTags()
将永久性标签附加到新的问题
当问题是创建一个使用宇宙,它必须与永久标记标签除了标签用户输入的。提醒一下,问题/添加
方法,问题- > addTagsForUser ()
调用方法:
美元问题- >addTagsForUser(这个美元- >getRequestParameter(“标签”),sf_user美元- >getId());
…在哪里标签
请求参数包含用户输入的标签,由空格分隔(我们称之为“短语”)。所以我们只会永久性标签附加到这句话的第一行addTagsForUser
方法:
公共函数addTagsForUser(美元的短语,userId美元){/ /短语分割成单独的标签美元的标记=标签::splitPhrase(美元的短语。(sfConfig::得到(“app_permanent_tag”)吗?' '.sfConfig::得到(“app_permanent_tag”):”));/ /添加标签foreach(美元的标记作为美元的标记){questionTag美元=新QuestionTag();questionTag美元- >setQuestionId(这个美元- >getId());questionTag美元- >setUserId(userId美元);questionTag美元- >setTag(美元的标记);questionTag美元- >保存();}}
就是这样:如果用户没有已经包括永久性标记,它被添加到列表的标签的新问题。
服务器配置
为了使新域名可用,您必须修改您的web服务器配置。
在当地,也就是说如果你不控制使用站点的DNS,添加一个新的主机为每个新宇宙,你想添加的设置
文件在Linux系统中,或在C:\WINDOWS\system32\drivers\etc\hosts
文件在Windows系统):
127.0.0.1 php。作为keet 127.0.0.1 senseoflife.askeet 127.0.0.1 women.askeet
请注意
你需要管理员权限。
在所有情况下,您必须添加一个服务器别名(在你的虚拟主机配置httpd . conf
Apache文件):
< VirtualHost *: 80 > ServerName askeet ServerAlias *。作为keet DocumentRoot "/home/sfprojects/askeet/web" DirectoryIndex index.php Alias /sf /usr/local/lib/php/data/symfony/web/sfAllowOverride All
重新启动web服务器之后,您可以测试一个宇宙的要求,例如:
http://php.askeet/
明天见
过滤器是强大的,可以用于各种各样的东西。标记允许我们定制内容根据一个特定的主题。结合标签和过滤器帮助我们使用分割成多个宇宙,和专业的可能性使用网站(music.askeet.com, programming.askeet.com或doityourself.askeet.com)是无止境的。所有这些网站都可以削好皮的不同,因为专业网站的内容仍然出现在全球使用网站,使用最好的以社区为基础的web应用程序。欧宝体育平台怎么样宇宙是足够小,允许建立一个社区,和全球网站可以成为最好的地方寻找任何类型的问欧宝体育平台怎么样题的答案。
明天,我们将专注于性能和看看HTML缓存可以提高复杂页面的交货时间。在三天的神秘功能,仍有时间让你投票选出最好的主意。你仍然可以访问使用论坛看看如何使用网站的行为在线。
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。