我有一个应用程序,我正在尝试使用 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上显示变化 - 这将有助于购物体验。
有人有解决方案吗?无论如何我能做到这一点?我是以错误的方式去做的吗?
答案 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..
});
});