正确处理我的URL请求的方法

时间:2015-04-14 08:00:34

标签: php routes conditional-statements slim

我有一个应用程序,我正在尝试使用 Slim PHP 构建,目前我正在努力解决一条路线问题。基本上我会去GET /:slug,这为我提供了一个产品视图。但是,如果此产品有变化,它将是一个介绍页面,访问者可以在其中定位确切的产品。这些产品的差异将是:

  • 颜色
  • 拨号
  • 表带
  • 材料

可能还有其他一些人。我遇到的问题是,我不是100%确定哪些会有。我是否为每种可能性编写路线?或者有没有办法让我采取更放松的方法来形成它?

我看到有人做了以下事情的例子:

$app->get("/:slug(/:dial(/:strap(/:material)))", "Route\To\Controller:Action");

但是我假设这需要按照设定的顺序进行?

另外需要注意的是,某些产品没有额外的过滤器并直接响应/:slug,而其他产品可能需要所有其他过滤器。

这些结果都在数据库中设置。我抓住所有具有类似 slug 的产品,因为它等同于产品名称,然后每个过滤器或过滤器集合将由数据库中的某些部分确定。例如:/this-product/this-dial/this-color/this-strap/this-material所有这些值都将存储在产品的数据库表中 - 它们具有相应的材料值 - 或者它是NULL。

这允许我在SLUG的根URL上显示变化 - 这将有助于购物体验。

有人有解决方案吗?无论如何我能做到这一点?我是以错误的方式去做的吗?

1 个答案:

答案 0 :(得分:1)

一种可能的方法是根据退回的产品数量呈现不同的模板。例如,如果您正在使用Twig Template扩展,则可以轻松迭代结果集并为产品描述呈现两个模板,为产品组呈现一个模板。或者,您可以在SLIM路径中呈现视图时处理此模板

$app->get('/:slug', function ($slug) use ($app) {
    $db = new dbConn();
    $Products = $db->ProductQuery(); //  DB querying for 'slug' & returned product (s)

     if( // here check how many $Products and if = 1 ) {
           $app->render('single_product_view.html',$Products);
     } else if( /// > 1 ) {
           $app->render('multiple_product_view.html',$Products);
     } else {
           $app->response->redirect($app->urlFor('notFoudnt'), 404); // or whatever other route..                 
     }

})->name("product");

至于查询为什么要为每个产品属性设置路线?

在这种情况下,您是否可以为产品视图设置一条路线并向网址添加查询参数(属性)

/this-product?dial=this-dial&color=this-color&strap=this-strap&material=this-material

  $app->get('/:slug', function ($slug) use ($app) {
          $Dial = $app->request()->get('dial');
          $Color = $app->request()->get('color');
          $Strap = $app->request()->get('strap');
          $Mat = $app->request()->get('material');

        // same as above, build your query string and render corresponding view

    })->name("product");

您也可以对路线进行分组(对于ajax请求可能......)

$app->group('/api', function () use ($app) {

// Products attributes group route
$app->group('/products', function () use ($app) {

    // Get Products with color = :color  /api/products/color/:color
    $app->get('/color/:color', function ($color ) {

    });

    // Get Products with Strap = :strap   /api/products/strap/:strap
    $app->get('/strap/:strap', function ($strap) {

    });

     // and so on..
  });
});