Error while inserting data into database using laravel5

I am new to laravel5 Framework. when i insert data into database using laravel5 at that time i get error like ...

FatalErrorException in ClientFormRequest.php line 10: Can't make static method Symfony \ Component \ HttpFoundation \ Request :: create () not static in class App \ Http \ Requests \ ClientFormRequest

all my files are below ...

app /Http/Controller/RegisterController.php

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Http\Requests\ClientFormRequest;

use Illuminate\Http\Request;

class RegisterController extends Controller {

    public function create()
    {
        return view('Client.client');
    }

    public function store(ClientFormRequest $request)
    {       


        return \Redirect::route('Client.client')
        ->with('message', 'Record Inserted!');
    }

}

      

app / Http / Requests / ClientFormRequest.php

<?php namespace App\Http\Requests;


use Stringy\create;

use App\User;
use Validator;
use App\Http\Requests\ClientFormRequest;

class ClientFormRequest extends Request {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {

    }

    public function validator(array $data)
    {
        return Validator::make($data, [
                'fullname' => 'required|max:255',
                'email' => 'required|email|max:255|unique:users',
                ]);
    }

    public function create(array $data)
    {
        return client::create([
            'fullname' => $data['fullname'],
            'email' => $data['email'],
        ]);
    }
}

      

Routes

Route::get('client', 'RegisterController@create');
Route::post('contact_store', 'RegisterController@store');

      

+3


source to share


2 answers


First of all, I suggest you watch Laravel 5 Basics a few times , as it's free. Other episodes provide great information as well.

Secondly, I suggest you use at least Sublime Text and some useful packages to check the deep nested relationships of system files (namespaces, interfaces, inheritance tree, etc.). If you can't / can't, this friend will be your Laravel API anytime

Third, AFAIK, Laravel Request builds on the Symfony Request component. Since you are trying to overload one of your main functions as non-static, you are getting this error.

Also, to be honest, I would not put the user / client model creation logic in the requests. Laravel is a good example of this misconception. In the folder App\Servicesyou will find the registrar service for the Laravel oem user model.

Check the problem in different cases.

but first, basic ...

Suppose all logic needs to be inserted into a controller.

RegisterController.php



<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Request;

class RegisterController extends Controller {
    public function create()
    {
        return view('Client.client');
    }

    public function store()
    {   
        $data = Request::all(); //requested data via Facade
        //prepare validatation
        $validation = Validator::make($data, [ 
                'fullname' => 'required|max:255',
                'email' => 'required|email|max:255|unique:users',
                ]);
        //validate
        if ($validation->fails())
        {
            return redirect()->back()->withErrors($v->errors());
        }
        // create the client
        Client::create([
            'fullname' => Request::input('fullname'),
            'email'    => Request::input('email'),
        ]);

        return \Redirect::route('Client.client')
        ->with('message', 'Record Inserted!');
    }

}

      

Second solution

You might want to separate your validation logic and apply some dependency injection.

RegisterController.php



<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Http\Requests\ClientFormRequest;

class RegisterController extends Controller {

    public function create()
    {
        return view('Client.client');
    }

    public function store(ClientFormRequest $request)
    {   
        // create the client
        Client::create([
            'fullname' => $request->input('fullname'),
            'email' => $request->input('email'),
        ]);

        return \Redirect::route('Client.client')
        ->with('message', 'Record Inserted!');
    }

}

      

ClientFormRequest.php   

use Stringy\create;

use App\User;
use Validator;
use App\Http\Requests\ClientFormRequest;
class ClientFormRequest extends Request {

    public function authorize()
    {
        return true;
    }


    public function rules()
    {
        return [
            'fullname' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users'
        ];
    }

}

      

Third solution

You might want to take it a step further and even decouple the object creation logic as a service so you can use it anywhere. Your request file will now remain the same. Nevertheless,

RegisterController.php   

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Http\Requests\ClientFormRequest;
use App\Services\ClientRegistrar;

class RegisterController extends Controller {

    private $registrar;

    public function __construct(ClientRegistrar $registrarService)
    {
        $this->registrar = $registrarService;
    }
    public function create()
    {
        return view('Client.client');
    }

    public function store(ClientFormRequest $request)
    {   

        $newClient = $this->registrar->create($request->all());
        return \Redirect::route('Client.client')
        ->with('message', 'Record Inserted!')->compact('newClient');
    }

}

      

App \ Services \ ClientRegistrar.php    

 use App\Client;
 use Validator;
 use Illuminate\Contracts\Auth\Registrar as RegistrarContract;

 class ClientRegistrar implements RegistrarContract {

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function validator(array $data)
    {
        return Validator::make($data, [
           'fullname' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        ]);
    }

    /**
     * Create a new client instance after a valid registration.
     *
     * @param  array  $data
     * @return Client
     */
    public function create(array $data)
    {
        // create the client
        return Client::create([
                'fullname' => $data['fullname'],
                'email' => $data['email'],
            ]);
    }

 }

      

To my conclusion There is no correct and better way to solve the problem. Stay with the best and most appropriate way for you and your project scale.

You may also be interested in:

Jeffrey Way Laravel Auto Validate on Save

+1


source


The error message tells you that you are overriding a method create

in the ClientFormRequest class . So remove this method. Instead, create a new client in your controller.

Below I've updated my classes to reflect the changes.

ClientFormRequest



class ClientFormRequest extends Request {

    public function authorize()
    {
        return true;
    }


    public function rules()
    {

    }

    public function validator(array $data)
    {
        return Validator::make($data, [
            'fullname' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
        ]);
    }
}

      

RegisterController

class RegisterController extends Controller {

    public function create()
    {
        return view('Client.client');
    }

    public function store(ClientFormRequest $request)
    {       
        // ClientFormRequest was valid

        // create the client
        Client::create([
            'fullname' => $request->input('fullname'),
            'email' => $request->input('email'),
        ]);

        return Redirect::route('Client.client')
        ->with('message', 'Record Inserted!');
    }

}

      

0


source







All Articles