发新话题
打印

CakePHP的一个小细节

CakePHP的一个小细节

作者:老王

每天去公司上班要在路上花费一个小时的时间(城铁,公交),下班更久,因为堵车,这样来回就是至少两个小时的时间。我用来打发时间的方法一般是发呆或者看书,以前以发呆为主,因为这个,我几次坐车做过站,最近以看书为主,每天提着一本《Web开发敏捷之道》在路上看,学到不少细节,不过坐车还是会坐过站。

---------------

转到正题上来,书里讲,RoR中做链接的时候一般不会写死,比如/controller/action,因为这样的代码可移植性不完美,更好的做法是使用link_to助手,比如:
复制内容到剪贴板
代码:
<%= link_to "title", {:controller => 'x', :action => 'y'} %>
看到这里,我会想起我在使用CakePHP的时候,对于链接,似乎一直是硬编码,习惯不好啊。

那么CakePHP里如何做比较好呢?

答案是Html助手的link方法,不过文档似乎很不详细,用法只能自己看源代码去猜,大致如下:
复制内容到剪贴板
代码:
<?php echo $html->link('title', array('plugin'=>'p', 'controller'=>'c', 'action'=>'a')); ?>
这样,就会生成一个形如/p/c/a的链接。

如果后面加参数的话(比如123),就可以这样:
复制内容到剪贴板
代码:
<?php echo $html->link('title', array('plugin'=>'p', 'controller'=>'c', 'action'=>'a', 123)); ?>
如果后面加命名参数的话(比如page:123),就可以这样:
复制内容到剪贴板
代码:
<?php echo $html->link('title', array('plugin'=>'p', 'controller'=>'c', 'action'=>'a', 'page'=>123)); ?>
具体还有其他一些需要注意的地方,这里就不多说了,想了解的自己看Router::url()方法的源代码。

BTW:几周多没关注CakePHP,发现社区出现了一些不和谐的声音,还有一个不错的CakePHP开发人员离开了核心团队,唉,以前一直以为就中国人爱搞口水战,原来老外也是一样啊,不管怎么说,希望CakePHP能发展的更好。

TOP

哈哈,这种问题老王才意识到啊。

我在 FleaPHP 里面提供了一个 url() 函数,和 link_to 功能类似,估计和 CakePHP 的 Router::url() 也一样。

基本用途都是根据应用程序的设置来生成 url,确保不管在何种环境和设置下都能产生正确的 url。
一個偽裝成白癡的天纔!

TOP

惭愧啊,以前糊涂,忽视了细节

TOP

始终感觉这种HELPER方式对HTML破坏比较大,这种方式更程序员向一些,如果综合考虑设计者以及本身HTML的美感,我认为通过类似Tapestry框架的那种给现有标签扩展属性的方法对HTML的入侵造成的破坏比较小,更加优美。而且直接打开模板页面就可以看到大致的效果。
PEAR专区欢迎你交流!

TOP

对模板页面的破坏,其实问题不是很大。
通常来说,设计师做好设计讨论通过后,就会生成页面。页面转换成模板在大多数情况下都是程序员来做的。而且设计好的页面就算要改,也不会大改,所以不能直接预览这个问题不大。

而 Tapestry 虽然很不错,但是也有一些弊端。
假设10个模板页面共享同一个区域(例如 Header),那么怎么保持10个模板这部分区域的一致呢?
最终要么是把一个模板文件拆开成几个(拆开后也没法预览了),要么是借助 Dreamweaver 这样的工具来同步修改。
一個偽裝成白癡的天纔!

TOP

而 Tapestry 虽然很不错,但是也有一些弊端。
假设10个模板页面共享同一个区域(例如 Header),那么怎么保持10个模板这部分区域的一致呢?
最终要么是把一个模板文件拆开成几个(拆开后也没法预览了),要么是借助 Dreamweaver 这样的工具来同步修改。

在Tapestry里边,这种需要提出来的区域通常被作为一个组件。
假如是一个<div>Element</div>这样的区域,在模板里边的写法就是
<div jwcid="element">Element</div>,于是乎最终程序解析的时候会用<div>dynamic</div>进行替换。达到此目的。因此模板还是比较fiendly,甚至说设计者可以直接对模板进行改进。目前经历的实际项目中,如果是企业网站性质那么确实如廖兄所说在模板成型,客户认可都修改就很少了。但是遇到长期维护运营的项目中,策划会要求定期的对版面进行一定层度的改进,在这种时候模板修改频度就会比较高,因此我认为Tapestry的这种扩展原有标签属性的方式比传统Helper更河蟹。嘿嘿
PEAR专区欢迎你交流!

TOP

写错了个单词,friendly... ;)
PEAR专区欢迎你交流!

TOP

呵呵,这种是基本套路了。然而大部分没有考虑分布式,所以对分布式系统来说用处不大。针对分布式的设计需要一个数组配置,和应用逻辑层面的指派。。
帮助像偶一样的菜鸟

TOP

$form 中的 action 和 controller::redirect, controller::flash 涉及到链接的地方都可以写成这种数组的形式。
用smarty的话,我就写一个function url($params){}调用的时候根据参数不同,返回地址。到最后这个函数里的case 'xxx',会很多。其实也可以做个hash之类的。这个在调试的时候比较方便。比如正式发布的时候目录结构变了,对应链接也改变,只需改这一个地方。
当然环境不同,造成链接格式不同,也可以通过mod_rewrite来解决。

TOP

其实我觉得这个和实现多语言那个比较类似,输出最终语言字符串的时候,不直接写。__('edit'),配置了中文语言文件就会得到'编辑'这样的结果。这样的好处就是将来修改很方便。比如,觉得这个翻译不爽,直接改语言配置文件就可以了。就像是觉得链接格式不爽,也可以方便的修改。道理都差不多,就是把分散的重复的东西集中起来,这样的好处就是管理起来比较方便。

TOP

发新话题