2015-08-27 2 views
2

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

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); 
} 

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

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

Так что я временно закомментировать запрос к базе данных и добавил слизняка по умолчанию до $ слизней:

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); 

Таким образом, он работает, как ожидалось :)

ответ

1

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

Два пути вокруг него - использовать $ app ['db'], чтобы сделать необработанный запрос к db, а не нам ing getContent()

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

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

Ааа, спасибо за ответ :) Я уже отказался от надежды на anwser :) Исправление с «временно перезаписью запрос не работает, хотя ... Я сейчас пытаюсь необработанным решение запроса –

+0

Отлично, первый метод работал отлично! Спасибо. Но вы должны рассмотреть второй метод :) –

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