Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
try {
$model->save($user);
echo 'ok. user saved';
} catch (DuplicateEntryException $e) {
echo 'error. user already exists';
}
DuplicateEntryException бросает обертка над PDO (при нарушении unique constraint):class DB {
//constructor, etc
public function query($query) {
try {
$this->pdo->query($query);
} catch (PDOException $e) {
switch ($e->errorInfo[1]) {
case 1062:
throw new DuplicateEntryException($e->getMessage());
//other codes
default:
throw $e;
}
}
}
}
Но уж точно, что за сохранение сущности контроллер не должен отвечать.
Вы делаете свои велосипеды для стандартных компнентов, то используйте лучше Yii ;)
Вам что-то не понравилось в формах
и Вы делаете свои велосипеды для стандартных компнентов, то используйте лучше Symfony
Очень тяжело расширяемый, не предоставляющый необходимых возможностей компонент.
А насчет возможностей? Просто ради интереса, чего Вам не хватает?
можно копнуть глубже и посмотреть как компонент устроен внутри
example.html.twig:
{{ widget($field) }}
Вот тут вообще проблемы не вижу :) Вплоть до того, что пользователи сами будут шаблоны для форм и полей делать.
слишком сложно, гораздо проще делать так:
Суть в том, что бы пользователь работал с WYSIWYG, со вставкой служебных конструкций для определения полей.
ну а {{ form_widget(form) }} Вам чем не так? Вообще мы говорили о маппинге данных в поля формы или как?
Ну а я о чем, берете сырые данные из WYSIWYG сохраняете, чтобы их отредактировать позже можно было. Обрабатываете служебные конструкции, чтобы получить параметры
Как подсунуть нужны шаблон для Symfony Forms?
Как маппить конкретное поле в конкретный form_widget?
Как в сложные виджеты передать список возможных значений для конкретного поля?
Отлично, что делать когда вам никто не дает денег на парк серверов, а нагрузки предвидятся нехилые такие?Писать на Erlang. Разве кто-то утверждает, что sf2 создан для хайлоада?
Проблема в том, что мы не штампуем по 5 сайтов за месяц.Проблема в том, что вы выбрали инструмент, который вам не подходит. Как вообще выбор пал на sf2, если у вас в штате мало php-разработчиков, знакомых с ним?
У вас относительно краткосрочные или шаблонные проекты?Зачем тут sf2? Для шаблонных проектов существуют CMS и специально обученные люди.
Не хватает квалификации чтобы без фреймворка написать слабосвязанный код?Не хватает. Не каждый коллектив разработчиков являет собой лигу выдающихся джентльменов.
Так что, если резюмировать, то отказываться от Symfony так сразу я не предлагаю. Но и думать, что данный фреймворк — серебряная пуля тоже не надо. При выборе технологии всегда голову включать надо.Точно. Только я так и не понял, откуда следует, что отказываться от sf2 вообще надо.
Отлично, а Erlang так много народу знает?Я утрировал, говоря об Erlang. Почему бы не разрабатывать на Java?
Или заказчик возьмет и радостно оплатит обучение команды, по вашему?Symfony2 тоже требует некоторого обучения, однако, вас это не остановило.
Я как-то привык сначала код писать, а потом только с профайлером его оптимизировать. Конечно, выбор адекватных алгоритмов еще на этапе написания никто не отменял.Избыточная оптимизация алгоритмов — это экономия на спичках, в случае интерпретируемых языков c динамической типизацией. Я склоняюсь к тому, что код должен быть, в первую очередь, читаемым и легко поддерживаемым. Вы можете спокойно спать, зная, что элемент массива, содержащий целое число, в php занимает 144 байта? Я вот могу. И при этом не говорю, что php плохой язык.
Но проблема не в кол-ве сотрудников, а в том, что конкретно этот фреймворк слишком сложен.Я и не говорил, что проблема в количестве сотрудников, я сказал, что вы выбрали не тот фреймворк, а возможно, и язык. В мире php не так часто встречаются паттерны сложнее синглтона, а sf2, как вы справедливо заметили, состоит из одних абстракций — но ведь это всё ради удобства разработки. Программистам, впервые видящим все эти фабрики и контейнеры, остаётся только впасть в академический транс — думаю, в этом виноват не только фреймворк.
90% сайтов — это простейший уровень в плане программирования. Так почему тогда фреймворк для этого простейшего уровня должен быть таким монструозным?Почему вы решили, что sf2 — фреймворк для этого простейшего уровня?
Так нужен хотя бы один или пара действительно сильных на проект, чтобы написать ядро, а рутинную работу можно и более младшим сотрудникам поручить. В чем проблема-то? Совершенно классический расклад.Вы предлагаете писать индивидуальный каркас для каждого приложения, чтобы избежать использования фреймворков? Я понимаю, бывают ситуации, когда такой подход оправдан. Но разве это повод не использовать фреймворки в остальных случаях?
Мы два месяца искали одного PHP'шника! И это без указания конкретного фреймворка!Вы искали иголку в стоге сена, вместо того, чтобы явно указать необходимые навыки. Я лишь это хотел сказать. Ситуация на рынке — это тоже не вина фреймворка.
Возможно, я не прав, но у меня сложилось впечатление, что вы меряете людей по себе. Меня от этого, к счастью отучили, хотя и непросто это было.Возможно, вы правы, но я честно стараюсь быть объективным.
У контроллеров есть метод getUser(). Отлично, а где этот юзер присваивается? А как изменить этот? А будет ли это очевидно?
Вполне можно обойтись суперглобальными массивами, а не плодить обертки типа Request.
Symfony не сложен, но, да согласен, у него высокий порог вхождения.
Меня зовут Андрей и я 4 месяца разрабатываю на Symfony2
Вот сейчас не могу понять, как правильно сделать форму, количество полей в которой может меняться на стороне клиента.
Если есть какие-то конкретные вопросы. Спрашивайте, я помогу.
Используй стабильные версии бандлов, если есть такая возможность. А если нет, то обновляй зависимости как можно чаще. Ошибки лучше всего исправлять по мере их появления. Когда ты насобираешь много обновлений, то и устранить все проблемы несовместимости, будет намного сложнее.
{ ...
"minimum-stability": "stable",
}
Я имелл ввиду, что есть 3-d party bundles. Для которых нет еще стабильных версий. Их то и нужно обновлять почаще.
Problem 3
— symfony/assetic-bundle v2.1.2 requires kriswallsmith/assetic 1.1.* -> no matching package found.
— symfony/assetic-bundle v2.1.1 requires kriswallsmith/assetic 1.1.* -> no matching package found.
— symfony/assetic-bundle v2.1.0 requires kriswallsmith/assetic 1.1.* -> no matching package found.
— Installation request for symfony/assetic-bundle 2.1.* -> satisfiable by symfony/assetic-bundle v2.1.0, symfony/assetic-bundle v2.1.1, symfony/assetic-bundle v2.1.2.
{
"name": "symfony/framework-standard-edition",
"description": "The \"Symfony Standard Edition\" distribution",
"autoload": {
"psr-0": { "": "src/" }
},
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.1.*",
"doctrine/orm": ">=2.2.3,<2.5-dev",
"doctrine/doctrine-bundle": "1.1.*",
"twig/extensions": "1.0.*@dev",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.1.*",
"symfony/monolog-bundle": "2.1.*",
"sensio/distribution-bundle": "2.1.*",
"sensio/framework-extra-bundle": "2.1.*",
"sensio/generator-bundle": "2.1.*",
"jms/security-extra-bundle": "1.2.*",
"jms/di-extra-bundle": "1.1.*",
"kriswallsmith/assetic": "1.1.*@dev"
},
"scripts": {
"post-install-cmd": [
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
],
"post-update-cmd": [
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
]
},
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
"branch-alias": {
"dev-master": "2.1-dev"
}
}
}
{
"kriswallsmith/assetic": "1.1.*@dev"
}
{
"kriswallsmith/assetic": "1.1.0-alpha4"
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string path, command, full;
cout<<"Console path: ";
cin>>path;
path = "php " + path + " ";
while(true){
cout<<"Command: ";
cin>>command;
full = path + command;
system(full.c_str());
}
}
Не делай сервисы зависимые от контейнера
Каким бы я хотел видеть свой первый проект на Symfony