Пользователи Symfony2 с доктриной - PullRequest
4 голосов
/ 19 декабря 2011

Я ищу рекомендации по извлечению контента, созданного пользователями.У меня есть $ user object form 'security.context', и мне нужно получить одну запись, созданную этим пользователем, с помощью $ record_id,

, что мне делать?

$this->getDoctrine()->getRepository('AcmeRecordBundle:Record')
->findOneBy(array( 'id' => $record_id, 'user' => $user->getId() ));

Это неЭто не очень хорошо для меня, потому что у меня есть много информации, которую нужно найти, чтобы найти пользователя (чтобы другие пользователи не пытались получить его по некоторому идентификатору).И для любого контента (личного фото, некоторого другого частного контента) я должен передать 'user' => $ user-> getId ()?

Или лучше создать UserRepository со всеми этими функциями?getRecordById ($ id), getPhotoById ($ id), getPrivateInformationById ($ id) и т. д.

Я немного работал с Rails, и там я смог определить метод current_user

def current_user
  return @current_user if defined?(@current_user)
  # ....
end

, а затем просто использовать его как

current_account.records.find(params[:id])

есть ли возможность заставить его работать так с Doctrine2 и Symfony2?Как

$user->getRecords()->find($recordId)

Ответы [ 4 ]

1 голос
/ 26 декабря 2011

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

0 голосов
/ 28 декабря 2011

Лично я обнаружил, что классы репозитория немного раздуваются в приложениях небольшого и среднего размера. Не уверен, каков ваш подход, но большинство всего, что я прочитал (и что я использовал в недавнем приложении Doctrine 2), было иметь слой «обслуживания», который манипулировал сущностями. Это b / c в D2, реализация сохранения / удаления и т. Д. В сущностях подрывает цель системы, которая заключается в том, чтобы облегчить знание постоянства от сущностей и рассматривать их как простые старые объекты Php (TM);)

Что мне показалось странным в вашем запросе, так это передача идентификатора первичного ключа и идентификатора пользователя для выборки пользователя. Мне кажется, что pk таблицы User будет идентификатором пользователя, или, по крайней мере, если идентификатор пользователя не является pk (не уверен, почему это так), вы сможете получить записи с помощью только рк. Вот метод получения объекта User в моей системе

/**
 * @param int $iId user id
 *
 * @return object
 */
public function fetch($iId)
{
    return $this->_oEm->find('AwesomeApp\Entity\User', $iId);
}

Текущая функция пользователя, которую вы ищете, должна быть связана с сеансом в вашем приложении. В zf я создал обработчик сеанса, который сохраняет объект User доктрины в хранилище сеансов, затем, когда сеанс читается, я повторно присоединяю объект User к Entity Manager. Вероятно, вы захотите сделать что-то подобное в sf, тогда вызов getCurrentUser вернет тот же объект User, что и его извлечение из базы данных. Хранение объекта User в сеансе исключает необходимость возвращаться к нему в базу данных при каждой загрузке страницы, например, если вы только что сохранили идентификатор пользователя в сеансе.

В конце дня вы «должны» помещать сложные запросы на выборку в репозитории, но, очевидно, это остается на усмотрение пользователя, когда дело доходит до лучших практик. В этом случае, когда у вас есть только ПК, я бы сказал, что нет смысла писать класс репозитория.

0 голосов
/ 28 декабря 2011

Вам необходимо реализовать функции ACL для Symfony 2. Это позволяет указать владельца для «доменных объектов» (отдельных экземпляров классов БД) и какой тип доступа имеют пользователи к объекту домена. Затем вы можете использовать, например, JMSSecurityExtraBundle и реализовать управление доступом на основе владения объектом. После внедрения ваши пользователи не смогут изменять объекты друг друга (путем манипулирования параметрами), и вам не понадобится дополнительный параметр в ваших запросах.

Вот несколько релевантных ссылок:

  1. Списки контроля доступа (ACL)
  2. JMSSecurityExtraBundle
0 голосов
/ 22 декабря 2011

Конечно, вы должны передать идентификатор пользователя для предложения "WHERE" sql, просто потому, что ROR сделал это волшебным образом за кулисами (что является очень плохой практикой imo), не означает, что он не делал это в все.

Что касается другого вопроса, оба решения в порядке:

  1. Получить данные из определенного хранилища и передать идентификатор объекта + идентификатор пользователя или:
  2. Создание методов, которые внутренне получают идентификатор пользователя и помещают их в запросы

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

...