laravel 7中的反向路由

hmtdttj4  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(597)

关闭。这个问题需要详细或明确。它目前不接受答案。
**想改进这个问题吗?**编辑这篇文章,添加细节并澄清问题。

22小时前关门。
改进这个问题
我在电子商务网站工作。我只想做,如果有人在商店页面上点击任何产品,它将获得产品id以获得产品数据。但是在url中显示产品名称而不是产品id,就像这样

Route::get('product/{product_id}','ProductController@getProductDetail');
<a href="/product/product_id">Product Name</a>
www.example.com/product/product_name

我该怎么做

1l5u6lss

1l5u6lss1#

在laravel中使用模型绑定时,可以选择要搜索的模型字段。不过,该字段必须是唯一的。
这就是为什么人们要求你在评论你的问题时用鼻涕虫。
假设你加上这个 slug 产品表上的字段:

id | name             | slug             | price
1  | My Super Product | my-super-product | 10

现在,当人们询问产品时,请laravel在slug字段中搜索,而不是使用id:

//web.php
Route::get('product/{product:slug}','ProductController@getProductDetail');
//ProductController.php
use \App\Models\Product;
use \Illuminate\Http\Request;

public function getProductDetail(Request $request, Product $product)
{
    //Do stuff with $product
}

现在,打电话 GET /product/my-super-product 将导致控制器的功能,您有预期的产品。

kiayqfof

kiayqfof2#

您需要使用隐式绑定:https://laravel.com/docs/7.x/routing#implicit-装订
正如文件明确指出的那样: Laravel automatically resolves Eloquent models defined in routes or controller actions whose type-hinted variable names match a route segment name. 现在您正在使用 {product_id} 在路线定义和 getProductDetail($product_id){...} 你收到的方法 $product_id 参数,并可能使用以下内容获取您的产品 Product::find($product_id) 所以,像这样的事情;

public function getProductDetail($product_id)
{
    $product = Product::find($product_id);
    // do other stuff
    return view('something.bla', $data); // just an example return
}

但是通过隐式绑定,您可以注入 $product 对象直接指向您的方法。
首先更新路线(仅用于正确的参数命名):

Route::get('product/{product}','ProductController@getProductDetail');

然后,您可以更新控制器方法:

public function getProductDetail(Product $product)
{
    // you already have $product object here, Laravel took care of it
    // do other stuff
    return view('something.bla', $data); // just an example return
}

在一个例子中;访问时: yoursite.com/products/3 laravel会自动从以下位置获取产品: id 等于 3 . 它使用 id 默认情况下为列,但如果要使用其他列,可以替代它。
所以你需要一个 slug 在您的 products 将产品名称存储为slug的表。还要确保 slug 列是 unique . 所以也许你可以把这一行添加到你的 create_products_table 迁移;

$table->string('slug')->unique();

创建新产品时,必须设置产品的 slug . 您可以使用str::slug()帮助程序:https://laravel.com/docs/7.x/helpers#method-str弹头
现在,一切都准备好了,您可以根据需要覆盖默认routekey slug 在您的模型中(可能是 app/Models/Product.php )您需要添加一个 getRouteKeyName() 方法并返回您喜欢的列名:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

现在,您的路线将与产品的slug顺利配合。 yoursite.com/products/3 大概是 yoursite.com/products/iphone-12-128gb-purple 拉威尔会照顾好一切;由于隐式绑定。

相关问题