我想从id
隐藏URL
,我有一个数据库表,其中包含store_id
,store_name
,store_city
和store_zipcode
字段,现在它是这样工作的:
http://example.com/store/1/Cafe-Crsip-Chicago-60640
但是我希望它像这样改变:
http://example.com/store/Cafe-Crsip-Chicago-60640
在id
中未显示URL
。
路线:
Route::get('store/{id}/{slug}',['as'=>'showProducts','uses'=>'FrontController@getProduct']);
HREF:
<a href="store/{{$store->store_id}}/{{str_replace(' ', '-', $store->store_name)}}-{{str_replace(' ', '-', $store->store_city)}}-{{$store->store_zipcode}}">
控制器:
public function getProduct(int $id, string $slug)
{
$products = Product::where(['store_id'=>$id])
->orderBy('category_id', 'asc')
->with('category','relatedproducts', 'relatedproducts.product')
->get()
->groupBy('category_id');
}
请注意,我使用str_replace删除了网址中的所有空格,因此,如果我使用store / {slug},则如果我使用str_replace修改了网址,则来自网址的参数将不一样
答案 0 :(得分:1)
我将创建一条新路线:
Route::get('store/{slug}',['as'=>'showProducts','uses'=>'FrontController@getProduct']);
将Href更改为:
<a href="store/{{str_replace(' ', '_', $store->store_name)}}-{{str_replace(' ', '_', $store->store_city)}}-{{$store->store_zipcode}}">
注意,我在str_replace中将-更改为_
然后更改控制器以查找store_name,store_city和store_zipcode而不是store_id
以下内容:
public function getProduct(string $slug)
{
$slugs = explode("-", str_replace('_', ' ', $slug)); // replace the _ back to spaces and separate the 3 parts of the slug
$products = Product::where([
'store_name'=>$slugs[0], 'store_city'=>$slugs[1], 'store_zipcode'=>$slugs[2]
])
->orderBy('category_id', 'asc')
->with('category','relatedproducts', 'relatedproducts.product')
->get()->groupBy('category_id');}
希望这会有所帮助!
就像@waterloomatt提到的那样,您也可以使用laravel为我们提供的辅助助手来做到这一点,但我不知道它是如何工作的。
答案 1 :(得分:0)
您不能隐藏URL路径参数,而只能重定向。您可以将路线参数“ id”设置为可选
Route::get('store/{id?}/{slug}',['as'=>'showProducts','uses'=>'FrontController@getProduct']);
然后您的查询将不会获得任何id参数,并且 您将收到类似“ Laravel类型错误:函数参数太少”的错误
最好将您的子弹用作标识列,以避免使用id。 那么您的路线将是
Route::get('store/{slug}',['as'=>'showProducts','uses'=>'FrontController@getProduct']);
并从控制器中删除id参数,然后对查询使用Slug。
答案 2 :(得分:0)
我所做的只是在stores表中添加了名为slug的新列 这个子弹将带有商店的名称,城市和邮政编码(所有这些都不能重复)
Cafe-Crsip-Chicago-60640 这可以在添加具有小功能的新商店的过程中添加,以将3个字段组合在一起并将其保存在字段中 在路上添加了这个
Route::get('{slug}',['as'=>'showProducts','uses'=>'FrontController@getProduct']);
在控制器中
public function getProduct(string $slug)
{
$storesid = Storeinfo::where(['store_slug'=> $slug])->get()->first();