Php 复制类属性中的所有请求属性

Php 复制类属性中的所有请求属性,php,laravel-5.4,Php,Laravel 5.4,在我的控制器中,我有存储和更新的方法。如您所见,我正在逐个复制$tour属性中的$request属性: class TourController extends Controller { public function store(Request $request, Tour $tour) { $tour->name = $request->name; $tour->flight = $request->fl

在我的控制器中,我有存储和更新的方法。如您所见,我正在逐个复制
$tour
属性中的
$request
属性:

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

看起来,我在重复我的代码,我的问题是,有没有办法一次复制所有代码?如何复制巡更属性中的所有请求属性?

是的,您可以执行
$tour=request()->all()以同时获取所有输入

或者你可以这样做:

$tour = new Tour;

$tour= save(request()->all());

创建一个类,该类从请求中获取所有属性并设置这些属性

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;
}
然后将其放入控制器中

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()
,因为请求可能会随着应用程序的发展而变化

例如,您还可以在控制器中添加以下内容:

try {
    $this->tourHydrator->updateFromRequest($request, $tour);
    $tour->save();
    return redirect('home/tour/see');
} catch (SomeException $e) {
    return redirect('home/tour/invalid');
}
我还建议在您的
Tour
模型中使用gettest和setter,因为有时神奇的方法可能会很棘手,尤其是在测试时。然后您可以更改
以使用适当的设置器。

您也可以尝试以下操作:

Tour::create($request->all());
更多

这使$tour成为一个数组,那么您不能在上调用$tour->save()it@AliSeyfi切卡根