2016-01-20 58 views
0

有沒有辦法可以縮短下面的代碼?它開始顯得有點凌亂,我想知道是否有更好的方法。Laravel 5.1代碼優化

/** 
* Update user. 
* 
* @param $request 
* @param $id 
* @return mixed 
*/ 
public function updateUser($request, $id) 
{ 
    // Get user 
    $user = $this->user->find($id); 

    // Sync job titles 
    if($request->has('job_title')) 
    { 
     $user->jobTitles()->sync((array)$request->get('job_title')); 
    } else { 
     $user->jobTitles()->detach(); 
    } 

    // Sync employee types 
    if($request->has('employee_type')) 
    { 
     $user->employeeTypes()->sync((array)$request->get('employee_type')); 
    } else { 
     $user->employeeTypes()->detach(); 
    } 

    if($request->has('status')) { 
     $data = $request->only('first_name', 'last_name', 'email', 'status'); 
    } else { 
     $data = $request->only('first_name', 'last_name', 'email'); 
    } 

    // Save user changes 
    return $this->user->whereId($id)->update($data); 
} 

任何幫助,將不勝感激。

回答

0

這裏是我會做:

  • 提取到自己的方法的多對多關係。
  • 初始化了$data變量並在必要時重寫它。
  • 刪除了評論。該代碼是可讀足夠了,沒有必要爲他們

代碼:

public function updateUser($request, $id) 
{ 
    $user = $this->user->find($id); 
    $data = $request->only('first_name', 'last_name', 'email'); 

    $this->syncJobTitles($user); 
    $this->syncEmployeeTypes($user); 

    if($request->has('status')) { 
     $data['status'] = $request->status; 
    } 

    return $user->update($data); 
} 

private function syncJobTitles($user) 
{ 
    if(request()->has('job_title')) 
    { 
     $user->jobTitles()->sync((array) request()->get('job_title')); 
    } else { 
     $user->jobTitles()->detach(); 
    } 
} 

private function syncEmployeeTypes($user) 
{ 
    if(request()->has('employee_type')) 
    { 
     $user->employeeTypes()->sync((array) request()->get('employee_type')); 
    } else { 
     $user->employeeTypes()->detach(); 
    } 
} 
0

有不同的方式重構代碼:

如果代碼只在你的代碼的一部分使用你可以把它存在或

選項1 移動業務邏輯的用戶模型

class User extends Eloquent 
{ 
    ... 
    public function applySomeRule($request) 
    { 
    if($request->has('job_title')) { 
     $this->jobTitles()->sync((array)$request->get('job_title')); 
    } else { 
     $this->jobTitles()->detach(); 
    } 

    // Sync employee types 
    if($request->has('employee_type')) { 
     $this->employeeTypes()->sync((array)$request->get('employee_type')); 
    } else { 
     $this->employeeTypes()->detach(); 
    } 
    } 
} 

而且你的控制器可以完成像

public function updateUser($request, $id) 
{ 
    // Get user 
    $user = $this->user->find($id); 
    $user->applySomeRule($request); 

    if($request->has('status')) { 
     $data = $request->only('first_name', 'last_name', 'email', 'status'); 
    } else { 
     $data = $request->only('first_name', 'last_name', 'email'); 
    } 

    // Save user changes 
    return $this->user->whereId($id)->update($data); 
} 

選項2如果業務邏輯在不同的控制器方法使用您可以使用Middlewares,讓您移動邏輯到中間件和您的路線定義你使用你創建的中間件,比如說SomeRuleMiddleware。

你的路線將如下所示:

Route::put('user/{id}', [ 
    'middleware' => 'SomeRuleMiddleware', 
    'uses' => '[email protected]' 
]); 

選項3你可以將你的所有業務邏輯庫(閱讀Repository Pattern)和SOLID原則,這樣,你的邏輯和規則將繼續存儲庫和你的控制器會保持清潔,如下所示:

class YourController extends Controller 
{ 
    protected $userRepo; 

    public function __construct(UserRepository $userRepo) 
    { 
    $this->userRepo = $userRepo; 
    } 

    public function updateUser($request, $id) 
    { 
    $data = $request->all(); 
    $result = $this->userRepo->updateUser($id, $data); 

    return $result; 
    } 
}