2016-09-19 2 views
3

У меня есть эта ошибка (под силикатного 2.0):UndefinedFunctionException Пытались вызвать функцию ххх из имен ххх

UndefinedFunctionException в app.php линии 88: Покушение вызова функции «postIndexArticle» из пространства имен «SocialWall \ Controller» ,

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 

мой app.php

<?php 

use SocialWall\Controller; 

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

мой 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())); 
    }; 
} 

Мне нужна помощь!

ответ

0

Я попытался воссоздать вашу демоверсию, и она работает для меня. Я вижу, что вы следующий последний пример, показанный здесь http://silex.sensiolabs.org/doc/master/providers/service_controller.html, который упоминает, используя в качестве контроллеров вызываемых объектов:

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

И тогда контроллер находится в отдельном файле:

// HomeController.php 
namespace SocialWall\Controller; 

use Silex\Application; 

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

Это печатает только test template.

Так что я думаю, что проблема в одном из этих вещей (или, возможно, оба):

  1. Ваших postIndexArticle Внутренных с правом отзывом возвращает return new $app['twig']->render(..., который является неправильным. Вы не хотите использовать ключевое слово new здесь, потому что метод render() возвращает только шаблон строки.

  2. Я думаю, что есть что-то не так с пространствами имен в вашем app.php или HomeController.php, где вы хотите позвонить

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

    Так попробуйте использовать абсолютный путь пространства имен, как я сделал с \SocialWall\Controller\postInd...

+0

Хорошо, теперь это работа: я просто добавил «require_once __DIR __.»/../src/Controller/HomeController.php '; "в моем index.php! И удалите« новый »в ответ на контроллер, как вы написали. –

+0

Вот почему использование этого метода кажется мне подозрительным: (Требуется require_once означает возврат назад в прошлом. Autoload отлично, пожалуйста, используйте его. – seblucas

+0

Вы говорите, что вызываемый контроллер является отличным методом при использовании whit Autoload? –

0

Вы должны использовать классы не функции, я хотел бы использовать

мой app.php

<?php 

use SocialWall\Controller; 

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

мой 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())); 
    } 
} 

Как сид Обратите внимание, что использование $ app непосредственно повсюду не рекомендуется. Вы должны прочитать о DI.

+0

Хорошо, но если вы смотрите на страницу документации (http://silex.sensiolabs.org/doc/master/providers/service_controller.html), вы увидите «Помимо использования классов для сервисных контроллеров ...«и чуть ниже, их контроллер - простая функция. Почему? Я думаю, что не понимаю эту часть документации, вы можете мне объяснить? –

+0

Я просто прочитал ее, но я даже не думал о простой функции, для меня сервис - это класс, и все. Я даже не хочу знать, как вы получаете свой запрос или параметры маршрута с помощью простой функции. Слишком сложно для меня. – seblucas

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