新足迹

 找回密码
 注册

精华好帖回顾

· 你现在过的还好吗? (2008-11-20) youyuan · 日式pizza——Okonomiyaki(お好み焼き) (2010-2-2) edith921
· 艳丽悉尼---摄影大拼盘 (2010-6-16) sinkai · 生于1978 (2009-6-9) nirvana
Advertisement
Advertisement
查看: 1684|回复: 17

请教ZEND高手一个问题 [复制链接]

发表于 2012-1-28 12:53 |显示全部楼层
此文章由 LifesoCool 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LifesoCool 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我在一个CONTROLLER里的ACTION里,从数据库里执行了一条查询,现在返回了一个ARRAY(包含我想传输的数据)。现在我要把这个ARRAY处理一下,按照新建一个URL方式传给前台的FLASH(JSON格式)。URL具体是 /controller/action/new/id/1/ ,我该如何在ACTION里新建URL呢,并且这个URL还可以传输我需要的数据。昨天GOOGLE了很久,ZEND_VIEW_HELPER_URL?还是HTTP_REQUEST???多谢各位高手给点思路
Advertisement
Advertisement

特殊贡献奖章

发表于 2012-1-28 13:42 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是要转到这个url吗?
直接用$this->redirect()

至于url能不能传数据,那应该是在你这个new的action里面做吧

发表于 2012-1-28 14:13 |显示全部楼层
此文章由 LifesoCool 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LifesoCool 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2012-1-28 12:42 发表
你是要转到这个url吗?
直接用$this->redirect()

至于url能不能传数据,那应该是在你这个new的action里面做吧


这个ACTION已经做好了,现在FLASH DESIGNER想要我做的是,他打入那个URL,就返回给他一个JSON格式的数据。
我又想了一下,兄台帮我看看这样是否可行,我在BOOTSTRAP那,从新定义ROUTE,然后把URL到一个ACTION,在那个ACTION里返回给他JSON格式的数据。

评分

参与人数 2积分 +9 收起 理由
鱼鱼有刺儿 + 5 恭喜恭喜
油花生 + 4 恭喜恭喜

查看全部评分

特殊贡献奖章

发表于 2012-1-28 16:39 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不用那么麻烦,就在这个action里输出json就可以了
你如果要纯文本显示就在你这个action里用这个
$this->_helper->viewRenderer->setNoRender();
就没有layout里的那些乱七八糟的html

发表于 2012-1-28 17:31 |显示全部楼层
此文章由 LifesoCool 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LifesoCool 所有!转贴必须注明作者、出处和本声明,并保持内容完整
KR兄,你意思是,我直接ENCODE(JSON数据)
$this->redirect(),然后把我需要的URL写到里边就可以?? 我的疑问是,在URL中 /new/id 是没有的,这样可以直接创造一个URL吗,不用ROUTER的话?

我的action名字不是new,是display. index/display/new/id/1  我想在这个ACTION里,执行数据库查询, 然后把数组分为两批传给FLASH,一个URL是   index/display/new/id/1, 一个是 index/display/old/id/1. 这里的NEW和OLD不是ACTION名字,是我想自己创造的URL参数。。我的疑问就是能否自己创造一个URL

[ 本帖最后由 LifesoCool 于 2012-1-28 16:38 编辑 ]

评分

参与人数 2积分 +9 收起 理由
鱼鱼有刺儿 + 5
油花生 + 4 我很赞同

查看全部评分

特殊贡献奖章

发表于 2012-1-28 17:47 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你这个情况我想就用这个display的action输出两个json object, 一个new,一个old
直接让对方访问action/display/id/1,输出这个2个json

你要用new或old action一定要有这两个action在index controller里,要不然就是把new/old做为参数pass给display这个action,那你就得是display/mode/new/id/1这种url
Advertisement
Advertisement

发表于 2012-1-28 17:56 |显示全部楼层
此文章由 LifesoCool 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LifesoCool 所有!转贴必须注明作者、出处和本声明,并保持内容完整
所以我想要不就改ROUTE???只要访问那个URL,我就转到一个叫NEW的ACTION里把JSON数据给过去,因为还有一个是ARRAY,所以就用getparam那个方法,根据给过来的ID,我来输出JSON的数据。ARRAY里一共10组数据

