cakePHP将不会路由到默认布局并给出[MissingActionException]错误

时间:2013-11-27 15:22:08

标签: cakephp layout controller

只有一个控制器动作,我发生了一件非常奇怪的事情。它是一个视图操作,可以按预期用于其他类似的控制器,但不会路由一个特定的控制器操作。发生了什么事:

我有一个'画廊'控制器,当我从索引动作中选择要查看的画廊时,它将带我进入'视图'动作,但不会显示在默认布局中。索引操作将正确路由到并使用默认布局,但视图操作不会。

我还有一个设置相同但没有问题的帖子控制器,所以我相信这对于如何设置画廊控制器的模型/控制器没有问题。由于默认布局适用于所有其他控制器,我不知道为什么它不适用于这个?

在尝试解决此问题时,我发现如果我将其更改为“admin”布局,则没有问题。

在错误日志中,以下是我收到的消息。很难理解为什么默认布局适用于所有其他控制器,但不适用于这一个图库视图方法:

  

2013-11-27 15:06:21错误:[MissingActionException]无法找到操作GalleriesController :: js()。

     

#0 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(104):Controller-> invokeAction(Object(CakeRequest))
  #1 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(86):Dispatcher-&gt; _invoke(Object(GalleriesController),Object(CakeRequest),Object(CakeResponse))< / p>      

2013-11-27 15:06:21错误:[MissingActionException]无法找到操作GalleriesController :: css()。

     

#0 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(104):Controller-&gt; invokeAction(Object(CakeRequest))
  #1 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(86):Dispatcher-&gt; _invoke(Object(GalleriesController),Object(CakeRequest),Object(CakeResponse))< / p>      

2013-11-27 15:06:21错误:[MissingActionException]无法找到操作GalleriesController :: img()。

     

#0 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(104):Controller-&gt; invokeAction(Object(CakeRequest))
  #1 C:\ wamp \ www \ DOMAIN-NAME-HERE \ lib \ Cake \ Routing \ Dispatcher.php(86):Dispatcher-&gt; _invoke(Object(GalleriesController),Object(CakeRequest),Object(CakeResponse))< / p>

我以前从未见过这种类型的错误消息,因为当调用任何其他控制器动作时我没有得到它,这是一个很神秘的事。

这是view方法中的内容:

    public function show($slug=null) {
    $this->layout='default';            
    if (!$slug) {
      $this->Session->setFlash(__('Invalid gallery', true));
      $this->redirect(array('action' => 'index'));
    }
    $this->set('gallery', $this->Gallery->findBySlug($slug));
}   

以下是default.ctp布局文件中的内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="">
 <title>WEBSITE TITLE</title>
<!-- Bootstrap core CSS -->
<!-- <link href="css/bootstrap.css" rel="stylesheet"> -->

<!-- Custom styles for this template -->

<link rel="stylesheet/less" href="less/bootstrap.less" media="all" />

<script src="js/less-1.4.1.min.js"></script> 
<link href="css/sticky-footer-navbar.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
  <script src="../../assets/js/html5shiv.js"></script>
  <script src="../../assets/js/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Wrap all page content here -->
<div id="wrap">
  <!-- Begin page content -->
  <div class="container">
    <?php echo $this->element('headerMain'); ?>

  <div class="row">
      <div class="col-md-3">

      <?php echo $this->element('leftNavBar'); ?>
      </div><!-- col-md-4 -->

            <?php echo $this->Session->flash(); ?>
            <?php echo $this->Session->flash('auth'); ?>
            <?php echo $content_for_layout; ?>

  </div><!-- row -->


  </div>

</div>

  <?php echo $this->element('footerMain'); ?>
<script src="js/jquery.js"></script>
<script src="js/bootstrap.min.js"></script>

视图模板的代码是:

<div class="col-md-8">

  <h2>Gallery photos</h2>
  <br />


      <ul>

    <?php foreach ($gallery ['Photo'] as $photo): ?>

       <li>  

        <?php
            echo $this->Html->image(
                $photo['imgPath'], 
                array('title' => $photo['alt_tag']), 
                array('escape' => false)
                );
        ?>

       </li>

      <?php endforeach; ?>                  
      </ul>

谢谢,保罗

1 个答案:

答案 0 :(得分:1)

试试这个,评论所有元素,看它是否有效,我唯一的线索就是调用GalleriesController :: js(),这显然不是你控制器中的一个函数。

我的第一个猜测是,在其中一个元素中,您正在对上述操作执行requestAction。我怎么定?很容易,只需在画廊控制器中添加一个虚拟功能

public function js() {
    echo "Hello World";
}