3

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

FatalErrorException in ClientFormRequest.php line 10: Cannot make static method Symfony\Component\HttpFoundation\Request::create() non static in class App\Http\Requests\ClientFormRequest

my all 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');

2 Answers 2

1

First of all, i would suggest you to watch Laravel 5 Fundamentals repeatedly since it is free. Other series also give great information.

Secondly, I would suggest you to use at least Sublime Text and some useful packages to be able to inspect the depth nested relations of system files (Namespaces, Interfaces, Inheritance Tree etc...). If you can't/might not, this friend will serve you anytime Laravel API

Third, AFAIK, Laravel Request is build onto the Symfony' Request Component. Since you are trying to overload one of its core function as non static, you are getting this error.

In addition, to be honest, i wouldn't put my user/client model creation logic into the requests. Laravel provides an good example for this kind of misconception. In the App\Services folder, you will find a registrar service for Laravel oem user model.

Let's inspect the problem with different cases.

but first, basic...

Lets assume that all logic should be put inside the 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 be willing to separate the 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 be willing to take things further and even separate the object creation logic as an service to use it anywhere. Now your request file would stay the same. However,

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 best way to solve a problem. Stay with the best applicable and appropriate way for you and your project scale.

You also might be interested in;

Jeffrey Way's Laravel Auto Validate on Save

Sign up to request clarification or add additional context in comments.

Comments

0

The error message tells you that you are overriding the create method in the ClientFormRequest class. So remove the method there. Instead create the new Client in your Controller.

Below I updated your 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!');
    }

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.