首页 > 解决方案 > 简化函数 Laravel

问题描述

这是我用于创建新联系人的功能。

它工作正常且符合预期。

我想知道是否有更好的方法或最佳实践来简化和改进代码。

我只是想提高我的技能并建立更有效的功能。

public function onSave()
    {

        $validator = Validator::make(
            [
                'firstname' => Input::get('firstname'),
                'lastname' => Input::get('lastname'),
                'phone' => Input::get('phone'),
                'email' => Input::get('email'),
                'line_1' => Input::get('line_1'),
                'line_2' => Input::get('line_2'),
                'line_3' => Input::get('line_3'),
                'city' => Input::get('city'),
                'state' => Input::get('state'),
                'postcode' => Input::get('postcode'),
                'organisation_id' => Input::get('organisation_id'),
            ],
            [
                'firstname' => 'required',
                'lastname' => 'required',
                'phone' => 'required',
                'email' => 'required|email',
                'line_1' => 'required',
                'line_2' => '',
                'line_3' => '',
                'city' => 'required',
                'state' => 'required',
                'postcode' => 'required',
                'organisation_id' => 'required',
            ]
        );

        if($validator->fails()){

            return Redirect::back()->withErrors($validator);

        } else {

        $contact = new Contact();

        $contact->firstname = Input::get('firstname');
        $contact->lastname = Input::get('lastname');
        $contact->phone = Input::get('phone');
        $contact->email = Input::get('email');
        $contact->line_1 = Input::get('line_1');
        $contact->line_2 = Input::get('line_2');
        $contact->line_3 = Input::get('line_3');
        $contact->city = Input::get('city');
        $contact->state = Input::get('state');
        $contact->postcode = Input::get('postcode');
        $contact->organisation_id = Input::get('organisation_id');

        $contact->save();

        //Flash::success('Form Submitted');

        return Redirect::to('/contacts/'.$contact->id);

        }

    }

标签: phplaraveloctobercms

解决方案


你可以有更好的代码,绝对是:

  • 不要在控制器中使用 a ,而是Validator参考 use Form Requests
  • 尝试使用$requestrequest()外观代替Input(只是因为这是标准)。
  • 当重定向到与实际不同的页面时,请尝试使用route('route name')这样它对任何人都更具可读性并且不太容易出现格式错误的 URL。

因此,让我向您展示最终代码(我将使用Laravel 8and PHP 8):

首先创建Form Request(我将使用随机名称):

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreContact extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'firstname' => 'required',
            'lastname' => 'required',
            'phone' => 'required',
            'email' => 'required|email',
            'line_1' => 'required',
            'line_2' => '',
            'line_3' => '',
            'city' => 'required',
            'state' => 'required',
            'postcode' => 'required',
            'organisation_id' => 'required',
        ];
    }
}

那么,控制器应该如下所示:

use App\Http\Requests\StoreContact;

public function onSave(StoreContact $request)
{
    $contact = new Contact();

    $contact->firstname = $request->input('firstname');
    $contact->lastname = $request->input('lastname');
    $contact->phone = $request->input('phone');
    $contact->email = $request->input('email');
    $contact->line_1 = $request->input('line_1');
    $contact->line_2 = $request->input('line_2');
    $contact->line_3 = $request->input('line_3');
    $contact->city = $request->input('city');
    $contact->state = $request->input('state');
    $contact->postcode = $request->input('postcode');
    $contact->organisation_id = $request->input('organisation_id');

    $contact->save();

    return redirect(route('contacts.show', ['contact' => $contact->id]);
}

你的路线应该是这样的:

Route::get('/contacts/{contact}', [ContactController::class, 'show'])
    ->name('contact.show');

因此,当您使用 a 时Form Request,它将使用您提供的规则自动验证您的输入,如果任何规则失败,它将返回到先前的 URL ( redirect()->back()),并带有错误 ( ->withErrors()) 和输入 ( ->withInput())。

这意味着,如果您在控制器中(从方法的第一行开始),所有内容都经过验证和授权。你有绿灯。


推荐阅读