如何在 table 处创建单独的 Class 以创建新记录并通过控制器的接口或外观调用它
How to make a separate Class for making new record at table and call it via an Interface or a Facade at the Controller
我想重构在 table products
:
创建新记录的控制器代码
public function store(Request $request)
{
$newPro = Product::create([
'name' => $request->product_name,
'en_name' => $request->product_name_english,
'type' => $request->product_type,
'cat_id' => $request->category_product,
]);
...
}
现在为了重构这段代码,我有两个选择:
1-在同一个Controller中创建一个单独的方法,然后这样调用它:
$newPro = self::createProduct($request->product_name,$request->product_name_english,$request->product_type,$request->category_product)
2- 创建一个单独的 Class 并通过 interface
或 facade
调用它(最佳方式)
现在我想使用第二个选项,但我真的不知道该怎么做!
所以如果你知道请告诉我...
首先创建您的存储库服务提供商:
php artisan make:provider RepositoryServiceProvider
那么你应该在注册方法中映射接口和你的存储库(当然你也必须创建 ProductRepository 和 ProductRepositoryInterface),如:
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(ProductRepositoryInterface::class, ProductRepository::class);
}
之后,您可以将您的存储库注入您的控制器,如:
public function store(Request $request, ProductRepositoryInterface $productRepository)
{
$newPro = $productRepository->createProduct($productData);
...
}
这是您的 ProductRepository:
<?php
namespace App\Repositories;
class ProductRepository extends BaseRepository implements ProductRepositoryInterface
{
protected Product $product;
/**
* @param Product $product
*/
public function __construct(Product $product)
{
$this->product = $product;
}
/**
* @param array $productArray
* @return Product
*/
public function createProduct(array $productArray): Product
{
return $this->product->create($productArray);
}
}
和您的 ProductRepositoryInterface:
<?php
namespace App\Repositories;
interface CategoryRepositoryInterface
{
/**
* @param array $productArray
* @return Product
*/
public function createProduct(array $productArray): Product;
}
我想重构在 table products
:
public function store(Request $request)
{
$newPro = Product::create([
'name' => $request->product_name,
'en_name' => $request->product_name_english,
'type' => $request->product_type,
'cat_id' => $request->category_product,
]);
...
}
现在为了重构这段代码,我有两个选择:
1-在同一个Controller中创建一个单独的方法,然后这样调用它:
$newPro = self::createProduct($request->product_name,$request->product_name_english,$request->product_type,$request->category_product)
2- 创建一个单独的 Class 并通过 interface
或 facade
调用它(最佳方式)
现在我想使用第二个选项,但我真的不知道该怎么做!
所以如果你知道请告诉我...
首先创建您的存储库服务提供商:
php artisan make:provider RepositoryServiceProvider
那么你应该在注册方法中映射接口和你的存储库(当然你也必须创建 ProductRepository 和 ProductRepositoryInterface),如:
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(ProductRepositoryInterface::class, ProductRepository::class);
}
之后,您可以将您的存储库注入您的控制器,如:
public function store(Request $request, ProductRepositoryInterface $productRepository)
{
$newPro = $productRepository->createProduct($productData);
...
}
这是您的 ProductRepository:
<?php
namespace App\Repositories;
class ProductRepository extends BaseRepository implements ProductRepositoryInterface
{
protected Product $product;
/**
* @param Product $product
*/
public function __construct(Product $product)
{
$this->product = $product;
}
/**
* @param array $productArray
* @return Product
*/
public function createProduct(array $productArray): Product
{
return $this->product->create($productArray);
}
}
和您的 ProductRepositoryInterface:
<?php
namespace App\Repositories;
interface CategoryRepositoryInterface
{
/**
* @param array $productArray
* @return Product
*/
public function createProduct(array $productArray): Product;
}