【问题标题】:Laravel 4 database actions - controller or modelLaravel 4 数据库操作 - 控制器或模型
【发布时间】:2014-12-02 16:05:20
【问题描述】:

刚开始使用 Laravel,但想确保我正确使用它。

我的大部分工作都是基于 CMS 的,因此可以对数据库进行读/写/更新等操作。

到目前为止,我所做的一个示例是插入数据库:

在视图中,我有一个 URL 为“addNewUser”的表单。

然后在我的路线中:

Route::post('addnewuser', array('uses' => 'UserController@addNewUser'));

我的用户控制器 'addNewUser' 方法是(简化的):

public function addNewUser() {
    $data = Input::all();
    $rules = array(
        'username' => 'required|alpha_dash|max:16|unique:users,username',
        );

    $validator = Validator::make($data, $rules, $messages);

    if ($validator->fails())
    {
        Input::flash();
        $errors = $validator->messages();
        return Redirect::to('/register')->withErrors($validator)->withInput();
    }

    $user = new User;
    $user->save();

    return Redirect::to('/login')->with('successLogin', '1');
}

这是正确的吗?我在某处读到所有数据库交互都应该在模型中?

同样,当从数据库读取以显示 foreach 时,我直接在视图中执行以下操作:

$builds = DB::table('blogs')->orderBy('id', 'desc')->get();

if ($builds) {

    foreach ($builds as $build)
    {
      $safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle);
      echo "
        // stuff
      ";
    }

} else {
    // no stuff
}

我是否应该直接在视图中进行此类查询并显示数据?还是在模型/控制器功能等中?

想要检查我做事 100% 正确/做事的标准方式,以免我太投入。

【问题讨论】:

  • 不,如果您希望代码可重用,则不应在控制器中完成。试想一下,您还有另一个添加用户的理由,例如。 /users/add_batch,那么你需要为这个新控制器重写所有这些东西。或者您希望在命令行中执行此操作(工匠 cron 作业或其他) - 您需要再次重写这些内容。相反,最好创建一个服务,一个模型上的方法(任何适合你的)来处理这个任务并在你的控制器/cli中重用它。

标签: php laravel laravel-4 eloquent


【解决方案1】:

我可以看到一些我个人会做不同的事情。

例如,我通常将$rules 作为一个类变量,这样它就可以在与您的用户相关的不同功能中使用。

你测试过你的代码了吗?有什么错误吗?

在您的addNewUser 函数中是否保存任何数据?我知道您在代码 sn-p 上方已“简化”,但在创建您的 $user 变量和运行 $user->save(); 之间应该有 $user->username = $data['username']; 等,所以如果您故意排除它,那么我什么也看不到其他与您的模型。

在您的视图代码中,$builds = DB::table('blogs')->orderBy('id', 'desc')->get(); 应该在您的控制器中完成并像这样传递给您的视图 return View::make('example', array('builds' => $builds))

我也会改变

$builds = DB::table('blogs')->orderBy('id', 'desc')->get();

$builds = Blog::orderby('id','desc')->get(); 如果你有一个Blog 模型,否则你的代码没问题。

【讨论】:

    【解决方案2】:

    你可以移动:

    $rules = array(
            'username' => 'required|alpha_dash|max:16|unique:users,username',
            );
    

    将用户模型作为静态变量,而不是:

    $validator = Validator::make($data, $rules, $messages);
    

    你可以使用:

     $validator = Validator::make($data, User::$rules, $messages);
    

    但绝对不要在视图中从数据库中获取数据,这段代码应该在控制器中,例如:

    $builds = DB::table('blogs')->orderBy('id', 'desc')->get();
    return View::make('someview')->with('builds', $builds);
    

    当然如果你有Blog 模型,你应该在这里使用:

    $builds = Blog::orderBy('id', 'desc')->get();
    return View::make('someview')->with('builds', $builds);
    

    以下代码的作用也不清楚:

    $safeURLSlug = stringHelpers::safeURLSlug($build->blogtitle);
    

    但也许您可以将其移至您的 Blog 模型并使用 accessor 进行更改:

    public function getSafeSlugAttribute($value) {
       return stringHelpers::safeURLSlug($this->blogtitle);
    }
    

    现在您的视图可能如下所示:

    @foreach ($builds as $build)
          {{{ $build->title }}} {{{ $build->safeSlug }}}
    @endforeach
    

    【讨论】:

    • 好的,我慢慢看图。我仍然应该在控制器中进行保存/验证等,但在模型中定义规则?
    • @user2921557 好吧,你不在控制器中进行验证,你使用`Validator`模型并且在这个模型中进行验证,你只需要在控制器中对其结果做一些事情。当然,您也可以在模型中创建单独的方法进行验证 - 例如,在我当前的项目中,我有 validateEdit、validateAdd 方法,因为我需要根据操作或其他数据使用不同的验证规则
    【解决方案3】:

    我建议你看看 Laravel 生成器。

    https://github.com/JeffreyWay/Laravel-4-Generators

    安装然后运行:

    php artisan generate:scaffold customer
    

    Laravel 命令行命令生成器为您创建一个基本的 CRUD,其中包含控制器、模型、视图和数据库迁移。这对安全时间和让您的项目保持一些默认组织很有好处。

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2014-02-06
      • 2013-09-24
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多