genaker / laragento
使用 Laravel 或任何 PHP 框架与 Magento 后端
Requires
- php: >=7.3
- illuminate/database: ^8
README
Magento 2 基于废弃的 Zend Framework 1 的遗留代码,其上还有一个非常丑陋的基于过时的 Zend_DB 的 ORM。Zend_DB 甚至不在最新版本中。
这个仓库是一个 Model 类的集合,允许您直接从 Magento 2 数据库中获取数据,使用现代 ORM。
Laragento 是基于 Eloquent ORM(来自 Laravel 框架)的一系列 PHP 类的集合,它提供了一个流畅的接口,可以直接连接和从 Magento 数据库中获取数据。
您可以使用遗留的 Magento 2 作为后端(管理面板),以及任何其他 PHP 应用程序(Symfony/Laravel/Lumen/Vanilla.PHP 等)并查询这些数据(作为一个模型层)。与 Laravel 一起使用 Laragento 更容易,但您也可以自由地将其与任何使用 Composer 的 PHP 项目一起使用。
历史
在 VueStorefron 和 Hyva Theme(一个全新的、不重用 Magento UI 且以 Laravel 生态系统为基座的 Alpine.JS / Tailwind CSS 的前端)发布之后,每个人都明白,构建一个优秀的电子商务网站的唯一方法不是使用 M2 破损的遗留前端/后端功能。我已经使用这个库三年了,只看到了好处。即使您需要从头开始重新实现功能,这也比重用 Adobe Commerce 破损的核心框架臃肿软件快得多。
为什么选择 Laravel 和 Eloquent?
Laravel 是最受欢迎的 PHP 框架。我使用过不同的 ORM,Eloquent 是最好的。
Magento ORM 概念
数据是任何 Web 应用程序的本质。模型是 ORM 的本质。模型是对数据库中 Magento 表的一种抽象表示。在 Larafento 中,它是一个扩展基本 Eloquent/Model 的类。
模型告诉 Eloquent 关于它所代表的实体的一些信息,例如数据库中的表名以及可选的列(及其数据类型)。
模型有一个名称。这个名称不必与它在数据库中表示的 Magento 表的名称相同。catalog_product_entity -> CatalogProductEntity。
扩展基本 Magento 模型
自定义涉及创建新的 Eloquent 模型,这些模型扩展了 Magento 基础模型。通过扩展模型,您可以继承父模型的全部功能,同时保留添加自定义、作用域、事件监听器等的能力。此外,还可以使用仓库模式,但这又是另一个故事了。基础模型仅表示数据表操作。
class ProductSimple extends CatalogProductEntity
{
public static function boot()
{
parent::boot();
static::addGlobalScope(function ($query) {
$query->where('type_id', 'simple');
});
}
public function getBySku(string $sku) {
$this->where('sku', $sku);
}
}
文档
此解决方案不需要文档,因为它重用了广泛使用的软件开发工具,而不是 Magento 2 自家构建的框架。
官方 Eloquent 文档: https://laravel.net.cn/docs/8.x/eloquent
如果您有任何问题或需要企业(Adobe Commerce)版本支持,请创建一个工单或给我发电子邮件至:yegorshytikov@gmail.com
安装 Laragento
您需要使用 Composer 将 Laragento 安装到您的项目中
composer config repositories.foo '{"type": "vcs", "url": "https://github.com/Genaker/laragento", "trunk-path": "master"}'
composer require Genaker/laragento
不推荐通过 Composer 安装。请使用其他 PHP 框架安装,通过添加额外的自动加载文件来代替 Composer 版本。我们无法再为所有 Magento 版本提供兼容性。此外,Magento 使用过时的包,而 Eloquent 用新的依赖项替换了这些依赖项,这产生了问题。但您可以尝试,有一种方法可以修复。阅读 -> 与 Magento 2/1 框架集成
不使用Eloquent安装。最小化
composer require illuminate/database
其他PHP框架(非Laravel和Magento)设置
在此,您需要配置数据库以与Magento协同工作。首先,如果尚未加载,应包含Composer自动加载文件
require __DIR__ . '/vendor/autoload.php';
现在您必须设置您的Magento2数据库参数
$params = array(
'database' => 'database_name',
'username' => 'username',
'password' => 'pa$$word',
'prefix' => ''
);
Laragento\DB::connect($params);
您可以指定所有Eloquent参数,但其中一些是默认的(但您可以覆盖它们)。
'driver' => 'mysql',
'host' => 'localhost',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
Magento自动数据库连接脚本
$conf = include(BP . "/app/etc/env.php");
$db = $conf["db"]["connection"]["default"];
$host = $db["host"];
$user = $db["username"];
$password = $db["password"];
$dbname = $db["dbname"];
$params = array(
'host' => $db["host"],
'database' => $dbname,
'username' => $user,
'password' => $password,
'prefix' => ''
);
Laragento\DB::connect($params);
但是最好将其用作单独的Magento-les微服务入口点,在单独的目录中与Laravel或Lumen一起。
为了简单起见,我们将配置转换为JSON并使用它,并从原始配置读取config.json
php -r '$x = include("app/etc/env.php"); echo json_encode($x);' > config.json
LAravel Magento与Tinker(REPL)
Laravel Tinker是一个由PsySH包提供的强大的Laravel框架REPL。
Tinker安装
所有Laravel应用程序默认包含Tinker。但是,如果您之前已将其从应用程序中删除,则可以使用Composer安装Tinker。
composer create-project laravel/laravel laragento
cd laragento
composer require laravel/tinker
composer config repositories.foo '{"type": "vcs", "url": "https://github.com/Genaker/laragento", "trunk-path": "master"}'
composer require Genaker/laragento:dev-main
在.env文件中设置适当的数据库连接
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
Tinker使用
Tinker允许您通过命令行与整个Laravel应用程序交互,包括您的Eloquent模型(Laragento)、作业、事件等。要进入Tinker环境,请运行tinker Artisan命令
php artisan tinker
$products = Laragento\Models\CatalogProductEntity::first();
$products = Laragento\Models\CatalogProductEntity::where('sku', '21157');
$products = Laragento\Models\CatalogProductEntity::where('sku', '21157')->with('catalog_product_entity_varchars')->get();
$orders = Laragento\Models\SalesOrder::limit(10)->with('sales_order_items', 'sales_invoices', 'sales_order_payments', 'sales_creditmemos', 'sales_order_addresses', 'sales_shipments', 'customer_entity')->get();
$orders->toJson();
$creditMemo = Laragento\Models\SalesCreditmemo::limit(1)->with('sales_order','sales_creditmemo_items','sales_creditmemo_comments', 'sales_creditmemo_items')->get(); $creditMemo->toArray()
$invoices = Laragento\Models\SalesInvoice::limit(1)->with('sales_order','sales_invoice_items','sales_invoice_comments')->get(); $invoices->toJson();
Magento订单到ERM实现的示例
require __DIR__ . '/vendor/autoload.php';
$orders = Laragento\Models\SalesOrder::whereNull('sync_status')->with('sales_order_items', 'sales_invoices', 'sales_order_payments', 'sales_creditmemos', 'sales_order_addresses', 'sales_shipments', 'customer_entity', 'sales_payment_transactions')->get();
foreach ($oreders as $order) {
$response = $erp->orderAPI($order->toJson());
if ($response->responseCode === 200) {
$order->sync_status = 'sent_to_erp';
$order->save();
} else {
echo "Error";
}
}
不需要ObjectManager、DI和其他内容。
Laravel/Eloquent和静态::方法
一些Magento 2肥胖软件爱好者讨厌静态方法。对于这些人,Laravel有一个解决方案...
静态示例
$user = User::find(1);
var_dump($user->name);
Laravel不是使用静态方法,而是您在用。您可能正在寻找的另一种方法是不使用静态绑定来执行此操作。因此,在您正在使用的任何类中,您应该在构造函数中设置类似以下内容...
public function __construct(User $user)
{
$this->user = $user;
}
然后您可以将您的代码修改为不使用静态绑定。
$user = $this->user->find(1);
var_dump($user->name);
有关Eloquent的更多信息,您可以在此处观看
https://www.youtube.com/watch?v=uyQH90okBNQ&list=PL8nVHL94VZ18EGJX9iSR01Xx7vgzX6Uar
与Magento 2/1框架集成
将此ORM安装到单独的文件夹
mkdir orm
cd orm
composer require genaker/laragento @dev
运行此命令。Magento 2使用过时的Monolog版本,并在composers中存在冲突
find ./orm/vendor/ -type f -exec sed -i -e 's/Monolog/Monolog2/g' {} \;
mv ./orm/vendor/monolog/monolog/src/Monolog/ vendor/monolog/monolog/src/Monolog2/
在app/bootstrap.php中添加额外的自动加载器
# After This
require_once __DIR__ . '/autoload.php';
# Insert This
require_once __DIR__ . '/../orm/vendor/autoload.php';
在LAravel中加载100个产品到Magento的开销为:0.0051751136779785秒(10个产品:0.0026481151580811秒)。仅自动加载:0.00015616416931152秒。因此,将此生活技巧添加到Magento中没有任何开销。Magento 2框架是一个本能的恐龙。
Magento GraphQL for Laravel/Eloquent
Lighthouse是一个与Magento Eloquent Laravel应用程序集成的GraphQL框架。它结合了两者的最佳思想,使常见任务轻松解决,并在需要时提供灵活性。
更多信息
这真的很酷,Magento开发者可以享受构建现代软件,而不仅仅是调试和解决破损的MAgento 2问题。
使用Laravel查询日志调试查询
Laravel查询日志收集请求中的所有查询。您可以启用此日志,运行查询并转储输出。
DB::enableQueryLog();
App\User::query()
->where('created_at', '<', now()->subYear())
->with('assignedApps', 'courses')
->orderBy('email', 'asc')
->limit(5)
->get();
dump(DB::getQueryLog());
监听查询事件
如果您希望接收应用程序执行的每个SQL查询,您可以使用listen方法。此方法用于记录查询或调试。您可以在服务提供程序中注册您的查询监听器
app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
var_dump(
$query->sql,
$query->bindings,
$query->time
);
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
播种Magento表数据
使用Laragento与https://github.com/orangehill/iseed一起,我们可以根据现有Magento数据库表的数据生成新的种子文件。