Laravel 5.1代码优化

时间:2016-01-20 16:36:38

标签: php laravel laravel-5

有没有办法可以缩短以下代码?它开始看起来有点乱,我想知道是否有更好的方法。

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

以下是我的所作所为:

  • 将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 :(得分: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' => 'YourController@updateUser'
]);

选项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;
  }
}