Symfony Создание класса контроллера в silex

Новичок Silex

Новичок
Доброе время суток Gentlemen!

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

"InvalidArgumentException: Class "Controllers\HomeController" does not exist."

Вот что я делаю:

index.php
PHP:
require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

$app['debug'] = true;

$app->get('/', 'Controllers\HomeController::index');

$app->run();
Controllers/HomeController.php
PHP:
namespace Controllers;
 
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class HomeController{
	
	public function index(Request $request, Application $app) {
		var_dump('test'); die();
	}	
}

Если я где то набокопорил, прошу укажите место.
 

Новичок Silex

Новичок
http://getcomposer.org/doc/01-basic-usage.md#autoloading


Ты регистрировал неймспейс с контроллерами?
Спасибо за отклик на пост.
Простите за мою тугость, но я не совсем понял как это нужно сделать.
Если у меня структура проекта
root
->vendor
->controllers
->web

как правильно ,зарегистрировать namaspace для контролеров.
Смотрел линк который вы добавили к ответу, но ни чего не вышло
 

Вурдалак

Продвинутый новичок
Создай папку src, туда помести Controllers (именно так, с большой буквы, как и namespace). В composer.json добавь autoload аналогично тому, как сделано по ссылке. Запусти composer update и всё.

У тебя composer.json должен быть каким-то таким:
Код:
{
    "require": {
        // silex и всё такое
    },
    "autoload": {
        "psr-0": {
            "Controllers": "src/"
        }
    }
}
 

Новичок Silex

Новичок
В все равно не выходит.
в composer.json дописал
"autoload": {
"psr-0": {"Controllers": "src/"}
}
в корне сайта создал папку src в ней файл Controllers.php
его содержимое
PHP:
namespace Controllers;
 
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class HomeController{
	
	public function index(Request $request, Application $app) {
		var_dump('test'); die();
	}	
}
в index.php вызываю этот класс так
PHP:
$app->get('/', 'Controllers\HomeController::index');
.

Чувствую что виной всему моя глупость. Но все же хочется сегодня пойти спать победивши данную ситуацию
 

Новичок Silex

Новичок
PHP:
// autoload_namespaces.php generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Twig_' => $vendorDir . '/twig/twig/lib',
    'Symfony\\Component\\Validator\\' => $vendorDir . '/symfony/validator',
    'Symfony\\Component\\Translation\\' => $vendorDir . '/symfony/translation',
    'Symfony\\Component\\Serializer\\' => $vendorDir . '/symfony/serializer',
    'Symfony\\Component\\Security\\' => $vendorDir . '/symfony/security',
    'Symfony\\Component\\Routing\\' => $vendorDir . '/symfony/routing',
    'Symfony\\Component\\PropertyAccess\\' => $vendorDir . '/symfony/property-access',
    'Symfony\\Component\\Process\\' => $vendorDir . '/symfony/process',
    'Symfony\\Component\\OptionsResolver\\' => $vendorDir . '/symfony/options-resolver',
    'Symfony\\Component\\Locale\\' => $vendorDir . '/symfony/locale',
    'Symfony\\Component\\HttpKernel\\' => $vendorDir . '/symfony/http-kernel',
    'Symfony\\Component\\HttpFoundation\\' => $vendorDir . '/symfony/http-foundation',
    'Symfony\\Component\\Form\\' => $vendorDir . '/symfony/form',
    'Symfony\\Component\\Finder\\' => $vendorDir . '/symfony/finder',
    'Symfony\\Component\\Filesystem\\' => $vendorDir . '/symfony/filesystem',
    'Symfony\\Component\\EventDispatcher\\' => $vendorDir . '/symfony/event-dispatcher',
    'Symfony\\Component\\DomCrawler\\' => $vendorDir . '/symfony/dom-crawler',
    'Symfony\\Component\\CssSelector\\' => $vendorDir . '/symfony/css-selector',
    'Symfony\\Component\\Console\\' => $vendorDir . '/symfony/console',
    'Symfony\\Component\\Config\\' => $vendorDir . '/symfony/config',
    'Symfony\\Component\\BrowserKit\\' => $vendorDir . '/symfony/browser-kit',
    'Symfony\\Bridge\\Twig\\' => $vendorDir . '/symfony/twig-bridge',
    'Symfony\\Bridge\\Monolog\\' => $vendorDir . '/symfony/monolog-bridge',
    'Silex' => $vendorDir . '/silex/silex/src',
    'Psr\\Log\\' => $vendorDir . '/psr/log',
    'Pimple' => $vendorDir . '/pimple/pimple/lib',
    'Monolog' => $vendorDir . '/monolog/monolog/src',
    'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib',
    'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib',
);
 

AmdY

Пью пиво
Команда форума
$app->get('/', 'Controllers\\HomeController::index');
Не забывай экранировать \
 

Новичок Silex

Новичок
в консоли в корне сайта вызываю php composer update
в ответ оно мне следующие
PHP Deprecated: Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/ming.ini on line 1 in Unknown on line 0
Could not open input file: composer
 

Вурдалак

Продвинутый новичок
А как ты вообще Silex устанавливал? У тебя есть composer.phar? Это делается через него.
 

Вурдалак

Продвинутый новичок
Тебе нужно скачать composer.phar и выполнить
Код:
php composer.phar dump-autoload
Всё.
 

Новичок Silex

Новичок
После php composer.phar dump-autoload в autoload_namespaces.php. добавилась запись 'Controllers' => array($baseDir . '/src/Controllers'), но по прежнему ошибка та же

в папке src/Controllers находиться файл HomeController.php с классом контроллера
PHP:
namespace Controllers;
 
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class HomeController{
	
	public function index(Request $request, Application $app) {
		var_dump('test'); die();
	}	
}
может я как то не правильно назвал сам файл ?
или не правильно вызываю его ?
 
Сверху