0

我有两条或更多条路线将前往相同的控制器和操作。这很好,直到我想在页面上使用表单助手或分页等助手。发生的情况是当前 url 更改为我routes.php文件中首先声明的任何内容。

我看到有一种方法可以使用 Router::promote 来提升路由器,但我不确定是否可以根据当前使用的 url 或路由器来实现它,或者是否有更好的方法来做到这一点。

这是我的router.php样子的一个例子:

Router::connect('/cars-for-sale/results/*', array('controller' => 'listings', 'action' => 'results'));
Router::connect('/new-cars/results/*', array('controller' => 'listings', 'action' => 'results'));
Router::connect('/used-cars/results/*', array('controller' => 'listings', 'action' => 'results'));

例如,假设我在 url 处,domain.com/used-cars/results/并且正在使用表单助手或分页助手,放在 action 或 href 中的 url 是domain.com/cars-for-sale/results/.

任何帮助或信息将不胜感激。

4

1 回答 1

2

路线应该是唯一且可识别的!

这些路由的问题在于,基本上,您创建了重复的 URL,这不仅会导致 CakePHP 选择正确的路由出现问题,而且 Google 也不喜欢这样;重复的内容会对您的 SEO 排名产生负面影响!

为了选择正确的 URL(路由),CakePHP 应该能够根据其参数这样做;您当前的路线不提供任何区分它们的方法。

你的应用程序也没有!

所有这些 URL 都将呈现相同的数据;

/cars-for-sale/results/
/new-cars/results/
/used-cars/results/

解决方案 1 - 单独的操作

如果您的应用程序仅限于这三个类别,最简单的解决方案是创建三个操作,每个类别一个;

控制器:

class ListingsController extends AppController
{
    const CATEGORY_NEW       = 1;
    const CATEGORY_USED      = 2;
    const CATEGORY_FOR_SALE  = 3;

    public $uses = array('Car');


    public function forSaleCars()
    {
        $this->set('cars', $this->Paginator->paginate('Car', array('Car.category_id' => self::CATEGORY_FOR_SALE)));
    }

    public function newCars()
    {
        $this->set('cars', $this->Paginator->paginate('Car', array('Car.category_id' => self::CATEGORY_NEW)));
    }

    public function usedCars()
    {
        $this->set('cars', $this->Paginator->paginate('Car', array('Car.category_id' => self::CATEGORY_USED)));
    }
}

路由.php

Router::connect(
    '/cars-for-sale/results/*', 
    array('controller' => 'listings', 'action' => 'forSaleCars')
);
Router::connect(
    '/new-cars/results/*', 
    array('controller' => 'listings', 'action' => 'newCars')
);
Router::connect(
    '/used-cars/results/*', 
    array('controller' => 'listings', 'action' => 'usedCars')
);

解决方案 2 - 将“类别”作为参数传递

如果用于“列表”的 URL 列表不会固定并会扩展,最好将“过滤器”作为参数传递并将其包含在您的路由中;

路由.php

Router::connect(
    '/:category/results/*',
    array(
         'controller' => 'listings',
         'action'     => 'results',
    ),
    array(

         // category: lowercase alphanumeric and dashes, but NO leading/trailing dash
         'category'  => '[a-z0-9]{1}([a-z0-9\-]{2,}[a-z0-9]{1})?',

         // Mark category as 'persistent' so that the Html/PaginatorHelper
         // will automatically use the current category to generate links
         'persist'   => array('category'),

         // pass the category as parameter for the 'results' action
         'pass'      => array('category'),
    )
);

阅读路由器 API

在您的控制器中:

class ListingsController extends AppController
{
    public $uses = array('Car');


    /**
     * Shows results for the specified category
     *
     * @param string $category
     *
     * @throws NotFoundException
     */
    public function results($category = null)
    {
        $categoryId = $this->Car->Category->field('id', array('name' => $category));

        if (!$categoryId) {
            throw new NotFoundException(__('Unknown category'));
        }

        $this->set('cars', $this->Paginator->paginate('Car', array('Car.category_id' => $categoryId)));
    }
}

并且,创建指向某个类别的链接;

$this->Html->link('New Cars', 
    array(
         'controller' => 'listings', 
         'action'     => 'results', 
         'category'   => 'new-cars'
    )
);
于 2013-04-19T22:51:45.817 回答