我试图在Laravel 5中开发一个电子商务网站(由于它需要大量定制,我决定不使用Magento或OpenCart。)
我面临的问题是从slugs创建类别和产品网址。
例如,一个URL可以是:
http://somewebsite.com/products/lenovo-yoga-500
但我想制作如下的网址:
http://somewebsite.com/lenovo-yoga-500
我尝试创建一条路线,如:
Route::get('{slug}', 'BaseController@route');
并且在route()方法中,我尝试了:
function route($route){
$product = Product::where(array('slug' => $slug))->first();
if(isset($product))
.....
else
.....
但首先,价值没有传递给变量' $ slug'其次,我想在检查条件后将请求重定向到另一条路线。
答案 0 :(得分:0)
您可能想要使用第一个URL(product / {slug}),因为您使用slug作为第一个参数进行设置的方式,您为任何页面创建的每个路径都将被解释为slug。
无论哪种方式,都要修复你的控制器方法
function route($slug){
$product = Product::where(array('slug' => $slug))->first();
if(isset($product))
.....
else
.....
文档涵盖了您在这里要求的所有内容,因此请仔细阅读有关重定向到路线的信息。
答案 1 :(得分:0)
要像Magento那样实现它,您需要添加一个将要重建的新product-routes.php
文件。
首先指示app/Providers/RouteServiceProvider.php
加载动态路由文件:
protected function mapWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace,
], function ($router) {
require app_path('Http/routes.php');
require base_path('resources/routes/product-routes.php');
});
}
下一步:在保存时或当用户在后端请求包含所有产品slug路由并通过slug加载产品时自动重建product-routes.php
。
希望有所帮助。
答案 2 :(得分:0)
在产品型号中:
public function getRouteKeyName() {
return 'slug';
}
路线中的:
Route::get('{product}', 'ProductController@product');
ProductController中的:
public function product(Product $product) {
$product->doSomething();
}
请注意,路线应该在routes-file中为最后一个,因此任何其他路线都有可能在此之前匹配。