This question already has an answer here:
I am working on ecommerce application where i was creating a form to add categories but i;m getting
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262144 bytes) in C:\wamp64\www\ecommerce\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasAttributes.php on line 922
I have created repository to get the data below is my code:
create.blade.php
<form action="" method="POST" role="form" enctype="multipart/form-data">
@csrf
<div class="card-body">
<div class="form-group">
<label for="exampleInputEmail1">Name</label>
<input type="text" class="form-control" name="name" id="name" placeholder="Name">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Description</label>
<input type="text" class="form-control" name="description" id="description"
placeholder="description">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Parent Category</label>
<select id=parent class="form-control custom-select mt-15" name="parent_id">
<option value="0">Select a parent category</option>
@foreach($categories as $key => $category)
<option value=""> </option>
@endforeach
</select>
</div>
<div class="form-group">
<input class="form-check-input" type="checkbox" id="featured"
name="featured" />Featured Category
</div>
<div class="form-group">
<input class="form-control" type="file" id="image" name="image"/>
</div>
<div class="form-group">
<input class="form-check-input" type="checkbox" id="menu" name="menu"/>Show in Menu
</div>
<div class="form-group">
<label for="exampleInputFile">File input</label>
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" id="exampleInputFile">
<label class="custom-file-label" for="exampleInputFile">Choose
file</label>
</div>
<div class="input-group-append">
<span class="input-group-text" id="">Upload</span>
</div>
</div>
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">Check me out</label>
</div>
</div>
<!-- /.card-body -->
<div class="card-footer">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
CategoryController.php
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Contracts\CategoryContract;
use App\Http\Controllers\BaseController;
/**
* Class CategoryController
* @package App\Http\Controllers\Admin
*/
class CategoryController extends BaseController
{
/**
* @var CategoryContract
*/
protected $categoryRepository;
/**
* CategoryController constructor.
* @param CategoryContract $categoryRepository
*/
public function __construct(CategoryContract $categoryRepository)
{
$this->categoryRepository = $categoryRepository;
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$categories = $this->categoryRepository->listCategories();
$this->setPageTitle('Categories', 'List of all categories');
return view('admin.categories.index', compact('categories'));
}
/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function create()
{
$categories = $this->categoryRepository->treeList();
$this->setPageTitle('Categories', 'Create Category');
return view('admin.categories.create', compact('categories'));
}
/**
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:191',
'parent_id' => 'required|not_in:0',
'image' => 'mimes:jpg,jpeg,png|max:1000'
]);
$params = $request->except('_token');
$category = $this->categoryRepository->createCategory($params);
if (!$category) {
return $this->responseRedirectBack('Error occurred while creating category.', 'error', true, true);
}
return $this->responseRedirect('admin.categories.index', 'Category added successfully' ,'success',false, false);
}
/**
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function edit($id)
{
$targetCategory = $this->categoryRepository->findCategoryById($id);
$categories = $this->categoryRepository->treeList();
$this->setPageTitle('Categories', 'Edit Category : '.$targetCategory->name);
return view('admin.categories.edit', compact('categories', 'targetCategory'));
}
/**
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
* @throws \Illuminate\Validation\ValidationException
*/
public function update(Request $request)
{
$this->validate($request, [
'name' => 'required|max:191',
'parent_id' => 'required|not_in:0',
'image' => 'mimes:jpg,jpeg,png|max:1000'
]);
$params = $request->except('_token');
$category = $this->categoryRepository->updateCategory($params);
if (!$category) {
return $this->responseRedirectBack('Error occurred while updating category.', 'error', true, true);
}
return $this->responseRedirectBack('Category updated successfully' ,'success',false, false);
}
/**
* @param $id
* @return \Illuminate\Http\RedirectResponse
*/
public function delete($id)
{
$category = $this->categoryRepository->deleteCategory($id);
if (!$category) {
return $this->responseRedirectBack('Error occurred while deleting category.', 'error', true, true);
}
return $this->responseRedirect('admin.categories.index', 'Category deleted successfully' ,'success',false, false);
}
}
Category.php
<?php
namespace App\Models;
use App\Models\Product;
use TypiCMS\NestableTrait;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use NestableTrait;
/**
* @var string
*/
protected $table = 'categories';
/**
* @var array
*/
protected $fillable = [
'name', 'slug', 'description', 'parent_id', 'featured', 'menu', 'image'
];
/**
* @var array
*/
protected $casts = [
'parent_id' => 'integer',
'featured' => 'boolean',
'menu' => 'boolean'
];
/**
* @param $value
*/
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
$this->attributes['slug'] = Str::slug($value);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function children()
{
return $this->hasMany(Category::class, 'parent_id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function products()
{
return $this->belongsToMany(Product::class, 'product_categories', 'category_id', 'product_id');
}
}
RepositoryServiceProvider.php
<?php
namespace App\Providers;
use App\Contracts\CategoryContract;
use Illuminate\Support\ServiceProvider;
use App\Repositories\CategoryRepository;
class RepositoryServiceProvider extends ServiceProvider
{
protected $repositories = [
CategoryContract::class => CategoryRepository::class,
];
/**
* Register services.
*
* @return void
*/
public function register()
{
foreach ($this->repositories as $interface => $implementation)
{
$this->app->bind($interface, $implementation);
}
}
}
CategoryContract.php
<?php
namespace App\Contracts;
/**
* Interface CategoryContract
* @package App\Contracts
*/
interface CategoryContract
{
/**
* @param string $order
* @param string $sort
* @param array $columns
* @return mixed
*/
public function listCategories(string $order = 'id', string $sort = 'desc', array $columns = ['*']);
/**
* @param int $id
* @return mixed
*/
public function findCategoryById(int $id);
/**
* @param array $params
* @return mixed
*/
public function createCategory(array $params);
/**
* @param array $params
* @return mixed
*/
public function updateCategory(array $params);
/**
* @param $id
* @return bool
*/
public function deleteCategory($id);
/**
* @return mixed
*/
public function treeList();
/**
* @param $slug
* @return mixed
*/
public function findBySlug($slug);
}
Product.php
<?php
namespace App\Models;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
/**
* @var string
*/
protected $table = 'products';
/**
* @var array
*/
protected $fillable = [
'brand_id', 'sku', 'name', 'slug', 'description', 'quantity',
'weight', 'price', 'sale_price', 'status', 'featured',
];
/**
* @var array
*/
protected $casts = [
'quantity' => 'integer',
'brand_id' => 'integer',
'status' => 'boolean',
'featured' => 'boolean'
];
/**
* @param $value
*/
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
$this->attributes['slug'] = Str::slug($value);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function categories()
{
return $this->belongsToMany(Category::class, 'product_categories', 'product_id', 'category_id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function images()
{
return $this->hasMany(ProductImage::class);
}
}
ProductImage.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ProductImage extends Model
{
/**
* @var string
*/
protected $table = 'product_images';
/**
* @var array
*/
protected $fillable = ['product_id', 'full'];
/**
* @var array
*/
protected $casts = [
'product_id' => 'integer',
];
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function product()
{
return $this->belongsTo(Product::class);
}
}
Traits/UploadAble.php
<?php
namespace App\Traits;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
/**
* Trait UploadAble
* @package App\Traits
*/
trait UploadAble
{
/**
* @param UploadedFile $file
* @param null $folder
* @param string $disk
* @param null $filename
* @return false|string
*/
public function uploadOne(UploadedFile $file, $folder = null, $disk = 'public', $filename = null)
{
$name = !is_null($filename) ? $filename : str_random(25);
return $file->storeAs(
$folder,
$name . "." . $file->getClientOriginalExtension(),
$disk
);
}
/**
* @param null $path
* @param string $disk
*/
public function deleteOne($path = null, $disk = 'public')
{
Storage::disk($disk)->delete($path);
}
}
via Chebli Mohamed
Aucun commentaire:
Enregistrer un commentaire