2017-07-08 32 views
1

在我的控制器中,我有用于存储和更新的方法。正如你看到的,我在$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'); 
     } 
} 

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

回答

1

你也可以试试这个:

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

更多 See laravel docs

0

是的,你可以做$tour = request()->all();同时

把所有的投入或者你可以做水木清华这样的:

$tour = new Tour; 

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

@AliSeyfi检查我的编辑答案 –

+0

这使得$游览一个数组,那么你就不能调用$ tour->保存()上它 –

+0

@AliSeyfi checagain –

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以使用适当的设置程序。