1

(1 ответов, оставленных в Doctrine 2.x)

Название темы не совсем соответствует вопросу, но я так и не придумал чего-то более адекватного.

В системе есть такое понятие, как "платеж". Информация по ним хранится в таблице payments (сущность Payment). Есть несколько других сущностей, которые имеют связь с платежами OneToMany. Чтобы как-то разделить платежи между сущностями, они связываются с ними не только по ID, но и по еще одному полю entity.

Стандартное описание связи OneToMany в классах сущностей связывает записи по ID:

/**
     * @ORM\OneToMany(targetEntity="App\MyBundle\Entity\Payment", mappedBy="pid")
     *
     * @var ArrayCollection
     */

    protected $payments;

Как добавить сюда еще один критерий выборки - значение которого подставлялось бы в аннотации? Ну если пофантазировать, то это могло бы выглядеть как-то так

/**
     * @ORM\OneToMany(targetEntity="App\MyBundle\Entity\Payment", mappedBy="pid", criteria={"entity":user})
     *
     * @var ArrayCollection
     */

    protected $payments;

И должно сгенерировать нечто похожее на:

... pid = 99 AND entity = "user"...

Извините, если описал очень сумбурно.

2

(15 ответов, оставленных в Symfony 2.0—2.2)

Да, есть isGranted. Но я так и не понял, как мне передать в него создаваемый "на лету" объект ObjectIdentity(), поэтому пришлось свой экстеншен добавить.

3

(15 ответов, оставленных в Symfony 2.0—2.2)

Да, спасибо. Как раз только что сообразил, что можно свой is_granted написать, в котором создавать ObjectIdentity()

4

(6 ответов, оставленных в Курилка)

brizzz пишет:

Вообще хотелось бы шаблон на бутстрапе и бесплатно  Это реально? Просто не приходилось испольовать готовые шаблоны

Реально, конечно, если знакомы с системой шаблонизации конкретной выбранной CMS. Берете бутстрап, верстаете на нем тему для того же wordpress. Но, как уже говорили, лучше или готовую тему брать или отдать на фриланс, если нет должного опыта работы с CMS.

5

(15 ответов, оставленных в Symfony 2.0—2.2)

Еще раз всем спасибо за ответы. Подключил ACL, написал свой небольшой менеджер по выдаче прав ролям.

В контроллерах все чудесно работает

if (!$securityContext->isGranted('VIEW', new ObjectIdentity('class', 'App\\MyBundle\\Entity\\MyEntity'))) {
            throw new AccessDeniedException();
        }

Но я никак не могу понять, каким образом аналогичную конструкцию использовать в twig шаблонах. То есть имеется основное меню приложения, в котором я хочу скрывать те или иные пункты, в зависимости от возможностей роли пользователя.

Подскажите, куда копать. спасибо.

6

(15 ответов, оставленных в Symfony 2.0—2.2)

Всем спасибо за ответы.
Что касается моих переживаний о производительности, то, наверное, я неверно выразился изначально. Ситуация с реляционными хранилищами мне ясна, определенно. Просто на  одном из форумов я видел замечание о том, что у FOS падает быстродействие по мере роста системы. Это было преподнесено так, будто это первая проблема, с которой придется столкнуться и чуть ли не сразу. Вероятно, автор несколько преувеличил, а я повелся default/smile

Стандартные механизмы Symfony - хороший выбор под эту задачу.

Я уже думал над этим - написать свой небольшой сервис, который решит данную задачу. Но очень не хочу велосипедить, особенно учитывая то, что мой опыт пока крайне мал и, скорее всего, получится велосипед без колес.

7

(15 ответов, оставленных в Symfony 2.0—2.2)

Чего вы все такие агрессивные?
Я в своем посте вполне четко описал проблемы, которые меня волнуют: производительность и сложность/простота кастомизации. Причем спрашивал именно про FOS. Разве это просьба провести обзор всех возможных бандлов или дать готовое решение? Я лишь пытаюсь локализовать зону поиска того, что мне нужно и найти правильный вектор.

Про кастомизацию не совсем согласен. Несмотря на скромный опыт работы с Symfony 2 встречал очень разные бандлы: одни настраиваются вдоль и поперек вполне нативными средствами. Другие проще выкинуть, чем допилить. Тот, кто плотно работал с упомянутым FOS, вероятно, сможет отнести его к той или иной категории.

8

(15 ответов, оставленных в Symfony 2.0—2.2)

