您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
SOC原则与repository设计模式(laravel11)
发布时间:2024-11-05 14:00:07编辑:雪饮阅读()
-
Laravel SOC原则与Repository设计模式
SOC原则:Laravel框架遵循单一职责原则(SOC),即每个类或模块应只负责一项职责。这有助于代码的模块化和可维护性。
Repository设计模式:Repository模式是一种数据访问模式,它抽象了数据层的逻辑,使得业务逻辑层不需要关心数据是如何存储和检索的。
在Laravel中,Repository通常位于Controller和Model之间,负责实现业务逻辑需要的数据库操作。
通过接口绑定和依赖注入,Laravel允许开发者轻松地在Controller中使用Repository,从而实现业务逻辑与数据访问逻辑的分离。
使用Repository模式可以使代码更加清晰、易于测试和维护,同时也有助于降低代码的耦合度。
Laravel框架通过遵循SOC原则和采用Repository设计模式,提供了高度模块化和可维护的代码结构。
像前番咱们实现了项目列表接口和项目创建与修改的接口。
那么之前的逻辑全部混在项目控制器中,只是少许使用到了model中的关联模型。
那么这次就是基于SOC与Repository设计模式进行下简化处理。
建立一个Repository接口Y:\root\example-app\app\Repositories\ProjectRepositoryInterface.php
<?php
namespace App\Repositories;
interface ProjectRepositoryInterface
{
public function index($type,$uid);
public function update($request);
}
当然这步或许可以省略,直接在实体类Repository中去实现,但依赖注入好像是需要interface,这里暂不纠结。
然后建立项目的Repository:
Y:\root\example-app\app\Repositories\ProjectRepository.php
<?php
namespace App\Repositories;
use App\Models\Project;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
class ProjectRepository implements ProjectRepositoryInterface
{
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function index($type,$uid)
{
if($type){
$projects=Project::with(["user","category"])->orderBy('id',"desc")->get();
}
if(!$type){
$projects=User::with([
"projects" => function ($query) {
$query->orderBy('id', 'desc');
},
"projects.user",
"projects.category"
])->find($uid)->projects;
}
return $projects;
}
public function update($request)
{
$id=$request->input("id");
$project=new Project();
if($id){
$project=Project::find($id);
if (! Gate::allows('update-post', $project)) {
abort(403);
}
}
$file=$request->file('avatar');
if($file){
$path=$file->store('','public');
$url = Storage::url($path);
$project->avatar=$url;
}
if(!$file){
$project->avatar="/images/1.gif";
$avatar=$request->input("avatar");
if($avatar){
$project->avatar=$avatar;
}
}
$uid=$request->user()->id;
$name=$request->input("name");
$category=$request->input("category");
$project->uid=$uid;
$project->name=$name;
$project->category=$category;
$project->save();
}
}
这里将之前项目列表的index的实现与update的实现迁移到此处。
然后之前的项目控制器中只需要在构造函数的时候进行依赖注入即可
public function __construct(ProjectRepository $projectRepository)
{
$this->projectRepository = $projectRepository;
}
那么之前的index方法就可以简化如
public function index(Request $request):Response
{
$type=$request->input("type",0);
$projects=$this->projectRepository->index($type,$request->user()->id);
$categories=project_category::get();
return Inertia::render('Project/Index', [
'projects' => $projects,
'categories'=>$categories,
'type'=>$type
]);
}
同样update的简化力度就更大了
public function update(ProjectUpdateRequest $request):RedirectResponse
{
$this->log(var_export($request->user(),true));
$this->log("uid:".$request->user()->id);
$this->projectRepository->update($request);
return Redirect::route('project.index');
}
关键字词:laravel
相关文章
- 项目显示相关的逻辑、resource路由与resource control
- 权限与数据归属问题的几个方法(laravel11)
- laravel11编辑项目的数据验证逻辑、同一页面多表单错
- 编辑保存项目的逻辑(laravel里的两种数据绑定)
- 编辑项目的模态框样式(laravel11)
- unique rule的进一步限定与项目分类悬浮状态条效果实
- 新建项目的数据验证(基于laravel11+inertia的数据验证
- 新建项目表单的模态框样式(laravel11+inertia+breeze
- laravel中的一对多关系使用与inertia的link使用
- 列出已有项目分类(laravel11+breeze+inertia实现增与