Laravel form data not saving in neo4j graph DB

2019-08-12 23:27发布

问题:

I wrote a laravel form, its screen shot is as given below:

And I use neo4j for storing that form data.
Here is the code:
app/views/duck-form.blade.php

<!doctype html>
<html>
<head>
    <title>Laravel Form Validation!</title>

    <!-- load bootstrap -->
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
    <style>
        body    { padding-bottom:40px; padding-top:40px; }
    </style>
</head>
<body class="container">

<div class="row">
    <div class="col-sm-8 col-sm-offset-2">

        <div class="page-header">
            <h1><span class="glyphicon glyphicon-flash"></span> Register! </h1>
        </div>

        @if ($errors->has())
        <div class="alert alert-danger">
            @foreach ($errors->all() as $error)
                {{ $error }}<br>        
            @endforeach
        </div>
        @endif

        <!-- FORM STARTS HERE -->
        <form method="POST" action="/ducks" novalidate>

            <div class="form-group @if ($errors->has('name')) has-error @endif">
                <label for="name">Name</label>
                <input type="text" id="name" class="form-control" name="name" placeholder="Enter your name" value="{{ Input::old('name') }}">
                @if ($errors->has('name')) <p class="help-block">{{ $errors->first('name') }}</p> @endif
            </div>

            <div class="form-group @if ($errors->has('email')) has-error @endif">
                <label for="email">Email</label>
                <input type="text" id="email" class="form-control" name="email" placeholder="Enter your email id" value="{{ Input::old('email') }}">
                @if ($errors->has('email')) <p class="help-block">{{ $errors->first('email') }}</p> @endif
            </div>

            <div class="form-group @if ($errors->has('password')) has-error @endif">
                <label for="password">Password</label>
                <input type="password" id="password" class="form-control" name="password">
                @if ($errors->has('password')) <p class="help-block">{{ $errors->first('password') }}</p> @endif
            </div>

            <div class="form-group @if ($errors->has('password_confirm')) has-error @endif">
                <label for="password_confirm">Confirm Password</label>
                <input type="password" id="password_confirm" class="form-control" name="password_confirm">
                @if ($errors->has('password_confirm')) <p class="help-block">{{ $errors->first('password_confirm') }}</p> @endif
            </div>

            <button type="submit" class="btn btn-success">Submit</button>

        </form>

    </div>
</div>

</body>
</html>

1. I added 'Artdarek\Neo4j\Neo4jServiceProvider' to providers array in app/config/app.php.
2. I added neo4j configuration in app/config/database.php

 'neo4j' => [
            'default' => [
            'host'     => 'localhost',
            'port'     => 7474,
            'username' => null,
            'password' => null,
        ],
    ],

3. Then I added a controller for that form:

<?php

class DuckController extends BaseController {

    public function showWelcome()
    {
        return View::make('duck');
    }

}  

4. This is my routes.php.

<?php

Route::get('/', function()
{
    return View::make('hello');
});

// route to show the duck form
Route::get('ducks', function() 
{
    return View::make('duck-form');
});

// route to process the ducks form
Route::post('ducks', array('before' => 'csrf', function()
{

    // create the validation rules ------------------------
    $rules = array(
        'name'             => 'required',                       // just a normal required validation
        'email'            => 'required|email|unique:ducks',    // required and must be unique in the ducks table
        'password'         => 'required',
        'password_confirm' => 'required|same:password'          // required and has to match the password field
    );

    // create custom validation messages ------------------
    $messages = array(
        'required' => 'The :attribute is really really really important.',
        'same'  => 'The :others must match.'
    );

    // do the validation ----------------------------------
    // validate against the inputs from our form
    $validator = Validator::make(Input::all(), $rules, $messages);

    // check if the validator failed -----------------------
    if ($validator->fails()) {
        // redirect our user back with error messages       
        $messages = $validator->messages();

        // also redirect them back with old inputs so they dont have to fill out the form again
        // but we wont redirect them with the password they entered

        return Redirect::to('ducks')
            ->withErrors($validator)
            ->withInput(Input::except('password', 'password_confirm'));

    } else {
        // validation successful ---------------------------

        // our duck has passed all tests!
        // let him enter the database

        // create the data for our duck
        $duck = new Duck;
        $duck->name     = Input::get('name');
        $duck->email    = Input::get('email');
        $duck->password = Hash::make(Input::get('password'));

        // save our duck
        $duck->save();

        // redirect ----------------------------------------
        // redirect our user back to the form so they can do it all over again
        return Redirect::to('ducks')
            ->with('messages', 'Hooray!');

    }

}));

5. This is my model file for form:

<?php

class Duck extends Eloquent {

    protected $fillable = array('name', 'email', 'password');

}

6. This is my model for neo4j:

<?php

    //use Illuminate\Auth\EloquentUserProvider;

    class database extends Eloquent {

        public function index($name, $email, $password, $password_confirm) {

            $formData = Neo4j::makeNode();
            $formData->setProperty('name',$name)
                    ->setProperty('email',$email)
                    ->setProperty('password',$password)
                    ->setProprty('password_confirm',$password_confirm)
                    ->save();

        }

    }  

When I click on that submit button in that form, I get this error:

[ Edit ]
I was working on it:
This is the new error which I got:

Is it a csrf token issue?
It is pointing to:

Route::filter('csrf', function()
{
    if (Session::token() != Input::get('_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

I'm unable to resolve it since 5 hours and data isn't getting stored in neo4j DB. How can I fix it?

回答1:

When using the CSRF Protection Filter, your form must be declared in your blade as such:

{{ Form::open(array('method' => 'POST', 'action' => URL::to("/ducks"))) }}

And closed:

{{ Form::close() }}

This will render the same form in your html as using:

<form method="POST" action="{{ URL::to("/ducks") }}">...</form>

But will also add the hidden _token element that you are missing:

<input type="hidden" name="_token" value="value_of_token"/>

Hope that helps!

Edit

Or, if you don't want to recreate your <form>, you may simply use:

{{ Form::token() }}

Somewhere inside your existing <form> tag to create it.



回答2:

Your code looks fine, might be you need to run

composer dump-autoload