slimphp / Twig-View

Slim Framework view helper built on top of the Twig templating component
http://slimframework.com
MIT License
356 stars 87 forks source link

3.x try to use url_for return error. #136

Closed kaxias closed 5 years ago

kaxias commented 5 years ago

Add on Container

$container->add('view', function () {
    return new Twig(twig.path, twig.settings);
});

Add Middleware

$app->add(TwigMiddleware::createFromContainer($app));

Error Log

Slim Application Error
The application could not run because of the following error:

Details
Type: Twig\Error\SyntaxError
Code: 0
Message: Unknown "url_for" function.
File: D:\laragon\www\container\resources\views\auth\login.twig
Line: 15
Trace
#0 D:\laragon\www\container\vendor\twig\twig\src\ExpressionParser.php(451): Twig\ExpressionParser->getFunctionNodeClass('url_for', 15)
#1 D:\laragon\www\container\vendor\twig\twig\src\ExpressionParser.php(235): Twig\ExpressionParser->getFunctionNode('url_for', 15)
#2 D:\laragon\www\container\vendor\twig\twig\src\ExpressionParser.php(175): Twig\ExpressionParser->parsePrimaryExpression()
#3 D:\laragon\www\container\vendor\twig\twig\src\ExpressionParser.php(70): Twig\ExpressionParser->getPrimary()
#4 D:\laragon\www\container\vendor\twig\twig\src\Parser.php(142): Twig\ExpressionParser->parseExpression()
#5 D:\laragon\www\container\vendor\twig\twig\src\TokenParser\BlockTokenParser.php(45): Twig\Parser->subparse(Array, true)
#6 D:\laragon\www\container\vendor\twig\twig\src\Parser.php(185): Twig\TokenParser\BlockTokenParser->parse(Object(Twig\Token))
#7 D:\laragon\www\container\vendor\twig\twig\src\Parser.php(98): Twig\Parser->subparse(NULL, false)
#8 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(563): Twig\Parser->parse(Object(Twig\TokenStream))
#9 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(595): Twig\Environment->parse(Object(Twig\TokenStream))
#10 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(408): Twig\Environment->compileSource(Object(Twig\Source))
#11 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(381): Twig\Environment->loadClass('__TwigTemplate_...', 'auth/login.twig', NULL)
#12 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(359): Twig\Environment->loadTemplate('auth/login.twig')
#13 D:\laragon\www\container\vendor\twig\twig\src\Environment.php(318): Twig\Environment->load('auth/login.twig')
#14 D:\laragon\www\container\vendor\slim\twig-view\src\Twig.php(124): Twig\Environment->render('auth/login.twig', Array)
#15 D:\laragon\www\container\vendor\slim\twig-view\src\Twig.php(180): Slim\Views\Twig->fetch('auth/login.twig', Array)
#16 D:\laragon\www\container\app\Core\Facades\Facade.php(34): Slim\Views\Twig->render(Object(Slim\Http\Response), 'auth/login.twig')
#17 D:\laragon\www\container\app\Controllers\Auth\LoginController.php(16): App\Core\Facades\Facade::__callStatic('render', Array)
#18 D:\laragon\www\container\vendor\slim\slim\Slim\Handlers\Strategies\RequestResponse.php(42): App\Controllers\Auth\LoginController->__invoke(Object(Slim\Http\ServerRequest), Object(Slim\Http\Response), Array)
#19 D:\laragon\www\container\vendor\slim\slim\Slim\Routing\Route.php(372): Slim\Handlers\Strategies\RequestResponse->__invoke(Array, Object(Slim\Http\ServerRequest), Object(Slim\Http\Response), Array)
#20 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(73): Slim\Routing\Route->handle(Object(Slim\Http\ServerRequest))
#21 D:\laragon\www\container\app\Middleware\WebRouteMiddleware.php(21): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#22 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(132): App\Middleware\WebRouteMiddleware->process(Object(Slim\Http\ServerRequest), Object(Slim\MiddlewareDispatcher))
#23 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(73): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#24 D:\laragon\www\container\vendor\slim\slim\Slim\Routing\Route.php(333): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#25 D:\laragon\www\container\vendor\slim\slim\Slim\Routing\RouteRunner.php(65): Slim\Routing\Route->run(Object(Slim\Http\ServerRequest))
#26 D:\laragon\www\container\vendor\slim\slim\Slim\Middleware\RoutingMiddleware.php(58): Slim\Routing\RouteRunner->handle(Object(Slim\Http\ServerRequest))
#27 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(132): Slim\Middleware\RoutingMiddleware->process(Object(Slim\Http\ServerRequest), Object(Slim\Routing\RouteRunner))
#28 D:\laragon\www\container\vendor\slim\slim\Slim\Middleware\ErrorMiddleware.php(89): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#29 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(132): Slim\Middleware\ErrorMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#30 D:\laragon\www\container\vendor\slim\twig-view\src\TwigMiddleware.php(125): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#31 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(132): Slim\Views\TwigMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#32 D:\laragon\www\container\app\Middleware\SessionMiddleware.php(26): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#33 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(132): App\Middleware\SessionMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#34 D:\laragon\www\container\vendor\slim\slim\Slim\MiddlewareDispatcher.php(73): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#35 D:\laragon\www\container\vendor\slim\slim\Slim\App.php(206): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#36 D:\laragon\www\container\vendor\slim\slim\Slim\App.php(190): Slim\App->handle(Object(Slim\Http\ServerRequest))
#37 D:\laragon\www\container\public\index.php(12): Slim\App->run()
#38 {main}
adriansuter commented 5 years ago

