【问题标题】:Setting up NEO4j in Symfony2在 Symfony2 中设置 NEO4j
【发布时间】:2015-07-04 14:52:11
【问题描述】:

我是 Symfony 的新手,已经开始阅读和玩弄。我能够安装 Symfony2 和 NEO4j 数据库。我还能够将引导程序包含到我的 Symfony 项目中并显示一个基本主页。

我现在想将我的项目连接到数据库。我想从注册和用户系统等基本功能开始。

我目前正在使用以下(通过 composer 安装):

    "everyman/neo4jphp": "dev-master",
    "hirevoice/neo4jphp-ogm": "dev-master",
    "klaussilveira/neo4j-ogm-bundle": "dev-master"

这些应该给我我需要的功能。然后我在 src 下创建了一个具有以下文件夹结构的 UserBundle:

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

但这似乎不起作用。我还需要在哪里设置连接详细信息?

更新

感谢 Christophe Willemsen 的回答。

由于身份验证不起作用而产生错误。通过导航到 Neo4j 安装文件夹并编辑“neo4j-server.properties”文件以允许所有访问,我现在可以将简单数据保存到图表中。我没有尝试实施任何检查或密码加密,但是非常基本的“创建具有属性的节点”现在可以工作了。

我现在想要完成的是:

  • 使密码保护 Neo4j 连接成为可能,并拥有 存储在 config.yml 文件中的连接信息
  • 创建并实施各种检查(电子邮件地址是否已在 DB / 密码是否足够强大...)
  • 创建和实施密码加密
  • 创建从 neo4j 数据库中获取数据的成员系统

如果您对我在哪里可以获得有关此主题的更多信息有任何提示,或者如果您已经做过类似的事情,我们将不胜感激。

已将文件添加到我下面的帖子中,以防它们对其他人有用。 请注意:我才刚刚开始学习 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-Book 中所述)

<?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-Book 中所述)

<?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-Book 中所述)

<?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 }

【问题讨论】:

    标签: php symfony doctrine-orm neo4j


    【解决方案1】:

    我在前一段时间(大约两年)完成了这个实现,但由于我不再使用这些供应商而没有更新它。

    这被分成了两个包,这可能会给你一些想法和例子:

    https://github.com/ikwattro/KwattroNeo4jOGMBundle

    https://github.com/ikwattro/Neo4jUserBundle

    基本上步骤很常见,很多信息都可以在 Symfony 文档中找到。

    1. 根据 neo4jphp-ogm 注释创建用户实体

    2. 创建用户提供程序 -> 安全性

    3. 创建一个用户管理器,在身份验证发生时检索用户

    关于您上次关于身份验证的错误,通过查看 klaussilvera/neo4j-ogm-bundle 上次提交日期,很有可能它不支持 2.2 中添加的 neo4j 身份验证。

    您可能希望为您的第一个测试禁用 neo4j 身份验证,或 fork 当前存储库并创建一个 PR,在捆绑包的 ConfigDefinition 中添加身份验证参数。

    【讨论】:

    • 感谢您的回答 Christophe Willemsen。我已经更新了我的帖子。您将如何创建和使用捆绑包的配置定义将身份验证传递给数据库?任何开始的帮助将不胜感激。亲切的问候
    • 我看的更深了。您是否在 config.yml 中使用“neo4j”作为数据库连接的用户名?
    • 我最初使用“neo4j”作为用户名yes,我使用的密码是我第一次登录Neo4j浏览器站点时设置的密码(使用默认用户名=neo4j和pw登录后) =neo4j 它会提示您设置新密码)。但问题似乎是,config.yml 文件中的数据似乎没有被使用。删除 config.yml 后,连接现在显然仍然有效,因为现在是 auth。 =假。如何检查配置文件是否被使用?我猜我还没有掌握 DependencyInjection 的概念。
    • 大家好,如何让 OGM 映射到数据库?我有所有的 OGM 注释,但是当我尝试加载存储库时,我得到一个“类实体\用户不存在”
    【解决方案2】:

    我现在已经创建了一个新的存储库,它似乎一直工作到现在:

    https://github.com/JoranBeaufort/Neo4jUserBundle

    小心:就像我说的,我不是 Symfony 或一般编程方面的专家。 Bundle 可能存在严重的安全问题。欢迎提出改进意见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2011-09-16
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多