我目前是laravel的新手,我正试图用laravel包围代码结构。学习laravel的原因是除了创建易于管理的应用程序之外,还要增加我创建良好代码的知识。出于这个原因,对我而言,我正在将我的应用程序构建为可接受的标准。
我已阅读了几篇文章,但我仍然不确定在哪里组织事情。
截至目前,我的应用程序结构如下:
app/
Console
Exceptions
Http
Controllers
Auth
Message
Settings
Middleware
Providers
Traits
Message
Settings
我的一个控制器看起来像这样:
<?php
namespace App\Http\Controllers\Message;
use DB;
use Auth;
use Request;
use App\Http\Controllers\Controller;
class TypeController extends Controller
{
public function __construct () {
$this->middleware('auth');
$this->middleware('access');
}
public function type () {
$this->adjustTypingStatus(1);
}
public function untype () {
$this->adjustTypingStatus(0);
}
protected function adjustTypingStatus ($level) {
DB::table('user_lobby_info')
->where('userid', Auth::User()->id)
->where('lobby', Request::get('lobbyid'))
->update([ 'typing' => $level ]);
}
}
?>
问题
将控制器分成更小,更易于管理的部分的更好方法是什么?我应该将数据库逻辑放入模型中并只调用模型的方法吗?
答案 0 :(得分:2)
这就是我如何分解控制器逻辑并将模型用于中小型项目。
<强> 1。创建表格和模型
此命令将创建您的模型, - 迁移将创建一个迁移文件,该文件引用可用于创建模型表的BluePrint类。
php artisan make:model UserLobbyInfo --migration
您似乎已经创建了一个数据库,因此您可能希望删除--migration,除非您想使用它来使用BluePrint创建模式。我个人喜欢使用迁移。您的模型将直接在Laravel 5中的App文件夹下创建。
<强> 2。修改模型文件
您可以在App文件夹中找到您的模型文件。在您的模型中,您应该添加您要插入或更新的字段(可填充质量的项目)以及表格的名称(如果它没有遵循Laravel惯例)(Laravel假定骆驼套管指示不同的单词和那个你的表以&#39;结尾,因此它认为你的表将是user_lobby_infos,在你的情况下,你的表名是user_lobby_info)。这就是我根据您上述查询中的数据对其进行更新的方法:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserLobbyInfo extends Model
{
// Define mass fillable items
protected $fillable = array('userid','lobby','typing');
//Define table
protected $table = 'user_lobby_info';
}
如何使用模型
此模型现在具有从其扩展的Illuminate \ Database \ Eloquent \ Model类提供的所有方法,因此您可以执行以下操作:
//To query all content:
$index = UserLobbyInfo::all();
//To query specific content:
$userLobby = UserLobbyInfo::where('id', '=', 1)->first();
//Save things:
$userLobbyInfo = UserLobbyInfo::where('id', '=', 1)->first();
$userLobbyInfo->lobby = Request::get('lobbyid')
$userLobbyInfo->save();
//Using the model for your query above this is how you can send an update:
UserLobbyInfo::where('userid', '=', Auth::User()->id)
->where('lobby', '=', Request::get('lobbyid'))
->update([ 'typing' => $level ]);
第3。使用CRUD相关方法创建预先控制的控制器 此命令将创建一个控制器,其中包含您通常在CRUD应用程序中使用的所有方法(索引,显示,创建,保存,编辑,更新,删除)
php artisan make:controller UserLobbyController --resource
在每个功能中,您都可以使用所需的方法添加相应的模型。
<强> 4。添加传统上在CRUD App中使用的所有路由并链接到--resource方法 如果您使用--resource,您将能够使用资源函数,该函数将为您提供这些相应资源所需的所有路径。
Route::resource('userlobby', 'UserLobbyController');
路由文件中的一行将创建CRUD应用程序运行中常见的以下路由&#34; php artisan route:list | grep userlobby&#34;你会看到这些路线:
| | GET|HEAD | userlobby | userlobby.index | App\Http\Controllers\UserLobbyController@index | web |
| | POST | userlobby | userlobby.store | App\Http\Controllers\UserLobbyController@store | web |
| | GET|HEAD | userlobby/create | userlobby.create | App\Http\Controllers\UserLobbyController@create | web |
| | GET|HEAD | userlobby/{userlobby} | userlobby.show | App\Http\Controllers\UserLobbyController@show | web |
| | PUT|PATCH | userlobby/{userlobby} | userlobby.update | App\Http\Controllers\UserLobbyController@update | web |
| | DELETE | userlobby/{userlobby} | userlobby.destroy | App\Http\Controllers\UserLobbyController@destroy | web |
| | GET|HEAD | userlobby/{userlobby}/edit | userlobby.edit | App\Http\Controllers\UserLobbyController@edit | web |
<强> 5。将控制器压缩为CRUD方法 我将在下面进行编辑和更新,因为这可能会非常冗长。希望这能让您了解如何分解控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\UserLobbyInfo; // Add this to access your new model
use App\Http\Requests;
class UserLobbyController extends Controller
{
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$updateLobby = UserLobbyInfo::where('id', '=', $id)->first(); //This queries the table specifically for the id, just for demo purposes.
return view('lobbies.edit', compact('updateLobby')); //This will send the above defined array to your view to pre-populate.
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$userLobby = UserLobbyInfo::where('userid', '=', Auth::User()->id)
->where('lobby', '=', $request->lobbyid)->first();
//Grab the UserLobby row you want to update.
$updateLobby->typing = $level; //update the typing value
$updateLobby->save(); // save it.
}
对于更复杂的应用程序,我通常会将较重的控制器逻辑迁移到类中,并使用它来引用控制器中的类。当我编写具有多个表连接的复杂查询时,我也只使用DB :: class(特别是在该连接中需要多个where子句的连接)。
希望这有助于突出显示如何在Laravel中正确使用模型。
laravel文档中提供了大量此类信息。我也喜欢这个备忘单:laravel cheat sheet
还有其他问题,或者如果我没有完全回答你的问题,请告诉我。
答案 1 :(得分:1)
使用Eloquent而不是原始SQL查询或查询构建器查询。将所有与数据相关的逻辑放入模型类中:
public function getApprovedUsersWithPosts()
{
return $this->where('approved', true)->with('posts')->get();
}
你的控制器应该很小。切勿将查询或其他逻辑放入控制器中。此外,使用DI而不是外墙:
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function index()
{
return view('users.approved', [
'users' => $this->user->getApprovedUsers()
]);
}