在Symfony2

时间:2015-07-04 14:52:11

标签: php symfony doctrine-orm neo4j

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

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

我目前正在使用以下内容(通过作曲家安装):

    "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');
    }
}

&#34; /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;
    }
}

&#34; /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;
    }
}

&#34; /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';
    }
}

&#34; /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';
    }
}

&#34; /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 }

2 个答案:

答案 0 :(得分:2)

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

这是分为两个部分,这可能会给你一些想法和例子:

https://github.com/ikwattro/KwattroNeo4jOGMBundle

https://github.com/ikwattro/Neo4jUserBundle

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

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

  2. 创建用户提供商 - &gt;安全

  3. 创建将在身份验证发生时检索用户的用户管理器

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

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

答案 1 :(得分:0)

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

https://github.com/JoranBeaufort/Neo4jUserBundle

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