У меня есть приложение, которое я пытаюсь построить, используя Тонкий PHP и в данный момент я борюсь с одним маршрутом, который я пытаюсь разобраться. В основном, что происходит, я иду в GET /:slug
и это дает мне представление о продукте. Однако, если есть изменения в этом продукте, это будет вводная страница, на которой посетитель может выбрать точный продукт. Различия в этих продуктах будут:
Возможно, несколько других. Проблема, с которой я столкнулся, заключается в том, что я не уверен на 100%, что если таковые будут. Я пишу свои маршруты для каждой возможности? Или есть способ, которым я могу получить более расслабленный подход к тому, как это формируется?
Я видел пример, где кто-то сделал следующее:
$app->get("/:slug(/:dial(/:strap(/:material)))", "Route\To\Controller:Action");
Однако я предполагаю, что это потребует, чтобы это было в этом установленном порядке?
Также следует добавить, что некоторые продукты не имеют дополнительных фильтров и отвечают непосредственно на /:slug
тогда как для других могут потребоваться все дополнительные фильтры.
Эти результаты все установлены в базе данных. Я беру все продукты, которые имеют аналогичные слизень поскольку оно соответствует названию продукта, то каждый фильтр или набор фильтров будет определяться определенными частями в базе данных. Например: /this-product/this-dial/this-color/this-strap/this-material
все эти значения будут храниться в таблице базы данных для продукта — они либо имеют соответствующее значение для материала — либо имеют значение NULL.
Это позволяет мне в корневом URL-адресе использовать SLUG, на котором я могу показывать варианты, что, на мой взгляд, поможет в совершении покупок.
У кого-нибудь есть решение ?? В любом случае, я мог бы добиться этого? Я поступаю неправильно?
Одним из возможных способов является создание различных шаблонов в зависимости от количества возвращенных продуктов. Например, если вы используете расширение шаблона Twig, вы можете легко выполнить итерацию по набору результатов и отобразить два шаблона, один для описания продукта и один для группы продуктов. В качестве альтернативы, вы можете справиться с этим, визуализируя представление в маршруте 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");
Что касается запросов, почему вы хотите иметь маршрут для каждого атрибута продукта?
Разве вы не можете в этом случае иметь один маршрут для представления продукта и добавить параметр запроса (атрибуты) в URL?
/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..
});
});
Других решений пока нет …