代码之家  ›  专栏  ›  技术社区  ›  thesunneversets

CakePHP路线:与MVC混为一谈

  •  0
  • thesunneversets  · 技术社区  · 16 年前

    所以我们有一个房地产相关的网站,它有控制器/动作对,比如“homes/view”、“realtors/edit”等等。从高层来看,重构网站是个好主意,这样URL现在的格式是“/realtorname/homes/view/id”,也可以是“/admin/homes/view/id”和/或“/region/…”

    作为一个CakePHP新手,我发现在routes.php中很难做到这一点。我可以这样做:

    Router::connect('/:filter/h/:id', array('controller'=>'homes','action'=>'view'));
    Router::connect('/admin/:controller/:action/:id');
    

    但是我发现id不再简单而优雅地传递给动作,现在控制器和动作不再直接跟随域。因此,问题是:

    • 我们最好还是回到子域(实现这类功能的最初方法,基于潜在虚假的SEO相关理由而放弃)?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Daniel Wright    16 年前

    你要建的路线没有什么特别的异国情调。没有确切的描述 怎样

    在讨论细节之前,我强烈建议您始终使用反向路由来构建URL(即。 $html->url(array('controller'=>'homes','action'=>'index')); $html->url('/homes/index') . 这是一个小的性能打击,最终将挽救你从一些巨大的头痛。

    让我们浏览一下您的示例路由,我将尝试解释如何在视图中构建匹配的URL,并突出显示您遇到的潜在问题。

    Router::connect('/:filter/h/:id', array('controller'=>'homes','action'=>'view'));
    

    您可以使用以下反向路径在视图中构建URL:

    $html->url( array(
        'controller'=>'homes','action'=>'view',
        'id'=>$some_id,'filter'=>$some_filter
    ));
    

    注意我已经过去了 'id' 'filter' 键,而不是只传递相应的变量。这是因为Cake按顺序处理没有键的反向路由参数。所以如果你打电话来:

    $some_filter = 'foobar';
    $some_id = 1234;
    $html->url( array('controller'=>'homes','action'=>'view',$some_id,$some_filter));
    

    您将得到以下网址:

    /1234/h/foobar
    

    这是向后的。

    HomesController::view( $filter, $id );
    

    如果希望第一个参数 HomesController::view $id ,则需要在路由定义中指定:

    // This route definition...
    Router::connect(
        '/:filter/h/:id',
        array( 'controller'=>'homes', 'action'=>'view' ),
        array(
            'pass' => array( 'id', 'filter' )
        )
    );
    // ...invokes the controller action:
    // HomesController::view( $id, $filter );
    

    这个 'pass' 第三个数组参数的元素 Router::connect 告诉Cake哪些路由参数以及以什么顺序传递给控制器操作。你可以移除 从数组中,Cake将调用以下操作:

    HomesController::view( $id );
    

    在这种情况下,蛋糕仍然可以 $filter 并将其作为 Controller::params 财产。您可以通过寻址 $this->params['filter'] .


    您提供的第二条路线是:

    Router::connect('/admin/:controller/:action/:id');
    

    'admin' . 你只需要打开 admin routing . 在你的 /app/config/core.php ,查找并取消对行的注释:

    Configure::write('Routing.admin', 'admin');
    

    这允许您使用 admin_ 前缀(例如。 admin_edit admin_publish ,等)发送到 /admin/homes/edit/1234

    $html->url( array(
        'controller'=>'homes','action'=>'edit',1234
        'admin'=>true
    ));
    

    注意 'admin'=>true 部分,通知您正在请求一个以管理员为前缀的路由。