Pull to refresh

Comments 15

Routes лучше конфигурировать отдельно. В контроллер инжектнуть request, response и app на случай если надо сделать редирект или бросить исключение. А сами контролеры делать через callable фабрику в pimple. Получается очень даже секси
Просто логичнее редактировать внешний файл, чем класс если нужно добавить или поменять что-то
Что-то вы намудрили с моделями. Почему просто не прописать в секцию «autoload» путь к вашим моделям?

Либо сделать ещё проще:

    "autoload": {
        "psr-0": { "App": "src/" }
    },

Тогда создание модели сводится к:

$person = new \App\Model\Person();

И зачем передавать в модель весь контейнер $app? Лучше явно передавать все зависимости:

$person = new \App\Model\Person($app['db']);

Если у вас много моделей, можно сделать фабрику:

$app['models_factory'] = $app->protect(function ($modelName) {
    $fqcn = '\\App\\Model\\'.$modelName;
    return new $fqcn($app['db']);
});

Вызов:

$preson = $app['models_factory']('Person');

Хотя я предпочитаю явно всё прописывать, это позволяет «шарить» созданные объекты:

$app['repository.organization'] = $app->share(function() use ($app) {
    return new \App\Repository\OrganizationRepository($app['db']);
});

$app['repository.person'] = $app->share(function() use ($app) {
    return new \App\Repository\PersonRepository($app['db']);
});

...


P.S. Создавать ControllerCollection проще через фабрику, как рекомендуется в документации:

$controllers  = $app['controllers_factory'];
Заставили задуматься. Ваш вариант сильно проще и естественнее. Единственное, если понадобятся какие-то настройки для моделей (помимо указания пути к ним), как по мне, провайдер будет уместнее. Спасибо за совет, люблю простоту и ваш способ мне нравится.

P.S. Да, знаю, как написано в документации, но мой PhpStorm не хотел «разворачивать» вызов фабрики и предупреждал, что переменная не инициализирована, поэтому с тех пор пишу длинное "new ControllerCollection(new Route());". Понимаю, что можно закрыть глаза и это совершенно не критично — лишь дело привычки.
Вариант для PhpStorm ;)

/** @var $controllers \Silex\ControllerCollection */
$controllers = $app['controllers_factory'];
Боюсь ваш composer.json не установит ничего, а выдаст ошибку: The requested package silex/silex could not be found in any version…

Нужно добавить инструкцию «minimum-stability»:«dev» или добавить суффикс dev в строке «silex/silex»:«1.0.*dev»
Я столкнулся с такой же проблемой, как и парсер в вашем комментарии — он «умно» подставляет соответствующего пользователя с хабра. Забыл, что нельзя просто убрать «dev». Сейчас поправлю статью.
А не проще ли просто заюзать Symfony2 если Ваш проект выходит за рамки выдачи 4-5 страничек? Там уже это все уже как-то структурировано и разложено по палочкам, к тому же DI имеется?)
Тут дело вкуса: либо отпиливать ненужное, либо допиливать необходимое. Я еще молодой, не написался велосипедов, поэтому второй подход меня радует больше :)
О чем вы? Сам Silex по-сути и есть DIC
Symfony заюзать как раз совсем не проще :) Вопрос целесообразности, для многих проектов MicroMVC подходит более чем «толстый» Symfony.
по моему, использовать для таких целей Silex как-то не то…
Почему вы так считаете? Есть мнение, что Silex немного больше, чем просто микро-фреймворк. Его расширяемость наталкивает на написание таких штук, да и сами разработчики поощряют создание всевозможных дополнений, позиционируя свой продукт как конструктор.
Only those users with full accounts are able to leave comments. Log in, please.