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

时间:2017-07-08 09:43:07

标签: php laravel-5.4

在我的控制器中,我有存储和更新的方法。如您所见,我正在逐个复制$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');
        }
}

看来,我正在重复我的代码,我的问题是,有没有办法立即复制所有代码?如何复制旅游属性中的所有请求属性?

3 个答案:

答案 0 :(得分:1)

你也可以试试这个:

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

了解更多 See laravel docs

答案 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。