【问题标题】:Dynamic routing in CakePHPCakePHP 中的动态路由
【发布时间】:2011-08-07 09:06:50
【问题描述】:

我正在尝试为小型 CMS 设置动态路由。有正确的方法吗?我在某个地方建立了这个解决方案,但老实说我对它并不满意。 CMS 有其他内容类型,因此为每个模型定义这个对我来说似乎不合适。

$productsModel = ClassRegistry::init('Product');
$products = $productsModel->find('all');    
foreach($products as $product){
  Router::connect('/produkty/:id/'.$product['Product']['url'], array('controller' => 'products', 'action' => 'view',$product['Product']['id']));
} 

感谢您的帮助!

【问题讨论】:

    标签: php cakephp dynamic routing


    【解决方案1】:

    哎呀,

    您不需要为模型数据库中的每个条目定义路由。路线是动态的。定义路由的方法有很多种,但更简单的是将 args 传递给动作。

    routes.php

    Router::connect('/produkty/*', array('controller' => 'products', 'action' => 'view'));
    

    products_controller.php

    class ProductsController extends AppController{
        public function view($id){
             //do anything you want with your product id
        }
    }
    

    你也可以使用命名参数

    routes.php

    Router::connect('/produkty/:id/*', array('controller' => 'products', 'action' => 'view'), array('id' => '[0-9]+'));
    

    products_controller.php

    class ProductsController extends AppController{
        public function view(){
             //named args can be find at $this->params['named']
             $productId = $this->params['named']['id'];
        }
    }
    

    【讨论】:

      【解决方案2】:

      不需要做任何复杂的事情:)

      在 routes.php 中:

      Router::connect('/produkty/*', array('controller'=>'products', 'action'=>'view'));
      

      在 products_controller.php 中:

      function view($url = null) {
          $product = $this->Product->find('first', array('conditions'=>array('Product.url' => $url)));
          ...
      }
      

      【讨论】:

      • 我刚开始使用 CakePHP,所以我没有意识到函数可以有其他参数而不仅仅是 ID。所以现在我必须为模型中的 url 定义唯一的验证,它就完成了。谢谢!
      • 我只是碰到了一个小问题。您的解决方案很棒,但我有一种名为 mainpage 的内容类型,而这一种具有非常具体的路由。这种类型的 URL 应该紧跟在域名之后,例如 http://cake.dev/contact。有什么帮助吗?谢谢
      • 如果只有几页,我建议为每个页面创建一个显式路由,因为它是一个更简洁的解决方案:Router::connect('/contact', array('controller'=>'mainpages', 'action'=>'view', 'contact')); 如果你有太多,你可以添加一个包罗万象在 routes.php 的末尾传递任何与您的主页控制器不匹配的内容。在下一条评论中继续...
      • Router::connect('*', array('controller'=>'mainpages', 'action'=>'view')); 这有两个问题。您将必须为所有其他控制器+操作添加路由。其次,如果找不到该页面,则需要向 mainpages_controller->view() 添加 404 错误调用。
      • 我试过Router::connect('*', array('controller'=>'mainpages', 'action'=>'view'));,但我遇到了问题。我不能静态声明路由,因为站点管理员总是可以创建新的,所以我现在使用原始帖子中的代码。
      猜你喜欢
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      相关资源
      最近更新 更多