Laravel隐藏网址中的ID

时间:2018-08-03 16:58:44

标签: php laravel

我想从id隐藏URL,我有一个数据库表,其中包含store_idstore_namestore_citystore_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修改了网址,则来自网址的参数将不一样

3 个答案:

答案 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();