Hi @kaxias

What version of Twig-View are you using? Because the trace-entries 14 and 15 tell

#14 D:\laragon\www\container\vendor\slim\twig-view\src\Twig.php(124): Twig\Environment->render('auth/login.twig', Array)
#15 D:\laragon\www\container\vendor\slim\twig-view\src\Twig.php(180): Slim\Views\Twig->fetch('auth/login.twig', Array)

So the method Twig->fetch() gets called (entry 15) and in line 124 (entry 14) which is therefore part of that method, Environment->render() gets called. But looking at the source of the current 3.x branch, the method Twig->fetch() is defined on lines 142-147. https://github.com/slimphp/Twig-View/blob/3955c519658730cc45865b71e0ad876c6d1758f2/src/Twig.php#L142-L147

Maybe you should update your Twig-View installation.

kaxias commented 5 years ago

I’m using slim-twig 3.0.0-beta and l did try 3.x-dev same error.

adriansuter commented 5 years ago

I guess the Twig instance gets overriden somewhere in the code. If you refer to your repo slim-skleton, then I just quickly checked and found, that the registered function for the view key in \App\Providers\TwigServiceProvider::register gets called two times. Therefore you would get a new instance for every call.

I changed the code to the following

    /**
     * @return void
     * @throws \Twig\Error\LoaderError
     */
    public function register(): void
    {
        $twig = Twig::create(Config::get('twig.path'), (array)Config::get('twig.settings'));
        foreach ((array)Config::get('twig.functions') as $function) {
            $twig->getEnvironment()->addFunction($function);
        }

        $this->getContainer()->add('view', $twig);
    }

and it found the special Slim Twig functions.

But I am not sure if this is the way to go - never used the league container.

kaxias commented 5 years ago

I guess the Twig instance gets overriden somewhere in the code. If you refer to your repo slim-skleton, then I just quickly checked and found, that the registered function for the view key in \App\Providers\TwigServiceProvider::register gets called two times. Therefore you would get a new instance for every call.

thank you @adriansuter to mention twig isn't singleton, I did make singleton add true in the third parameter on the method add.

$this->add(parameter, parameter, true);

now work fine, thanks for the help.

wildercs commented 3 years ago

I guess the Twig instance gets overriden somewhere in the code. If you refer to your repo slim-skleton, then I just quickly checked and found, that the registered function for the view key in \App\Providers\TwigServiceProvider::register gets called two times. Therefore you would get a new instance for every call.

thank you @adriansuter to mention twig isn't singleton, I did make singleton add true in the third parameter on the method add.

$this->add(parameter, parameter, true);

now work fine, thanks for the help.

Hello, @kaxias Could you explain to me how you solved it, I have the same problem. Where are you added that line of code? $this->add(parameter, parameter, true);

my composer.json

"slim/psr7": "^1.1",
"slim/slim": "^4.5",
"slim/twig-view": "^3.1"

my repositories.php:

       Twig::class => function (ContainerInterface $container) {
            $twigSettings = $container->get('settings')['twig'];
            $options = $twigSettings['options'];
            $options['cache'] = $options['cache_enabled'] ? $options['cache_path'] : false;
            $twig = Twig::create($twigSettings['paths'], $options);
            // Add extension here
            $twig->addExtension(new DebugExtension());
            $twig->getEnvironment()->addGlobal('session', $_SESSION);
            return $twig;
        },
        TwigMiddleware::class => function (ContainerInterface $container) {
            return TwigMiddleware::createFromContainer($container->get(App::class), Twig::class);
        },