评分

参与人数 1积分 +4 收起 理由
油花生 + 4 偶对你的景仰如滔滔江水

查看全部评分

特殊贡献奖章

发表于 2012-1-28 18:28 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
是啊,我经常这样做ajax
不过最好不要把传数据的action写在index controller里面,可以新建一个datacontroller之类的,专门给数据
把那些不是用来显示,只是用来传数据action都集中一下
比如你这种情况, pass一个id和type就可以获得一串json数据
这样比较方便管理,如果要access control,在这个controller的init里做就可以了

发表于 2012-1-29 16:56 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 LifesoCool 于 2012-1-28 14:13 发表


这个ACTION已经做好了,现在FLASH DESIGNER想要我做的是,他打入那个URL,就返回给他一个JSON格式的数据。
我又想了一下,兄台帮我看看这样是否可行,我在BOOTSTRAP那,从新定义ROUTE,然后把URL到一个ACTION,在那个ACTION里返回给他JSON格式的数据。


根据你所表达的意思, 如果我没有理解错的话, 是不需要用redirect的, 不是说redirect不可以,但是这绝对不是Best Practice

你所想要实现的东西在zend里面叫做context switch

同一个url可以输出不同的结果

基本上的意思是给你个url配上不同的format参数, 比如html就给你html结果, 给json就给你返回json结果, 代码结构清晰, context switch本身就是用来做这个的

看一下ZF文档吧

另外, 提醒一下如果真的要在action里面输出json,应该使用Zend内置的json helper, 而不是使用$this->_helper->viewRenderer->setNoRender();因为你还要->disableLayout();还要echo json_encode, 实在是太累赘, 再一次, 不是不可以, 但这不是Best Practice

[ 本帖最后由 dcc82 于 2012-1-29 16:59 编辑 ]

发表于 2012-1-29 17:21 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2012-1-28 18:28 发表
是啊,我经常这样做ajax
不过最好不要把传数据的action写在index controller里面,可以新建一个datacontroller之类的,专门给数据
把那些不是用来显示,只是用来传数据action都集中一下
比如你这种情况, pass一个id和typ ...


有关access control, 比方说如果要应用zend_acl和zend_auth的时候,应该用作plugin方式, 并且应该定义在preDispatch或是routeShutdown, 因为它们的优先级要高于controller的init, 否则会产生loophole. 单独controller的init应该仅包含与此Controller相关的初始内容, 如果你的这个access control仅仅用于此controller,那没问题,不过根据ZF Best Practices还是应该写在plugin里为好

特殊贡献奖章

发表于 2012-1-30 18:05 |显示全部楼层

回复 dcc82 10# 帖子

此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你说的我完全同意,能做到best practice当然不错
关于楼主这个case是cross application的,所以flash那边很有可能需要其他的数据
相当于用一个特殊的controller做一个api来提供数据,只是举个例子,这里如果要access control跟系统本身的acl没关系,一般情况就是提供给不同的人不同的信息,用plugin来搞我觉得就太麻烦了

另外那个json helper的问题,用不用她还看个人喜好。如果用传统方法3行搞定,用框架提供的功能2行搞定,对我来说没太大分别。用框架功能还得去研究,而用其他框架的时候没有这个功能就很不爽了
Advertisement
Advertisement

发表于 2012-1-30 19:12 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kr2000 于 2012-1-30 18:05 发表
你说的我完全同意,能做到best practice当然不错
关于楼主这个case是cross application的,所以flash那边很有可能需要其他的数据
相当于用一个特殊的controller做一个api来提供数据,只是举个例子,这里如果要access control ...


