簡體   English   中英

Laravel 5.1代碼優化

[英]Laravel 5.1 code optimisation

有沒有一種方法可以縮短下面的代碼? 它開始看起來有點混亂,我想知道是否有更好的方法。

/**
 * 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);
}

任何幫助,將不勝感激。

這是我會做的:

  • 提取ManyToMany關系到他們自己的方法。
  • 初始化$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();
    }
}

有多種方法可以重構該代碼:

如果該代碼僅用於代碼的該部分,則可以將其保留在此處或

選項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' => 'YourController@updateUser'
]);

選項3您可以將所有業務邏輯移至存儲庫(了解有關存儲庫模式 )和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;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM