zend framework里在某个控制器的某个action中怎么调用其他控制器的某个方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zend framework里在某个控制器的某个action中怎么调用其他控制器的某个方法?相关的知识,希望对你有一定的参考价值。
比如:在index控制器里有如下方法
class IndexController extends Zend_Controller_Action
function indexAction()
$m1 = $this->m1();
$m2 = $this->m2();
$this->view->m1 = $m1;
$this->view->m2 = $m2;
function m1()
$result = array();
查询数据库将结果写进$result
return $result;
function m2()
$result = array();
查询数据库将结果写进$result
return $result;
其中m1和m2方法分别获取首页要显示内容的一部分,比如m1获取导航条,m2获取其他数据
现在另外一个news控制器中的indexAction方法也要显示导航条,就是需要调用index控制器里的m1方法,应该怎么写?
class NewsController extends Zend_Controller_Action
function indexAction()
$m1 = 这里要调用index控制器的m1方法,怎么写代码?
$this->view->m1 = $m1;
当然,这里导航条只是打个比方,实际不是显示导航条。要显示导航条Zend Framework有专门的组件可以做,没必要这么做。
一个简单的解决方法是把m1方法复制到news控制器里,再像indexAction同样的方法调用,这样代码就重复了,降低了代码复用性。有什么方法能直接调用吗?使用actionStack助手的话,它只能调用以Action结尾的方法。我要调的方法不是Action结尾的。
$c = new ControllerName($this->getRequest(), $this->getResponse());
然后$c->functionName()就行了。
但是,对于action使用actionStack更好,不是action的话,亲,我建议你把它移到M层中。 参考技术A 1、如果IndexController这一个类有调用的话,并且m1是独立方法可以使用 IndexController::m1();
2、改成继承:
class NewsController extends IndexController //这里可以改成继承IndexController 这一个类
function indexAction()
$m1 = $this->m1;//跟调用本类方法一样,因为是继承了类
$this->view->m1 = $m1;
3、global
class IndexController extends Zend_Controller_Action
function indexAction()
global $abc;
$abc = &$this;//这里用引用,不是复制,所以不会很消耗资源
class NewsController extends Zend_Controller_Action
function indexAction()
global $abc;
$m1 =$abc->m1;//这里
$this->view->m1 = $m1;
Zend Framework 控制器加载失败之谜
【中文标题】Zend Framework 控制器加载失败之谜【英文标题】:Zend Framework controller load failure puzzle 【发布时间】:2010-01-16 18:14:16 【问题描述】:我有一个如下所示的.htaccess
文件:
SetEnv APPLICATION_ENV development
RewriteEngine On
RewriteCond %REQUEST_FILENAME -s [OR]
RewriteCond %REQUEST_FILENAME -l [OR]
RewriteCond %REQUEST_FILENAME -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
如果我浏览到我正在测试的网站,比如http://www.example.com/,则索引页面会正确加载。
这是一个 Zend Framework 应用程序,因此它应该将事情路由到我的控制器,如果我转到 http://www.example.com/index/index 或 http://www.example.com/index 时它会正确执行,分别指定控制器 + 操作和仅控制器。
如果我执行http://www.example.com/index/test 之类的操作,它也可以工作,我在索引控制器上定义了另一个名为 test 的操作。
但如果我创建一个TestController.php
文件,并尝试转到http://example.com/test/,Apache 将返回:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /path/to/website/root/public/index.php was not found on this server.</p>
<hr>
<address>Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6 PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch Phusion_Passenger/2.0.3 mod_perl/2.0.3 Perl/v5.8.8 Server at www.example.com Port 80</address>
</body></html>
谁能看到我在这里搞砸了什么?
比利3
编辑:我网站的配置类似于:
Alias /MySiteRoot/ "/usr/local/vsites/something/www/"
<Directory /usr/local/vsites/something/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
【问题讨论】:
【参考方案1】:我通常在 mod_rewrite 不工作时遇到这个问题。
如果您已启用 mod_rewrite,请在 /etc/apache2/sites-available/yoursite.com 配置文件中检查 AllowOverride 是否设置为 All。
【讨论】:
如果 mod_rewrite 不工作,为什么http://www.example.com/index/index
工作正常?为什么 /path/to/website/root/public/index.php
存在,尽管 Apache 抱怨相反?
编辑了我的问题 -- AllowOverride All 已列出 :(
有趣——如果我关闭.htaccess
中的MultiViews
选项,那么即使http://www.example.com/index/index
也无法正常工作。我怀疑此时我的 index.php 存在某种权限问题。
-rw-rw-r-- 1 颠覆颠覆 754 2010-01-16 22:09 index.php
我没有设置网络服务器。【参考方案2】:
所以如果我没看错的话,路由工作正常,但不是当你只在 url 中指定控制器时。
所以你有以下内容:
class TestController extends Zend_Controller_Action
//do you have an index action???
public function indexAction()
【讨论】:
是的,我愿意。另请注意,错误消息是由 Apache 生成的——而不是 Zend 框架。【参考方案3】:事实证明,如果您的站点不是域的根,则必须添加 RewriteBase 指令才能正确格式化。我仍然不知道为什么它事先报告了正确的文件,但它现在似乎可以工作了。
谢谢,祝你有美好的一天:)
【讨论】:
以上是关于zend framework里在某个控制器的某个action中怎么调用其他控制器的某个方法?的主要内容,如果未能解决你的问题,请参考以下文章