Я новичок в Symfony и начал читать и рассказывать. Я смог установить Symfony2 и базу данных NEO4j. Я также смог включить bootstrap в свой проект Symfony и показать основную домашнюю страницу.
Теперь я хотел бы подключить свой проект к базе данных. Я хотел бы начать с базовой функциональности, такой как регистрация и пользовательская система.
В настоящее время я использую следующий (установленный через композитор):
"everyman/neo4jphp": "dev-master", "hirevoice/neo4jphp-ogm": "dev-master", "klaussilveira/neo4j-ogm-bundle": "dev-master"
Это должно дать мне необходимую мне функциональность. Затем я создал UserBundle под src со следующей структурой папок:
src |-Controller |-DependencyInjection |-Entity |-Form |-Ressources |-UserBundle.php
Теперь я хотел бы пройти учебник по адресу http://symfony.com/doc/current/cookbook/doctrine/registration_form.html, но вместо использования своей базы данных я бы хотел использовать Neo4j. Может ли кто-нибудь указать, где и как я должен манипулировать кодом учебника, чтобы иметь возможность регистрировать пользователя на графике neo4j? Я пробовал себя, но документация скудна для neo4j-ogm, и я только породил ошибки при ошибках. Теперь я удалил Bundle и снова создал его, чтобы начать заново.
Я особенно интересуюсь, если они являются шагами, которые считаются общими знаниями и, таким образом, не учитываются?
Теперь я смог настроить все, чтобы была показана форма регистрации. Но при отправке отображается следующая ошибка:
Unable to commit batch [401]: Headers: Array ( [Date] => Sun, 05 Jul 2015 13:08:20 GMT [Content-Type] => application/json; charset=UTF-8 [WWW-Authenticate] => None [Content-Length] => 139 [Server] => Jetty(9.2.4.v20141103) ) Body: Array ( [errors] => Array ( [0] => Array ( [message] => No authorization header supplied. [code] => Neo.ClientError.Security.AuthorizationFailed ) ) ) 500 Internal Server Error - Exception
Я предполагаю, что моя аутентификация подключения не работает. В моем config.yml я определил следующее соединение:
# Neo4j config neo4j_ogm: transport: 'curl' host: 'localhost' port: 7474 username: 'foo' password: 'bar' debug: true
Но это, похоже, не работает. Где еще мне нужно настроить данные о соединении?
Обновить
Спасибо Кристоф Виллемсен за ваш ответ.
Ошибка возникла из-за того, что аутентификация не работала. Перейдя в папку установки Neo4j и отредактировав файл «neo4j-server.properties», чтобы разрешить весь доступ, теперь я могу сохранить простые данные на графике. Я не пытался реализовать какие-либо проверки или парольные шифрования, но теперь работает очень простой «создать узел со свойствами».
То, что я хотел бы сделать сейчас, будет следующим:
Если у вас есть какие-либо советы о том, где я могу получить дополнительную информацию по этой теме, или если вы уже сделали что-то подобное, вам будет оказана помощь.
Добавили файлы к моему сообщению ниже, если они полезны для кого-то другого. Имейте в виду: я только начал изучать Symfony и Neo4j, и код мог содержать ошибки или основные уязвимости . Я также попытаюсь обновить этот пост, если мне удастся внедрить дальнейшие связанные с neo4j вещи.
В файле «neo4j-server.properties» (находящемся под «/ etc / neo4j» в моей установке) отредактируйте следующие строки как таковые:
# Let the webserver only listen on the specified IP. Default is localhost (only # accept local connections). Uncomment to allow any connection. Please see the # security section in the neo4j manual before modifying this. org.neo4j.server.webserver.address=0.0.0.0 # Require (or disable the requirement of) auth to access Neo4j dbms.security.auth_enabled=false
В моем UserBundle следующие файлы могут быть интересны другим: «/src/UserBundle/Controller/AccountController.php»
<?php // src/Acme/AccountBundle/Controller/AccountController.php namespace UserBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use UserBundle\Form\Type\RegistrationType; use UserBundle\Form\Model\Registration; use Symfony\Component\HttpFoundation\Request; // use HireVoice\Neo4j\EntityManager as EntityManager; class AccountController extends Controller { public function registerAction() { $registration = new Registration(); $form = $this->createForm(new RegistrationType(), $registration, array( 'action' => $this->generateUrl('account_create'), )); return $this->render( 'UserBundle:Account:register.html.twig', array('form' => $form->createView()) ); } public function createAction(Request $request) { $em = $this->container->get('neo4j.manager'); //$repo = $em->getRepository('Entity\\User'); $form = $this->createForm(new RegistrationType(), new Registration()); $form->handleRequest($request); if ($form->isValid()) { $registration = $form->getData(); $em->persist($registration->getUser()); $em->flush(); return $this->redirectToRoute('account_success'); // return $this->redirect('http://4740.hostserv.eu/twohive/web/app_dev.php/register/success'); } return $this->render( 'UserBundle:Account:register.html.twig', array('form' => $form->createView()) ); } public function successAction() { return $this->render('UserBundle:Account:success.html.twig'); } }
"/src/UserBundle/Entity/User.php"
<?php // src/UserBundle/Entity/User.php namespace UserBundle\Entity; use HireVoice\Neo4j\Annotation as OGM; /** * @OGM\Entity */ class User { /** * @OGM\Auto */ protected $id; /** * @OGM\Property * @OGM\Index */ protected $email; /** * @OGM\Property */ protected $plainPassword; public function getId() { return $this->id; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } public function getPlainPassword() { return $this->plainPassword; } public function setPlainPassword($password) { $this->plainPassword = $password; } }
"/src/UserBundle/Form/Model/Registration.php" (как описано в книге Symfony)
<?php // src/Acme/AccountBundle/Form/Model/Registration.php namespace UserBundle\Form\Model; use Symfony\Component\Validator\Constraints as Assert; use UserBundle\Entity\User; class Registration { /** * @Assert\Type(type="UserBundle\Entity\User") * @Assert\Valid() */ protected $user; /** * @Assert\NotBlank() * @Assert\True() */ protected $termsAccepted; public function setUser(User $user) { $this->user = $user; } public function getUser() { return $this->user; } public function getTermsAccepted() { return $this->termsAccepted; } public function setTermsAccepted($termsAccepted) { $this->termsAccepted = (bool) $termsAccepted; } }
"/src/UserBundle/Form/Type/RegistrationType.php" (как описано в книге Symfony)
<?php // UserBundle/Form/Type/RegistrationType.php namespace UserBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; class RegistrationType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('user', new UserType()); $builder->add( 'terms', 'checkbox', array('property_path' => 'termsAccepted') ); $builder->add('Register', 'submit'); } public function getName() { return 'registration'; } }
"/src/UserBundle/Form/Type/UserType.php" (как описано в книге Symfony)
<?php // UserBundle/Form/Type/UserType.php namespace UserBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('email', 'email'); $builder->add('plainPassword', 'repeated', array( 'first_name' => 'password', 'second_name' => 'confirm', 'type' => 'password', )); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'UserBundle\Entity\User' )); } public function getName() { return 'user'; } }
"/src/UserBundle/Resources/config/routing.yml"
account_register: path: /register defaults: { _controller: UserBundle:Account:register } account_create: path: /register/create defaults: { _controller: UserBundle:Account:create } account_success: path: /register/success defaults: { _controller: UserBundle:Account:success }
Я сделал эту реализацию некоторое время назад (~ два года), но не обновил ее из-за того, что я больше не использую этих поставщиков.
Это было разделено на две части, и это может дать вам несколько идей и примеров:
https://github.com/ikwattro/KwattroNeo4jOGMBundle
https://github.com/ikwattro/Neo4jUserBundle
В основном этапы являются общими, и много информации можно найти в документации Symfony.
Создайте свою базу данных пользователя в аннотациях neo4jphp-ogm
Создание поставщика услуг -> безопасность
Создайте диспетчер пользователей, который будет извлекать пользователей при аутентификации
Что касается вашей последней ошибки в отношении аутентификации, взглянув на последнюю дату фиксации klaussilvera/neo4j-ogm-bundle
, вероятность того, что она не поддерживает аутентификацию neo4j, добавленную в 2.2.
Вы можете отключить аутентификацию neo4j для своих первых тестов или разветвить текущий репозиторий и создать PR, добавляющий параметры аутентификации в ConfigDefinition пакета.
Теперь я создал новый репозиторий, который, похоже, работает до сих пор:
https://github.com/JoranBeaufort/Neo4jUserBundle
Будьте осторожны: как я уже сказал, я не специалист в Symfony или программирование в целом. У Bundle могут быть серьезные проблемы с безопасностью. Подсказки к улучшению приветствуются.