从Laravel中的Controller访问模型的最佳实践

时间:2016-08-05 12:08:32

标签: php laravel laravel-5 eloquent

所以基本上我有一个关于如何以最好的方式做到这一点的问题。而且我甚至不确定我是否正确地做到了这一点。

我有一个设置页面,用户可以在其中更新某些设置。提交表单后,您可以看到以下方法正在处理请求。

我确实有Profile模型以及User模型,他们的关系也设置正确。

但正如您所看到的,一切都是在此方法的控制器中完成的。我根本不使用Profile模型。但不应该吗?

我可以在Profile模型中制作和使用哪种方法,以便在控制器中做得更少?

很抱歉,如果这是一个不合适的问题。

提前致谢。

/**
 * @return mixed
 *
 * Process general settings
 */
public function postEditGeneralSettings() {

    // Validate
    $val = Validator::make([
        'show_age'    => Input::get('show_age'),
        'show_gender' => Input::get('show_gender')
    ], [
        'show_age'    => 'sometimes|boolean',
        'show_gender' => 'sometimes|boolean'
    ]);

    if ($val -> fails()) {
        return $this -> backWithErrors($val);
    }

    // Update
    Auth::user() -> profile() -> update([
        'show_age'    => Input::get('show_age'),
        'show_gender' => Input::get('show_gender')
    ]);

    return $this -> backWithSuccess('Innstillingene ble lagret!');

}

2 个答案:

答案 0 :(得分:2)

您可以使用Repository类来推卸从控制器存储数据的责任:

T

然后使用控制器中的存储库:

class UserRepository
{
    //rules for validation, as an alternative you can put them in your User Model
    public static $rules =  [
        'title' => 'required|unique|max:255',
        'body' => 'required',
    ];

    public function updateUserProfile($user, $data)
    {
        $user->profile()->update([
        'show_age'    => $data('show_age'),
        'show_gender' => $data('show_gender')
    ]);        
}

答案 1 :(得分:1)

正如马可所说,这里没有错。

您还可以使用默认的validate方法调用进行验证,而不需要创建特定的表单请求。通常,如果验证变得复杂,我会到达特定的表单请求类,否则内联是完美的。 validate函数有什么好处,它会抛出一个被捕获的验证异常,并重定向回错误集等。

使用Eloquent也不是问题,拥抱活跃的记录模式。如果您想更明确一点,可以按如下方式包装更新。

public function postEditGeneralSettings(Request $request) 
{
    $this->validate($request, [
        'show_age'    => 'sometimes|boolean',
        'show_gender' => 'sometimes|boolean',
    ]);

    auth()->user()->updateProfile([
        'show_age'    => $request->input('show_age'),
        'show_gender' => $request->input('show_gender'),
    ]);

    return $this->backWithSuccess('Innstillingene ble lagret!');
}

class User extends Model
{
    ...
    public function updateProfile($settings)
    {
        $this->profile()->update($settings);
    }
}