2016-06-09 6 views
1

Я создал приложение с Silex.Неизвестная функция "form_widget"

Вот веб/index.php

use Symfony\Component\Debug\Debug; 
use Symfony\Component\HttpFoundation\Request; 
use Application\MainKernel; 

require_once __DIR__.'/../vendor/autoload.php'; 

Debug::enable(E_ALL & ~E_NOTICE); 

$request = Request::createFromGlobals(); 
$kernel = new MainKernel(require_once __DIR__.'/../bootstrap.php'); 

$response = $kernel->handle($request); 
$response->prepare($request); 
$response->send(); 

bootstrap.php

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Dumper\PhpDumper; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\Config\FileLocator; 

$configDir = __DIR__ . '/config'; 
$cacheDir = __DIR__ . '/cache'; 

$class = 'ApplicationContainer'; 
$path = sprintf($cacheDir.'%s.php', $class); 

if (!file_exists($path)) { 
    $container = new ContainerBuilder(); 
    $container->setParameter('kernel.cache_dir', realpath($cacheDir)); 
    $container->setParameter('kernel.config_dir', realpath($configDir)); 
    $container->setParameter('kernel.views_dir', realpath(__DIR__.'views')); 

    $loader = new YamlFileLoader($container, new FileLocator(realpath($configDir))); 
    $loader->load('services.yml'); 

    /* Recherche de l'user */ 
    $user = ""; 
    if (preg_match('@^/~([^/]+)/.*[email protected]', $_SERVER['REQUEST_URI'], $m)) { 
     $user = $m[1]; 
    } 

    $container->setParameter('domain', 'digitick.local'); 
    $container->setParameter('user', $user); 
    $container->compile(); 

    $dumper = new PhpDumper($container); 
    file_put_contents($path, $dumper->dump(['class' => $class])); 
} 

require_once $path; 

$container = new $class(); 

return $container; 

Класс MainKernel возвращает ответы:

/** 
* Creation Response Object 
* @param Request  $request 
* @param int   $type 
* @param bool  $catch 
* @return Response 
*/ 
public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) 
{ 
    if($this->container->has('request_context')) { 
     $context = $this->container->get('request_context'); 
     $context->fromRequest($request); 
    } 

    try { 
     $request->attributes->add($this->container->get('router')->match($request->getPathInfo())); 
     $response = $this->executeController($request); 
    } catch (ResourceNotFoundException $e) { 
     $response = new Response('Page Not Found', Response::HTTP_NOT_FOUND); 
    } catch (MethodNotAllowedException $e) { 
     $response = new Response('Method Not Allowed', Response::HTTP_METHOD_NOT_ALLOWED); 
    } catch (HttpException $e) { 
     $code = $e->getStatusCode(); 
     $response = new Response(Response::$statusTexts[$code], $code); 
    } catch (\Exception $e) { 
     var_dump($e->getMessage()); 
     $response = new Response('Internal Server Error', Response::HTTP_INTERNAL_SERVER_ERROR); 
    } 

    return $response; 
} 

private function executeController(Request $request) 
{ 
    if(!$request->attributes->has('_controller')) { 
     throw new \RuntimeException('No controller found to execute'); 
    } 

    $class = $request->get('_controller'); 
    if (!class_exists($class)) { 
     throw new \RuntimeException(sprintf('Controller class "%s" does not exist or is not autoladable.', $class)); 
    } 

    if(!method_exists($class, '__invoke')) { 
     throw new \RuntimeException(sprintf('Controller class "%s" must have __invoke() method.', $class)); 
    } 

    $controller = new $class(); 
    if($controller instanceof AbstractAction) { 
     $controller->setContainer($this->container); 
    } 

    $response = call_user_func_array($controller, [$request]); 
    if(!$response instanceof Response) { 
     throw new \RuntimeException(sprintf('Controller class "%s" must return a Response object.', $class)); 
    } 

    return $response; 
} 

У меня прут и прут расширения на композиторе. Unfortunelly, когда я положил form_widget() в моем файле веточку, он говорит:

Неизвестная функция "form_widget" в "index.html.twig" в строке 30

Что мне не хватает?

Благодаря

ответ

1

Что мне не хватает?

Я считаю, что вам не хватает на то, что вы не используете силикатного, а бутстрапируемых компоненты Symfony, которые выглядят очень похожи (если не то же самое) в качестве блога Potencier на how to build your framework.

Что вы можете сделать, это реорганизовать свой код, удалив большую часть материала, который вы вставили здесь, потому что это уже часть Silex, а затем, когда @marc предложил зарегистрировать поставщика услуг формы, а также Twig one (который вы сказали, что уже добавили композитор). В принципе, ваш код в Silex свелось бы к этому:

require_once __DIR__.'/../vendor/autoload.php'; 

$app = new Silex\Application(); 

$app->get('/', function() use ($app) { 
    return 'works'; 
}); 

$app->run(); 

Пожалуйста, прочтите через Silex docs тщательно, чтобы понять это лучше.

+0

Спасибо, я реорганизовал код. – Amelie

0

form_widget функция обеспечивается FormExtension, который зарегистрирован во время загрузки по TwigServiceProvider. Может быть, вы просто забыли зарегистрировать FormServiceProvider в приложении:

use Silex\Provider\FormServiceProvider; 

$app->register(new FormServiceProvider()); 
+0

Спасибо, я попробовал: $ container-> register (новый \ Silex \ Provider \ FormServiceProvider()); $ container-> compile(); Но это говорит: «Предупреждение: strtolower() ожидает, что параметр 1 является строкой, объект задан« :(... У меня нет кода в моем коде :(! – Amelie