приложение laravel, имеющее тот же метод в контроллерах - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть приложение 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вся логика базы данных должна быть ответственностью модели. Если у вас есть несколько вызовов уничтожения и обновления, лучше всего расширить все модели из базовой модели и использовать Области Eloquent запросов для реализации обоих методов в базовой модели.

От Тейлора Отвелла, создателя Laravel:

Если я понял из PHP, что контроллеры должны ничего не делать. Эти вещи существуют в этом эфирном плане, так же, как это туманный туман, который ничего не делает и передает вещи в какой-то домен уровень обслуживания абстракции

Хотя он также упоминает в том же выступлении, что многое зависит от варианта использования, и приведенный выше идеальный сценарий.

0 голосов
/ 12 ноября 2018

если вы следуете REST, тогда ваши контроллеры должны выглядеть одинаково, и наследование в этом случае не очень полезно, потому что генерация restful-контроллера с флагом -r всегда даст вам все необходимые методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...