【问题标题】:Requested address not found error in cakephp paginationcakephp分页中找不到请求的地址错误
【发布时间】:2014-01-12 17:36:58
【问题描述】:

我正在尝试使用 cakephp 创建分页,但它给了我找不到错误地址。 在此服务器上找不到请求的地址“/mygroup/newsfeed/page:2”。

我的日志文件中出现以下错误

Error: [MissingActionException] Action GroupsController::page:2() 
could not be found.
Exception Attributes: array (
'controller' => 'GroupsController',
'action' => 'page:2',
)

请在下面找到我的代码:

查看:

<?php if($this->params['paging']['NewsFeed']['pageCount'] > 1): ?>
<?php $this->paginator->options(array('url' => array('controller' => 'groups', 
'action'  => 'newsfeed', 'sluggroup' => $groupdata['Group']['group_slug'])));?>
<div class="paginationbiz">
     <ul>
        <li class="prevnext disablelink"><?php echo $this->paginator->prev('« Prev',array()); ?></li>
        <li><?php echo $this->paginator->numbers(); ?></li>
        <li class="prevnext"><?php echo $this->paginator->next('Next »',array()); ?></li>
    </ul>
</div>
<?php endif; ?>

routes.php

 Router::connect('/:sluggroup/:action/*', array('controller' => 'groups', 
'action' =>   'newsfeed'),array('pass' => array('sluggroup')));

控制器:

 $this->paginate = array(
            'conditions' => array('NewsFeed.group_id'=>$groupdata['Group']['id'],'NewsFeed.status'=>'A'),
            'joins' => array(
                    array(
                            'alias' => 'newslikes',
                            'table' => 'news_feed_likes',
                            'type' => 'LEFT',
                            'conditions' => array('newslikes.news_feed_id = NewsFeed.id','newslikes.user_id'=>$this->Auth->user('id'),'newslikes.status'=>'1')
                    ),


            ),
            'fields' => array('IFNULL(newslikes.user_id,0) AS likestatus','NewsFeed.id','NewsFeed.group_id','NewsFeed.posted_message','NewsFeed.event_id','NewsFeed.event_desc','NewsFeed.event_slug','NewsFeed.event_title','NewsFeed.doc_id','NewsFeed.doc_title','NewsFeed.doc_file','NewsFeed.doc_path','NewsFeed.alert_id','NewsFeed.alert_title','NewsFeed.alert_desc','NewsFeed.created','NewsFeed.user_id','NewsFeed.status','NewsFeed.newslike'
                    ,'IFNULL(newslikes.status,0) AS status'),
            'order' => array(
                    'NewsFeed.updated' => 'desc'
            ),'limit' =>10, 'page'=>1,
    );

    $this->set('newsfeed', $this->paginate( $this->NewsFeed ) );

【问题讨论】:

    标签: cakephp-2.3


    【解决方案1】:

    由于同样的问题,您有一个similar question(也没有答案)。

    你的问题是那条路线

    Router::connect('/:sluggroup/:action/*', array('controller' => 'groups', 
                    'action' =>   'newsfeed'),array('pass' => array('sluggroup')));
    

    那,我的朋友,正在杀了你。对于像 domain.url/your-controller/your-action 这样的每个 url,你很好,因为那个 url 与你的路由不匹配。 但是,对于像 domain.url/your-controller/your-action/some-parameter 这样的 url,你会得到匹配。

    domain.url/your-controller/your-action != /:sluggroup/:action/*   //ok case
    domain.url/sluggroup/action/*          == /:sluggroup/:action/*   //ok case
    
    //NOT THE MATCH THE MATCH YOU WANT
    domain.url/your-controller/your-action/params == /:sluggroup/:action/*   
    

    我看到的唯一选择是更改该路线,否则这将继续发生在您身上,不需要的匹配。现在,有两种选择……嗯,可能更多。如果获取 sluggroup 参数的 url 对应单个控制器,我们称之为“GroupsController”,你可以这样做

    Router::connect('/groups/:sluggroup/:action/*', array('controller' => 'groups', 
                    'action' =>   'newsfeed'),array('pass' => array('sluggroup')));
    

    这将匹配诸如 domain.com/groups/slug/action/etc 之类的 url,但是,它仍然会给您同一控制器的其他操作带来问题(如 domain.com/groups/edit/2)。您可以避免为每个操作添加更多网址,例如

    Router::connect('/groups/edit/*', array('controller' => 'groups', 
                    'action' =>   'edit')));
    Router::connect('/groups/edit', array('controller' => 'groups', 
                    'action' =>   'edit')));
    Router::connect('/groups/:sluggroup/:action/*', array('controller' => 'groups', 
                    'action' =>   'newsfeed'),array('pass' => array('sluggroup')));
    

    另一种选择是使用正则表达式参数使路由跳过该规则

    Router::connect('/:sluggroup/:action/*', array('controller' => 'groups', 
                    'action' =>   'newsfeed'),
                     array('pass' => array('sluggroup'),
                     array('sluggroup' => '[^(groups)]')));
    

    我不擅长正则表达式,但我的想法是你只将该路由应用于sluggroup 匹配该正则表达式的网址,否则跳过它,它将到达正确的路由。

    看起来都不是很容易维护,你不同意你的网址像 domain.com/groups/newwsfeed/slug/other-params 并保持简单吗?

    【讨论】:

    • 我已经通过使用这条路由解决了这个问题 Router::connect('/:sluggroup/newsfeed/*', array('controller' => 'groups', 'action' => 'newsfeed' ),array('pass' => array('sluggroup')));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多