Рефакторирање Laravel

Член од
1 февруари 2007
Мислења
408
Поени од реакции
15
Ми треба совет како е најтобро да се рефакторира конторлеров посо нели вака не го личи ич дали е е подобро функцијата за аплоадиранје слики да иде у модел и дали уопсте тра и може да биде у модел како метода или да ја нправам класа со подоба практи со е попаметно посо вака ми е многу голем контролеров фала однапред и без недоветни коментари прасам за совет кој како би го ресил со е најдобро :)

Код:
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\ProductStoreRequest;
use App\Http\Requests\ProductUpdateRequest;
use App\Models\Accommodation as Accommodation;
use App\Models\Category as Category;
use App\Models\Cities as Cities;
use App\Models\Country as Country;
use App\Models\Product as Product;
use App\Models\States as States;
use App\Models\Tag as Tag;
use App\Models\User as User;
use App\Models\Workflow as Workflow;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Intervention\Image\ImageManagerStatic as Image;
use Spatie\ResponseCache\Facades\ResponseCache;


class ProductsController extends Controller
{
    function __construct()
    {
        $this->middleware('auth');
        $this->middleware('permission:product-list');
        $this->middleware('permission:product-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:product-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:product-delete', ['only' => ['destroy']]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {

        if (Auth::user()->id == 1) {
            $products = Product::orderBy('id', 'desc')->paginate(10);
        } else {
            $products = Product::orderBy('id', 'desc')->where('user_id', '=', Auth::user()->id)->paginate(10);
        }
        $categories = Category::all();
        $country    = Country::all();
        $states     = States::all();
        $cities     = Cities::all();
        $tags       = Tag::all();
        $data       = ['products' => $products, 'tags' => $tags, 'categories' => $categories, 'country' => $country, 'states' => $states, 'cities' => $cities];
        return view('admin.product.index')->with($data);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        $categories     = Category::get();
        $accommodations = Accommodation::get();
        $tags           = Tag::all();
        $country        = Country::all();
        $states         = States::all();
        $cities         = Cities::all();
        $users          = User::get();
        $workflows      = Workflow::orderBy('id', 'desc')->get();
        $data           = ['categories' => $categories, 'users' => $users, 'workflows' => $workflows, 'tags' => $tags, 'accommodations' => $accommodations, 'country' => $country, 'states' => $states, 'cities' => $cities];

        return view('admin.product.create')->with($data);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param Request $request
     * @return Response
     */
    public function store(ProductStoreRequest $request)
    {

        $request['title'] = strip_tags($request['title']);
        $request['slug']  = str_slug($request['title']);

        $slug = Product::where('title', $request['title'])->get();

        (int)$count = count($slug);

        if ($count > 0) $request['slug'] = $request['slug'] . '-' . $count;

        $input = $request->all();


        if ($request->hasFile('image')) {

            $image      = $request->file('image');
            $path       = public_path() . '/assets/img/products';
            $pathThumb  = public_path() . '/assets/img/products/thumbnails/';
            $pathMedium = public_path() . '/assets/img/products/medium/';
            $ext        = $image->getClientOriginalExtension();


            if ($count > 0) {
                $imageName = str_slug($input['title']) . '-' . $count . '.' . $ext;
            } else {
                $imageName = str_slug($input['title']) . '.' . $ext;
            }

            $image->move($path, $imageName);

            $findimage   = public_path() . '/assets/img/products/' . $imageName;
            $imagethumb  = Image::make($findimage)->resize(360, 230);
            $imagemedium = Image::make($findimage)->resize(600, null, function ($constraint) {
                $constraint->aspectRatio();
            });

            $imagethumb->save($pathThumb . $imageName);
            $imagemedium->save($pathMedium . $imageName);

            $image       = $request->imagethumb = $imageName;
            $imagethumb  = $request->image = $imageName;
            $imagemedium = $request->image = $imageName;

        }


        $input['image']       = $image;
        $input['imagemedium'] = $imagemedium;
        $input['imagethumb']  = $imagethumb;

        $product = Product::create($input);
        $product->tags()->sync($request->tags, false);
        $product->categories()->sync($request->categories, false);

        Session::flash('flash_message', 'Product successfully created!');

        ResponseCache::clear();

        return redirect()->back();
    }

    /**
     * Display the specified resource.
     *
     * @param int $id
     * @return Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $id
     * @return Response
     */
    public function edit($id)
    {
        $product        = Product::FindOrFail($id);
        $accommodations = Accommodation::get();
        $users          = User::get();
        $categories     = Category::all();
        $tags           = Tag::all();
        $country        = Country::all();
        $states         = States::all();
        $cities         = Cities::all();
        $workflows      = Workflow::orderBy('id', 'desc')->get();
        $data           = ['product' => $product, 'categories' => $categories, 'users' => $users, 'workflows' => $workflows, 'tags' => $tags, 'accommodations' => $accommodations, 'country' => $country, 'states' => $states, 'cities' => $cities];
        return view('admin.product.edit')->with($data);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param Request $request
     * @param int     $id
     * @return Response
     */
    public function update(ProductUpdateRequest $request, $id)
    {

        $request['title'] = strip_tags($request['title']);
        $slug             = DB::table('product')->select('slug')->where('id', '=', $id)->get();

        $slugname = $slug[0]->slug;

        $input = $request->all();

//        dd($request);

        $product = Product::FindOrFail($id);

        $product->fill($input)->save();

        if ($request->hasFile('image')) {

            $image      = $request->file('image');
            $path       = public_path() . '/assets/img/products';
            $pathThumb  = public_path() . '/assets/img/products/thumbnails/';
            $pathMedium = public_path() . '/assets/img/products/medium/';
            $ext        = $image->getClientOriginalExtension();

            $imageName = $slugname . '.' . $ext;

            $image->move($path, $imageName);

            $findimage  = public_path() . '/assets/img/products/' . $imageName;
            $imagethumb = Image::make($findimage)->resize(200, null, function ($constraint) {
                $constraint->aspectRatio();
            });

            $imagemedium = Image::make($findimage)->resize(400, 400, function ($constraint) {
                $constraint->aspectRatio();
            });

            $imagethumb->save($pathThumb . $imageName);
            $imagemedium->save($pathMedium . $imageName);

            $image       = $request->imagethumb = $imageName;
            $imagethumb  = $request->image = $imageName;
            $imagemedium = $request->image = $imageName;

            $input['image']       = $image;
            $input['imagemedium'] = $imagemedium;
            $input['imagethumb']  = $imagethumb;

        }

        $product->fill($input)->save();
        $product->tags()->sync($request->tags, true);
        $product->categories()->sync($request->categories, true);
        Session::flash('flash_message', 'Product successfully edited!');

        ResponseCache::clear();

        return redirect()->back();
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $id
     * @return Response
     */
    public function destroy($id)
    {
        $product = Product::FindOrFail($id);

        // Delete blog images
        $image       = public_path() . '/assets/img/products/' . $product->image;
        $imagemedium = public_path() . '/assets/img/products/medium/' . $product->image;
        $imagethumb  = public_path() . '/assets/img/products/thumbnails/' . $product->image;

        unlink($image);
        unlink($imagemedium);
        unlink($imagethumb);

        $product->delete();

        ResponseCache::clear();

        return redirect()->route('admin.product.index');
    }


}
 
Член од
26 јануари 2009
Мислења
11.596
Поени од реакции
18.018
Repository pattern. И не Simple Repository, туку Repository каде сите елоквент методи ти се сместени и имплементирани во абстрактна класа RepositoryAbstract која пак ќе екстендува RepositoryInterface каде се декларирани тие методи. Е сега најважниот дел во абстрактната класа треба да имаш еден абстрактен метод, кој ќе се вика да речеме getModel(), кој ќе мора да го имплементираат child класите на таа абстрактна класа, на пример UserRepository која ќе ја екстендува RepositoryAbstract. Тие чајлд класи кои ќе ја екстендуваат абстрактната класа во тој метод getModel ќе треба да вратат целосна патека на моделот кој го претставуваат во нашиот случај User моделот. После во абстрактната класа треба да имаш уште еден битен метод makeModel() кој врз база на патеката од getModel() методот со помош на IOC контејнерот ќе креира инстанца од моделот чија патека ти е вратена. И на крај само праиш dependency injection на UserRepository во UserController во конструкторот.

Simple stuff :)

Ако и покрај ова имаш бизнис логика која ти се повторува во методите од контролерот тогаш ќе ја изолираш во метод од трејт и ќе го повикуваш само тој метод на местата каде си имал повторувачки код.
 
Последно уредено:
Член од
1 февруари 2007
Мислења
408
Поени од реакции
15
Фака друзе сите имиџ аплоад форми отидоа у трејд а Repository не ми бесе баш нај јасно ама изгледав туторијалче едно две и контролерот сега 90%помал и го личи :) фала на совет
 

Kajgana Shop

На врв Bottom