2016-09-19 3 views
3

Ich habe diesen Fehler (unter silex 2.0):UndefinedFunctionException Versuchte Funktion xxx von Namespace zu nennen xxx

UndefinedFunctionException in app.php Linie 88: Versuchte Funktion "postIndexArticle" von Namensraum "SocialWall \ Controller" zu nennen .

in app.php line 88 
at {closure}(object(Application)) in Container.php line 113 
at Container->offsetGet('home.controller') in CallbackResolver.php line 55 
at CallbackResolver->convertCallback('home.controller') in ServiceControllerResolver.php line 50 
at ServiceControllerResolver->getController(object(Request)) in HttpKernel.php line 136 
at HttpKernel->handleRaw(object(Request), '1') in HttpKernel.php line 68 
at HttpKernel->handle(object(Request), '1', true) in Application.php line 496 
at Application->handle(object(Request)) in Application.php line 477 
at Application->run() in index.php line 17 

mein app.php

<?php 

use SocialWall\Controller; 

$app['home.controller'] = function($app) { 
    return SocialWall\Controller\postIndexArticle($app); 
}; 

mein route.php

<?php 

// Home page 
$app->get('/', 'home.controller')->bind('home'); 

HomeController.php

<?php 

namespace SocialWall\Controller; 

use Silex\Application; 
use SocialWall\DAO\ArticleDAO; 

function postIndexArticle(Application $app) { 
    return function() use ($app) { 
     return new $app['twig']->render('index.html.twig', array('articles' => $app['dao.article']->findAll())); 
    }; 
} 

Ich brauche Hilfe!

Antwort

0

Ich habe versucht, Ihre Demo neu zu erstellen, und es funktioniert für mich. Ich sehe, dass Sie nach dem letzten Beispiel hier http://silex.sensiolabs.org/doc/master/providers/service_controller.html gezeigt, die unter Verwendung von Callables als Controller erwähnt:

// app.php 
<?php 

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

$app = new Silex\Application(); 
$app['debug'] = true; 

$app->register(new Silex\Provider\ServiceControllerServiceProvider()); 
$app->register(new Silex\Provider\TwigServiceProvider()); 

$app['home.controller'] = function($app) { 
    return \SocialWall\Controller\postIndexArticle($app); 
}; 

// Home page 
$app->get('/', 'home.controller')->bind('home'); 

$app->run(); 

Und dann der Controller in einer separaten Datei:

// HomeController.php 
namespace SocialWall\Controller; 

use Silex\Application; 

function postIndexArticle(Application $app) { 
    return function() use ($app) { 
     return $app['twig']->createTemplate('test template')->render([]); 
    }; 
} 

Diese Drucke nur test template.

Also ich denke, das Problem in eines dieser Dinge ist (oder vielleicht beides):

  1. Ihre postIndexArticle ‚s innere aufrufbar kehrt return new $app['twig']->render(... die nicht korrekt ist. Sie möchten hier nicht das Schlüsselwort new verwenden, da die Methode render() nur die Zeichenfolgevorlage zurückgibt.

  2. Ich denke, es ist etwas falsch mit Ihrem Namensraum in Ihrem app.php oder HomeController.php wo Sie anrufen mögen

    $app['home.controller'] = function($app) { 
        return SocialWall\Controller\postIndexArticle($app); 
    }; 
    

    So versuchen absoluten Namespace-Pfad verwenden, wie ich tat \SocialWall\Controller\postInd...

+0

Ok, es ist Arbeit: Ich habe nur hinzufügen "require_once __DIR __. '/ ../src/Controller/HomeController.php '; "in meiner index.php! Und entfernen Sie" neu "im Gegenzug von Controller, wie Sie geschrieben haben. –

+0

Aus diesem Grund fühlt sich die Verwendung dieser Methode für mich fischig :(. Needing require_once bedeutet, zurück zu kehren Autoload ist toll, bitte benutzen Sie es – seblucas

+0

Sie sagen, die aufrufbar als Controller ist eine gute Methode, wenn Sie mit Whit Autoload? –

0

sollten Sie Klassen verwenden, nicht funktioniert, würde ich

mein app.php

<?php 

use SocialWall\Controller; 

$app['home.controller'] = function($app) { 
    return SocialWall\Controller\HomeController($app); 
}; 

mein route.php

<?php 

// Home page 
$app->get('/', 'home.controller:postIndexArticle')->bind('home'); 

Homecontroller.php

<?php 

namespace SocialWall\Controller; 

use Silex\Application; 
use SocialWall\DAO\ArticleDAO; 

class HomeController 
{ 
    protected $app; 

    public function __construct(Application $app) 
    { 
    $this->app= $app; 
    } 

    function postIndexArticle() { 
     return $this->app['twig']->render('index.html.twig', array('articles' => $this->app['dao.article']->findAll())); 
    } 
} 

verwenden Als eine Sid Es ist nicht zu empfehlen, $ app direkt überall zu verwenden. Sie sollten über DI lesen.

+0

Ok, aber wenn Wenn Sie auf die Seite mit der Dokumentation (http://silex.sensiolabs.org/doc/master/providers/service_controller.html) schauen, sehen Sie "Zusätzlich zur Verwendung von Klassen für Dienst-Controller ..."Und genau darunter ist ihr Controller eine einfache Funktion. Warum? Ich glaube, ich verstehe diesen Teil der Dokumentation nicht. Kannst du mir das erklären? –

+0

Ich habe es gerade gelesen, aber ich habe nie daran gedacht, eine einfache Funktion zu benutzen Service ist eine Klasse und das ist es. Ich will nicht einmal wissen, wie Sie Ihre Anfrage oder Route Parameter mit einer einfachen Funktion bekommen. Zu kompliziert für mich. – seblucas

Verwandte Themen