使用Laravel 5向数据库插入数据时出现错误

3

我是一个新手,正在学习Laravel5框架。当我使用Laravel5向数据库插入数据时,出现以下错误:

FatalErrorException in ClientFormRequest.php line 10: 在类App\Http\Requests\ClientFormRequest中无法将静态方法Symfony\Component\HttpFoundation\Request::create()变为非静态的

以下是我的所有文件...

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

路由

Route::get('client', 'RegisterController@create');
Route::post('contact_store', 'RegisterController@store');
2个回答

1
首先,我建议您反复观看Laravel 5 Fundamentals,因为它是免费的。其他教程也提供了很多有用的信息。
其次,我建议您至少使用Sublime Text和一些有用的软件包,以便能够检查系统文件的深度嵌套关系(命名空间、接口、继承树等)。如果您不能/可能不行,这个朋友可以随时为您服务Laravel API
第三,据我所知,Laravel Request是构建在Symfony' Request组件之上的。由于您试图将其中一个核心函数作为非静态函数进行重载,所以会出现此错误。
另外,说实话,我不会把我的用户/客户端模型创建逻辑放在请求中。 Laravel提供了这种误解的良好示例。在App\Services文件夹中,您将找到用于Laravel OEM用户模型的注册服务。

让我们通过不同的情况来检查问题。

但首先,基础知识...

假设所有逻辑都应该放在控制器中。

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

}

第二种解决方案

您可能希望将验证逻辑分离并应用一些依赖注入。

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


0
错误信息告诉你,你正在覆盖 ClientFormRequest 类中的 create 方法。因此,请在那里删除该方法。而是在您的控制器中创建新的客户端。
下面我更新了您的类以反映这些更改。 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',
        ]);
    }
}

注册控制器

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接