晕, 写plugin怎么会麻烦啊? 写成plugin的话非常容易部署到其他项目中去的, 直接在application.ini中调用就可以了, 否则你还要copy and paste一大堆代码到controller中去
这里要更正一下哦,如果使用json helper的话,只要一行,不是两行, 既然zend提供了很多方便的功能,为什么不去用呢?
我觉得能遵循best practice是衡量一个程序员的是否熟悉该框架, 以及自身水平的一个比较重要的参考依据, 有时候应该强迫自己去做,做一两遍就记住了,否则自己很难会有什么提高
我们公司在招zend developer的时候,在面试前通常要求发送一小部分代码, 基本上就能知道这个人是不是了解zend framework了
在这里的话,既然使用了zend, 建议最好还是按zend的方式去做比较好,所以基于楼主这个情况,我认为使用context switch是最适合的, 无需另建其他controller
当然,只供楼主参考,无需强求

特殊贡献奖章

发表于 2012-1-30 20:39 |显示全部楼层

回复 dcc82 12# 帖子

此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
为什么要copy and paste一大堆代码, 我只是针对这个情况做一个data api的controller,你之前也说了,只用在这个controller的东西可以放在它的init里.access  control只是举个例子

如果数据的目的是提供给其他app的话,就没有html显示,也就不需要context switch了对吗

我没有说用json helper是错,会的话一行搞定为什么要3行.我的意思是不用也无妨,反正就3行,helper背后还不是一样调用了json_encode.如果你们公司看到不用json helper的程序猿就不要的话,我挺无语的. 我相信社区里大把的人在用setNoRender()

发表于 2012-2-17 14:29 |显示全部楼层

回复 kr2000 13# 帖子

此文章由 rainmore 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rainmore 所有!转贴必须注明作者、出处和本声明,并保持内容完整
同意,但是在php的世界里,好像你要是不copy&paste反而不正常了。我曾在我公司的version control pre-commit-hook里加了phpcpd,很快同事就抱怨了,最后phpcpd还是被移除。

说道用不用json helper。我的意见是一定要用。
首先,如果你觉的直接用json_encode话,为什么还要用framework。用framework的目的就是给项目一定的conversion。如果你不愿遵守的话,就没有必要用framework了。
其次,如果有你用的是php4的话,可是没有json_encode的,而且在php5.4,json_encode也有utf8的支持。 我的意思是你不能保证这个function将来不会变。如果用 json helper的代码的维护性就好很多了。

此外,json helper也有个瑕疵就是不会自动在header里加上content-type, text/json。我一般会写个action helper 继承于json helper来做这些。
最后,就是error controller, 如果有任何异常或错误,你不希望你的页面变成400或500的错误页面,这里就需要你error controller可以自动输json而不是错误页面。

发表于 2012-2-17 14:53 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rainmore 于 2012-2-17 14:29 发表
同意,但是在php的世界里,好像你要是不copy&paste反而不正常了。我曾在我公司的version control pre-commit-hook里加了phpcpd,很快同事就抱怨了,最后phpcpd还是被移除。

说道用不用json helper。我的意见是一定要用。
首 ...


哈哈,有意思,我们之前用的是在pre-commit hook中加了codesniffer和cmd, 感觉挺好的, 尤其是codesniffer, 感觉现在代码很干净整洁, 关键是team能不能接受吧, 然后我们ci的时候做php unittesting,成功就部署

发表于 2012-2-18 23:37 |显示全部楼层

回复 dcc82 15# 帖子

此文章由 rainmore 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rainmore 所有!转贴必须注明作者、出处和本声明,并保持内容完整
能问一下你们用什么ci吗?
Advertisement
Advertisement

发表于 2012-2-24 00:25 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rainmore 于 2012-2-18 23:37 发表
能问一下你们用什么ci吗?


我们之前一直用hudson/jenkins, 现在已经转到bamboo

发表于 2012-2-24 00:36 |显示全部楼层
此文章由 dcc82 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dcc82 所有!转贴必须注明作者、出处和本声明,并保持内容完整
说到error controller, 在development环境下面, 我们是将异常或错误直接抛到firebug/firephp当中, 看起来会比较方便一些, 可以不破坏页面显示, 我们也把firebug和zend_debug结合起来看变量信息非常直观,基本上很少再去单纯的直接print_r和var_dump这些了, 因为看起来比较费劲. 而且会影响前端的人协同工作.

[ 本帖最后由 dcc82 于 2012-2-24 00:54 编辑 ]

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部