Запрос базы данных в контроллере маршрутизации

Я делаю сайт с категориями и продуктами. Категории и продукты являются типами контента. Категории не могут быть типом таксономии, потому что редактор сайта должен изменить данные для категорий. Чтобы решить эту проблему, я создал собственную маршрутизацию:

products:
path: /{catslug}/{slug}
defaults: { _controller: 'Bolt\Controllers\Frontend::record', contenttypeslug: 'products' }
requirements:
catslug: 'Bolt\Controllers\Routing::getAnyCategorieRequirement'

Я добавил функцию в Routing.php (позже я перенесу ее в расширение):

public function getAnyCategorieRequirement()
{
$slugs = array();
foreach($this->app['storage']->getContent("categories") as $cat){
$slugs[] = $cat['slug'];
}
return implode("|", $slugs);
}

Но потом я столкнулся с проблемой:

Доступ к услуге запроса вне области запроса. Попробуйте переместить этот вызов в обработчик или контроллер.

Поэтому я временно закомментировал запрос к базе данных и добавил слаг по умолчанию к $ slugs:

public function getAnyCategorieRequirement()
{
$slugs = array();
$slugs[] = "hollandse-kazen";
return implode("|", $slugs);
}

Таким образом, все работало, как ожидалось. Теперь мой вопрос: как я могу выполнить этот запрос к базе данных в контроллере маршрутизации, или есть обходной путь для этой проблемы?


Первое решение Росса Райли сработало для меня:

    $slugs = array();
//Do complicated request because of [url to stackoverflow]
$stmt = $this->app['db']->query('SELECT slug FROM bolt_categories');
while($cat = $stmt->fetch()){
$slugs[] = $cat['slug'];
}
return implode("|", $slugs);

Таким образом, все работает как положено 🙂

2

Решение

К сожалению, это известная проблема с методом getContent () Bolt, которая зависит от того, находится ли он в цикле запроса, как обсуждалось здесь: https://github.com/bolt/bolt/issues/2129

Два способа обойти это — использовать $ app [‘db’], чтобы сделать необработанный запрос к базе данных, вместо использования getContent ().

Другой — временно перезаписать $ app [‘request’], чтобы он заработал. Нечто подобное сделает эту работу.

use Symfony\Component\HttpFoundation\Request;
.....
$oldRequest = $app['request'];
$app['request'] = Request::createFromGlobals();
....
<do database call here>
....
$app['request'] = $oldRequest;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector