php - 简化函数 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);
}
}
解决方案
你可以有更好的代码,绝对是:
- 不要在控制器中使用 a ,而是
Validator
参考 useForm Requests
。 - 尝试使用
$request
或request()
外观代替Input
(只是因为这是标准)。 - 当重定向到与实际不同的页面时,请尝试使用
route('route name')
这样它对任何人都更具可读性并且不太容易出现格式错误的 URL。
因此,让我向您展示最终代码(我将使用Laravel 8
and 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()
)。
这意味着,如果您在控制器中(从方法的第一行开始),所有内容都经过验证和授权。你有绿灯。
推荐阅读
- matlab - 在循环中创建结构的最佳方法是什么?
- gcc - GCC插件编译问题
- python-3.x - 尽管已安装 GridSearchCV,但在使用 export_graphiz 时仍未安装错误
- django - 如何使用 MongoDB 在 Django REST 框架模型中获取字符串列表
- angular - post two buddies with angular
- python - NameError:名称“tkinter”未定义
- python - Python:UnicodeDecodeError:'utf-8'编解码器无法解码位置 0 的字节 0x80:无效的起始字节
- reactjs - 如何处理关于 Reat Hooks 的 useEffect 的 eslint 缺少依赖项警告
- python - 在张量流中沿给定张量的轴计算模式和模式计数
- python - Python - 如何连接多个 Qaction