У меня есть приложение Laravel и внутренние контроллеры, у меня один и тот же метод с одинаковой структурой в нескольких контроллерах (большинство из них, но не во всех)
как я могу реорганизовать эти контроллеры для более чистой структуры кода?
Могу ли я использовать базовый контроллер и расширить все свои контроллеры или есть возможность использовать черту для этого
Обновление:
Я использую Datatable для большинства моих контроллеров и потомуиз этого у меня есть destroyMultiple
и updateStatus
метод в этих контроллерах.и содержание кода во всех контроллерах настолько схоже (например, только изменение в названии модели), и я чувствую себя плохо, копируя этот метод на каждые 15 контроллеров, которые у меня есть (и по мере роста системы другие контроллеры)
этокод моего контроллера:
<?php
namespace App\Http\Controllers\Admin;
use App\Library\AdminLib;
use App\Library\Datatable;
use App\Project;
use App\ProjectImage;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Session;
class ProjectController extends Controller {
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index () {
return view("admin.projects.index");
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create () {
$token = AdminLib::setUploadSession();
return view("admin.projects.create" , compact('token'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store ( Request $request ) {
$this->validate($request , [
'title' => 'required' ,
'alt' => 'required|unique:projects' ,
]);
$project = new Project($request->only([
'image' ,
//its image file
'alt' ,
'title' ,
'description' ,
'meta_keywords' ,
'meta_description' ,
]));
$project->active = AdminLib::fixSwitch('active');
$project->save();
//save images that uploaded ajax ( relate them to this project )
$token = AdminLib::getUploadSession();
$images = ProjectImage::with([])
->where('token' , $token)->get();
$project->projectImages()
->saveMany($images);
#
$project->projectVideos()
->createMany(AdminLib::filterUrl($request->get('videos')));
return redirect(route('admin.projects.index'))->with('success' , 'Information has been added');
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Project $project
* @return \Illuminate\Http\Response
*/
public function edit ( Project $project ) {
$token = AdminLib::setUploadSession();
return view("admin.projects.edit" , compact('project' , 'token'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Project $project
* @return \Illuminate\Http\Response
*/
public function update ( Request $request , Project $project ) {
$this->validate($request , [
'title' => 'required' ,
'alt' => 'required' ,
]);
$project->fill($request->only([
'image' ,
//its image file
'alt' ,
'title' ,
'alt' ,
'description' ,
'meta_keywords' ,
'meta_description' ,
]));
$project->active = AdminLib::fixSwitch('active');
$project->save();
//save images that uploaded ajax ( relate them to this project )
$token = AdminLib::getUploadSession();
$images = ProjectImage::with([])
->where('token' , $token)->get();
$project->projectImages()
->saveMany($images);
//save video
$project->projectVideos()
->delete();
$project->projectVideos()
->createMany(AdminLib::filterUrl($request->get('videos')));
return redirect(route('admin.projects.index'))->with('success' , 'Information has been updated');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Project $project
* @return array
* @throws \Exception
*/
public function destroy ( Project $project ) {
$ok = $project->delete();
return compact('ok');
}
public function destroyMultiple () {
$count = Project::with([])
->whereIn('id' , \request('id_list'))
->delete();
$ok = true;
return compact('count' , 'ok');
}
public function updateStatus () {
//some code to update status
}
public function datatable ( Request $request ) {
$datatable = new Datatable();
$response = $datatable->setRequest($request)
->setQuery(Project::with([]))
->generalSearch(function ( Builder $query , $search ) {
return $query->where('title' , 'like' , "%$search%")
->orWhere('id' , "%$search%");
})
->manipulateData(function ( Project $record ) {
$record->action = [
//todo fix route
'edit' => route('admin.projects.edit' , $record->id) ,
'destroy' => route('admin.projects.destroy' , $record->id) ,
];
//todo use model to decorate this
$record->created = "{$record->created_at->toFormattedDateString()} - {$record->created_at->toTimeString()}";
return $record;
})
->getResponse();
return $response;
}
}