Я не писал, что хорошо читал про FOS. Я читал про ACL (2 первых ссылки из вашего списка). Ситуация с FOS для меня пока не ясна.
Вы можете сказать что-нибудь по существу?

9

(15 ответов, оставленных в Symfony 2.0—2.2)

FOS я смотрел и где-то читал комментарии о том, что с ростом системы (бд) он начинает проседать на производительности. Насколько я понял, он для каждой сущности сохраняет в бд информацию о правах  (владелец и т.п). База растет  и растет время обработки sql запросов. Это так?
Для меня этот вопрос важен, так как я занимаюсь разработкой системы документооборота и большая часть таблиц будет иметь огромное количество записей.

Документацию про ACL я читал конечно же. Насколько я понимаю, FOS не дополняет родной ACL, а предлагает полностью свой?

10

(15 ответов, оставленных в Symfony 2.0—2.2)

Необходимо разграничить права доступа в проекте. Достаточно стандартные потребности:

1. Создание групп пользователей (роли).
2. Ограничение на уровне групп + понятие "владелец" сущности.
3. Управление правами групп из панели. Здесь, наверное, точнее будет сказать, что права нужно читать из базы. Сохранять их туда - отдельная история.
4. Работа по принципу:

if ($acl->isGranted('edit', $entity)) {
...
}

Я смотрел несколько бандлов, но из документации не совсем понял, способны ли они на то, что мне требуется. Узким местом становятся группы. Вероятно, можно взять какой-то бандл и кастомизировать его под свои нужды, но я серьезно боюсь задач такого плана, так как с симфонией пока знаком очень плохо.

Собственно вопрос в том, какой бандл из существующих максимально близок к тому, что мне нужно. Не исключаю, что я мог пропустить нужный или просто сделать неверные выводы. Ожидаю мнения того, кто реализовывал нечто близкое к моей задаче и может рекомендовать использованные инструменты. Еще больше буду признателен за какие-нибудь полезные ссылки.

11

(1 ответов, оставленных в Symfony 2.0—2.2)

Что-то не то компосер мне наставил, так как файл /Symfony/Component/Form/Extension/Core/Type/RepeatedType.php действительно регистрировал параметры с именем firstName, хотя валидатор типа использовал стандартное first_name. Судя по всему, зацепил из dev версии чей-то оригинальный коммит.
Вопрос решен.

12

(1 ответов, оставленных в Symfony 2.0—2.2)

Здравствуйте.
Делаю свой первый проект на Symfony и столкнулся с проблемой, которую никак не могу решить. Мне необходимо создать два поля: пароль и его повторный ввод. Использую для этого тип repeated, но на странице с формой получаю ошибку

The option "first_name" does not exist. Known options are: "attr", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_protection", "csrf_provider", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "firstName", "first_options", "intention", "invalid_message", "invalid_message_parameters", "label", "label_attr", "mapped", "max_length", "options", "pattern", "post_max_size_message", "property_path", "read_only", "required", "second_name", "second_options", "translation_domain", "trim", "type", "validation_constraint", "validation_groups", "virtual"

При этом код имеет вид:

->add('password', 'repeated', array(
                'type' => 'password',
                'first_name' => 'password',
                'second_name' => 'confirm',
                'first_options' => array('label' => 'user.form.label.first_password'),
                'second_options' => array('label' => 'user.form.label.second_password'),
            ))

Весь код файла http://pastebin.com/eAK2amr0

Если убрать параметр first_name, то получаю ошибку "The option "first_name" does not exist."

Код экшена контроллера, где происходит вызов конструктора формы:

/**
     * @Template()
     */

    public function formAction($id = 0) {
        $em = $this->getDoctrine()->getManager();
 
        if ($id) {
            $user = $em->getRepository('SefidaUserBundle:User')->find($id);
 
            if (!$user) {
                throw new NotFoundHttpException($this->get('translator')->trans('user.exception.404'));
            }
 
            $this->originalRoles = $user->getRoles();
        } else {
            $user = new User();
        }
 
        $form = $this->createForm(new UserType(), $user);
 
        $request = $this->getRequest();
 
        if ($request->isMethod('POST')) {
            $form->bind($request);
 
            if ($form->isValid()) {
                $user->makeRelevantRoles($this->originalRoles);
                $em->persist($user);
                $em->flush();
 
                return $this->redirect($this->generateUrl('_users_form', array(
                    'id' => $user->getId()
                )));
            }
        }
 
        return array(
            'form' => $form->createView()
        );
    }

Объясните, пожалуйста, что я делаю не так?