Как лучше всего использовать несколько контроллеров и моделей в Laravel? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть проект с несколькими контроллерами и моделями.Например, таблица products имеет таблицу " child " (деталь продукта) с именем "producto_material".

Во внешнем интерфейсе пользователь создает новый продукт, но этот продукт должен содержать хотя бы одну деталь.Когда пользователь нажимает «Создать продукт», запрос отправляется с информацией о продукте ( products ) и подробной информацией о продукте ( producto_material ).

В данный момент у меня естьследующая структура:

  • Контроллеры (ProductoController, ProductoMaterialController)
  • Модели (ProductoModel, ProductoMaterialModel)

Мне нравится, что каждый контроллер позаботится о вашемс собственной проверкой, но запрос идет к ProductController.

Веб-маршруты:

Route::resource('products', 'ProductoController');
Route::get('duplicar/{param?}', 'ProductoExtController@duplicar');
Route::post('mostrarProductos', 'ProductoExtController@mostrarProductos');
Route::post('guardarValoresEditados', 'ProductoExtController@guardarValoresEditados');
Route::get('imprimirListadoPrecios', 'ProductoExtController@imprimirListadoPrecios');
Route::post('mostrarProductosStickers', 'ProductoExtController@mostrarProductosStickers');
Route::post('imprimirStickers','ProductoExtController@imprimirStickers');

Контроллер продукта:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Modelos\ProductsModel;
use App\Modelos\ProductoMaterialModel;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Arr;
use App\Http\Requests\ProductoValidationRules;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;


class ProductoController extends Controller
{

    protected $proMaterialesProducto;

    public function __construct(ProductoMaterialController $pMaterialesProducto)
    {
        $this->proMaterialesProducto = $pMaterialesProducto;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if (\Gate::allows('isAdmin') || \Gate::allows('isUser')){
            return ProductsModel::latest()
                        ->orderBy('created_at','desc')
                        ->paginate(10);
        }
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(ProductoValidationRules $request)
    {   
        $vIntIdProducto = 0;

        try {
            $validated = $request->validated();

            DB::beginTransaction();

            $vIntIdProducto = ProductsModel::insertGetId([
                'f014_nombre' => $request['nombre'],
                'f014_precio_basico'=> $request['vlrBasico'],
                'f014_precio_premium' => $request['vlrPelete'],
                'f014_categoria_id'  => $request['categoria'],            
                'f014_id_coleccion'=> $request['coleccion'],
                'created_at'=> Carbon::now()->toDateTimeString(),     
                'f014_creado_por'=> Auth::id(),
            ]);

            foreach (Arr::get($request,'colores') as $key => $color) {
                ProductoMaterialModel::insert([
                    'f019_producto_id' => $vIntIdProducto,
                    'f019_crosta_id'=> Arr::get($color,'crosta.valor'),
                    'f019_id_folia1' => Arr::get($color,'folia1.valor'),
                    'f019_id_folia2'  => Arr::get($color,'folia2.valor'),          
                    'f019_id_folia3'=> Arr::get($color,'folia3.valor'),
                    'f019_color'=> Arr::get($color,'color'),
                    'f019_creado_por'=> Auth::id(),
                ]);
            }

            DB::commit();

            return response()
            ->json(['status' => true]);

        } catch (\Throwable $th) {
            DB::rollBack();
            return response()
            ->json([
                'status' => false,
                'message' => 'Fallo la creación del producto '.$th->getMessage()
            ]);
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $vProductsModel = ProductsModel::with(
                            'MaterialesCombinaciones.Crostas',
                            'MaterialesCombinaciones.Folia1',
                            'MaterialesCombinaciones.Folia2',
                            'MaterialesCombinaciones.Folia3'
                        )
                        ->where('f014_id',$id)
                        ->get();

        return response()
                ->json($vProductsModel);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $vProductos = null;

        try {
            DB::beginTransaction();

            $vProductos = ProductsModel::find($id);
            $vProductos->f014_precio_basico = $request['vlrBasico'];
            $vProductos->f014_precio_premium = $request['vlrPelete'];
            $vProductos->f014_modificado_por = Auth::id();

            $vProductos->save();

            foreach (Arr::get($request,'colores') as $key => $color) {
                ProductoMaterialModel::updateOrCreate(
                    [
                        'f019_producto_id' => $id, 
                        'f019_crosta_id' => Arr::get($color,'crosta.valor'),
                        'f019_color'=>Arr::get($color,'color')
                    ],
                    [
                        'f019_id_folia1' => Arr::get($color,'folia1.valor'),
                        'f019_id_folia2' =>  Arr::get($color,'folia2.valor'),
                        'f019_modificado_por'=>Auth::id()
                    ]
                );
            }


            DB::commit();
            return response()
            ->json(['status' => true]);
        } catch (\Throwable $th) {

            DB::rollBack();
            return response()
            ->json([
                'status' => false,
                'message' => 'Fallo la actualización del producto '.$th->getMessage()
            ]);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        ProductsModel::destroy($id);
    }
}

Я думаю, что это неправильно:

 $vIntIdProducto = ProductsModel::insertGetId([
                'f014_nombre' => $request['nombre'],
                'f014_precio_basico'=> $request['vlrBasico'],
                'f014_precio_premium' => $request['vlrPelete'],
                'f014_categoria_id'  => $request['categoria'],            
                'f014_id_coleccion'=> $request['coleccion'],
                'created_at'=> Carbon::now()->toDateTimeString(),     
                'f014_creado_por'=> Auth::id(),
            ]);

            foreach (Arr::get($request,'colores') as $key => $color) {
                ProductoMaterialModel::insert([
                    'f019_producto_id' => $vIntIdProducto,
                    'f019_crosta_id'=> Arr::get($color,'crosta.valor'),
                    'f019_id_folia1' => Arr::get($color,'folia1.valor'),
                    'f019_id_folia2'  => Arr::get($color,'folia2.valor'),          
                    'f019_id_folia3'=> Arr::get($color,'folia3.valor'),
                    'f019_color'=> Arr::get($color,'color'),
                    'f019_creado_por'=> Auth::id(),
                ]);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...