2015-05-09 2 views
3

Я создаю систему электронной торговли. У меня есть функция getCategories() в контроллере. Эта функция работает, но я попытался расширить ее функциональность, чтобы она вернула соответствующее представление в соответствии с фильтром.Laravel 4 - Фильтровать результаты и кешировать

Допустим, пользователь просматривает определенную категорию. Каждая категория содержит продукты, и я попытался создать фильтр для продуктов на основе их бренда. Например, если пользователь находится в категории 'Guitars', он должен иметь возможность фильтровать свои товары на основе существующей торговой марки 'Gibson'.

Итак, я реализовал вышеупомянутый сценарий, но я не уверен, что это очень эффективно. Я создал ссылку:

@foreach($brand as $key => $value) 
    <a href="/store/categories/{{$category->slug}}?brand={{$value->slug}}">{{$value->name}}</a> 
@foreach 

Как вы можете видеть, я передаю параметр brand через URL и эта связь вызывает функцию getCategories(), где внутри этой функции я проверяю, если ссылка содержит параметр, как так :

if (Input::has('brand')) { 
    $brandflag = true; 
    $brand_input = Input::get('brand'); 
    $brandfilter = array('type'=>'Brand', 'name' => ucfirst($brand_input)); 
} 

$brandflag первоначально установлен на false и если он существует, то он изменяет свое значение true. Также еще один if, чтобы вернуть другие данные в представление, если $brandflag изменено на true.

if ($brandflag == true) { 
    $b = Brand::whereSlug($brand_input)->first(); 
    $products = Product::where('brand_id','=', $b->id)->whereIn('category_id', $children->lists('id')); 
    return View::make('store.categories') 
     ->with('products', $products->paginate(6)) 
     ->with('ranges', $ranges) 
     ->with('brandfilter', $brandfilter) 
     ->with('category', $main) 
     ->with('brands', $brands) 
     ->with('children', $children_array) 
     ->with('seo', $seo); 
} 

Все вышеперечисленные работы, однако, когда я Кэширование категории маршрута все это не будет работать, потому что он будет кэшировать вид, и он будет ссылаться на этот кэшированный файл. Все, что прошло после того, как ? проигнорировано.

Route::get('categories/{slug}', array(
    'as' => 'store.categories', 
    'uses' => '[email protected]' 
))->where('slug', '(.*)?')->before('cache.fetch')->after('cache.put'); 

Как следует очистить/исправить мой код, чтобы получить эту функциональность работать и иметь возможность кэшировать категории?

+0

Я просто хочу сделать комментарий, потому что я не уверен на 100%. Я не думаю, что это будет мудрая страница для кэширования. Эта страница имеет возможность постоянно меняться, и, поскольку это так, это не идеальная точка кеширования. Вы хотите кэшировать страницы, которые не меняются часто и не принимают много параметров. Это более важно для кэширования. –

ответ

2

Я полагаю, что фильтры cache.put и cache.fetch основаны на this article.

В своем примере автор использует $request->url() для создания ключа кеша. В API docs указано, что этот метод не включает строку запроса.

Для того, чтобы кэширование для работы с параметрами запроса вы должны будете заменить вызов url() либо fullUrl(), или комбинации url() и query().

+0

Удивительный! Изменение его на 'fullUrl()' сделал трюк! – cch

Смежные вопросы