2012-06-26 4 views
1

Я новичок Symfony2, столкнувшись с проблемами с редактированием форм и доктрины.symfony2 edit form & doctrine issue

Кажется, я как-то получаю поврежденный объект из своей базы данных.

Этот код работает отлично ...

$FormDebug = new Link(); 
$FormDebug->setUrl('http://www.mysite.com'); 

$editForm = $this->createFormBuilder($FormDebug) 
    ->add('url','url') 
    ->add('description','text') 
    ->getForm(); 

Хотя это не ...

$repository = $this->getDoctrine()->getRepository('HemekonomiLinksBundle:Link'); 
$user = $this->container->get('security.context')->getToken()->getUser();  

$userLink = $repository->findBy(
    array('id' => $id, 'user' => $user->getId()) 
); 


$editForm = $this->createFormBuilder($userLink) 
    ->add('url','url') 
    ->add('description','text') 
    ->getForm(); 

Так что я думаю, я получаю объект, что formbuilder не согласен. .? Нет сообщения об ошибке, так что я не получаю форму, заполненную фактическими значениями извлеченного объекта, а пустую форму.

Когда я var_dump() объект, возвращенный из БД, я вижу, что здесь есть правильные значения (вместе со всеми свойствами объекта-пользователя) - это то, что вызывает мою проблему? Объект, содержащий больше переменных, чем форма ?). Разумеется, причина в том, что пользователь находится там, чтобы сортировать только те строки ссылок из БД, принадлежащие этому конкретному пользователю.

UPDATE: Я добавил два параметра var_dump() здесь, сначала тип объекта, который я ожидал извлечь из БД (всего лишь пример для описания объекта), второй, который фактически извлекается, я вижу, что репозиторий- найти действие возвращает массив вместо объекта, но мой объект, кажется, включены ... почему я не знаю ...

Что я ожидал

object(Company\LinksBundle\Entity\Link)#556 (4) { ["id":protected]=> NULL ["user":protected]=> NULL ["description":protected]=> NULL ["url":protected]=> string(25) "http://www.mysite.com" } 

Что DB возвращает

array(1) { [0]=> object(Company\LinksBundle\Entity\Link)#553 (4) { ["id":protected]=> int(9) ["user":protected]=> object(Company\UserBundle\Entity\User)#145 (19) { ["id":protected]=> int(3) ["username":protected]=> string(5) "user1" ["usernameCanonical":protected]=> string(5) "user1" ["email":protected]=> string(6) "[email protected]" ["emailCanonical":protected]=> string(6) "[email protected]" ["enabled":protected]=> bool(true) ["salt":protected]=> string(31) "oltkauxmgw000w8wgw84ckggg8sw880" ["password":protected]=> string(88) "AFKlCO774d/4D8DHD3P/sXYYApS32jzdLm5GlZEICnOq8xyKT/xVjbnAziMUadecN0yBlxiH5QZK09s5KJxbsA==" ["plainPassword":protected]=> NULL ["lastLogin":protected]=> object(DateTime)#149 (3) { ["date"]=> string(19) "2012-06-27 07:04:24" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "Europe/Stockholm" } ["confirmationToken":protected]=> NULL ["passwordRequestedAt":protected]=> NULL ["groups":protected]=> NULL ["locked":protected]=> bool(false) ["expired":protected]=> bool(false) ["expiresAt":protected]=> NULL ["roles":protected]=> array(0) { } ["credentialsExpired":protected]=> bool(false) ["credentialsExpireAt":protected]=> NULL } ["description":protected]=> string(22) "Beskrivning av länken" ["url":protected]=> string(16) "http://testlink.se" } } 

Что здесь происходит, когда БД возвращает фактический объект ссылки и связанный с ним объект пользователя, и моя работа - отсеять одну из двух, что я хочу?

Если да, есть ли способ, уже находящийся в репозитории-> найти, чтобы указать, что хотя я WHERE в поле пользователя в моем операторе find, мне не интересно SELECTing объекта пользователя, я хочу только, ТАБЛИЦА СВЯЗЕЙ? (Ссылка объекта в symfony2 термины, я думаю ...)?

ответ

0

OK,

поэтому после некоторых более проб и ошибок я обнаружил, что моя находка-метод вызывает проблемы. по-видимому, findBy (массив) также возвращает массив, в порядке для получения этого единственного объекта для редактирования мне нужно найти find ($ id), с помощью которого я теряю функциональность SELECT только i f пользователь пытается отредактировать свою «собственную» ссылку ...

Я все равно узнал, что способ, которым я занимался (сравнивая имя пользователя, а не идентификатор), может быть не лучшим образом ...

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

1
  1. Неплохая практика (возможно) использовать конструктор форм каждый раз вместо создания класса формы.
  2. Попробуйте запустить php app/console generate:doctrine:form MyApp:Myentity и с помощью класса формы (после установки опции data_class - см the manual в разделе «Установка data_class»
  3. var_dump каждый объект (ссылка отладки и ссылка извлекается из базы данных) и размещать их, если вы можете.