在我的控制器中,我有存储和更新的方法。如您所见,我正在逐个复制$request
属性中的$tour
个属性:
class TourController extends Controller
{
public function store(Request $request, Tour $tour)
{
$tour->name = $request->name;
$tour->flight = $request->flight;
$tour->price = $request->price;
$tour->description = $request->description;
$tour->save();
return redirect('home/tour/see');
}
public function update(Request $request)
{
$tour = Tour::find($request->id);
$tour->name = $request->name;
$tour->flight = $request->flight;
$tour->price = $request->price;
$tour->description = $request->description;
$tour->save();
return redirect('home/tour/see');
}
}
看来,我正在重复我的代码,我的问题是,有没有办法立即复制所有代码?如何复制旅游属性中的所有请求属性?
答案 0 :(得分:1)
答案 1 :(得分:0)
是的,您可以$tour = request()->all();
同时获取所有输入
或者你可以这样做:
$tour = new Tour;
$tour= save(request()->all());
答案 2 :(得分:0)
创建一个类,该类从请求中获取所有属性并设置这些属性。
class TourHydrator
public function updateFromRequest(Request $request, Tour $tour)
{
$tour->name = $request->name;
$tour->flight = $request->flight;
$tour->price = $request->price;
$tour->description = $request->description;
}
然后在你的控制器中inject
class TourController extends Controller
{
/**
* @var TourHydrator
*/
private $tourHydrator;
public function __construct(TourHydrator $tourHydrator)
{
$this->tourHydrator = $tourHydrator;
}
public function store(Request $request, Tour $tour)
{
$this->tourHydrator->updateFromRequest($request, $tour);
$tour->save();
return redirect('home/tour/see');
}
public function update(Request $request)
{
$tour = Tour::find($request->id);
$this->tourHydrator->updateFromRequest($request, $tour);
$tour->save();
return redirect('home/tour/see');
}
}
我建议使用此方法,而不是使用$request->all()
,因为请求可能随着应用程序的发展而变化。
您也可以添加validation例如,在控制器中可以对其进行处理:
try {
$this->tourHydrator->updateFromRequest($request, $tour);
$tour->save();
return redirect('home/tour/see');
} catch (SomeException $e) {
return redirect('home/tour/invalid');
}
我还建议在Tour
模型中使用gettest和setter,因为有时魔术方法可能会很棘手,特别是在测试方面。然后,您可以更改TourHydrator
以使用适当的setter。