genaker/laragento

使用 Laravel 或任何 PHP 框架与 Magento 后端

1.0.1 2021-11-19 22:55 UTC

This package is auto-updated.

Last update: 2024-09-03 01:27:34 UTC


README

Magento 2 基于废弃的 Zend Framework 1 的遗留代码,其上还有一个非常丑陋的基于过时的 Zend_DB 的 ORM。Zend_DB 甚至不在最新版本中。

这个仓库是一个 Model 类的集合,允许您直接从 Magento 2 数据库中获取数据,使用现代 ORM

LaraGento

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框架。它结合了两者的最佳思想,使常见任务轻松解决,并在需要时提供灵活性。

更多信息

https://lighthouse-php.com/

这真的很酷,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数据库表的数据生成新的种子文件。