0

私はラミナに比較的慣れていないので、ラミナでどのように処理する必要があるかが非常に複雑に見えます。私の場合、DB アダプターのインスタンスが必要です。

プロジェクトは次のようになります。

メール クラスのインスタンスを (ポスト リクエストの場合に) 作成する IndexController (およびファクトリ) があり、そのメール クラスは MailQueueTable にデータを追加することになっています。しかし、MailQueueTable で DB アダプターを取得する方法がわかりません

ソースコードは次のとおりです。

IndexControllerFactory.php

<?php

declare(strict_types=1);

namespace Test\Controller\Factory;

use Interop\Container\ContainerInterface;
use Laminas\ServiceManager\Factory\FactoryInterface;
use Test\Controller\IndexController;


class IndexControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestName, array $options = null)
    {
        return new IndexController(
            $container->get('ApplicationConfig')
        );
    }
}

IndexController.php

<?php

declare(strict_types=1);

namespace Test\Controller;

use Laminas\Config\Config;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Mail\Model\Mail;


class IndexController extends AbstractActionController
{
    private $config;

    public function __construct(array $config)
    {
        $this->config = $config;
    }


    public function indexAction()
    {
        $request = $this->getRequest();
     
        if ($request->isPost()) {     
                $Mail = new Mail();
                $Mail->send();
            }
        }
    }
}

メール.php

<?php

namespace Mail\Model;

use Laminas\View\Model\ViewModel;
use Mail\Model\Table\MailQueueTable;


class Mail {

    public function send()
    {
        $MailQueueTable = new MailQueueTable();
        $MailQueueTable->add();
    }

}

MailQueueTable.php

<?php

declare(strict_types=1);

namespace Mail\Model\Table;

use Laminas\Db\Adapter\Adapter;
use Mail\Model\Mail;

class MailQueueTable extends AbstractTableGateway
{
    protected $adapter;
    protected $table = 'mail_queue';


    public function __construct(Adapter $adapter)
    {
        // Here starts the problem...
        // As far as I understand, I have to inject
        // the DB Adapter in the Construct of the
        // AbstractTableGateway Class...
        // But no idea how to get it here...

        $this->adapter = $adapter;
        $this->initialize();
    }


    public function add()
    {
        // SQL Insert Statement would be here
    }
}

MailQueue テーブルコードは、私が読んだチュートリアルに基づいて、コンストラクターなどに関するものです。ご覧のとおり、コンストラクトにはアダプターが必要です。しかし、この時点でアダプターを取得する方法がわかりません。

今まで読んだ限りでは、インデックス コントローラー ファクトリに DB アダプターを挿入する必要があります。次に、インデックス コントローラーのアクションから新しく作成されたメール インスタンスに挿入し、そこから MailQueue テーブルに挿入する必要があります。

これが正しい解決策だとは思いません-ラミナを使用する前に、私はただ書くことができました

global $DB;

そして、DBを利用できるようにしました。

4

2 に答える 2

0

素晴らしい回答をありがとうございました。

つまり、コントローラーで「必要になる可能性がある」/「インスタンスを作成する可能性がある」すべてのクラスについて、 ControllerFactory で宣言する必要がありますか?

わお。Laminas は、この「単純な」例のために本当に多くのコードを必要とします。

あなたの答えは素晴らしいですが、それは新しい問題につながります:

  1. Mailこの内部でインスタンスを取得すると、クラスのコンストラクターがクラスのコンストラクター(つまり、メールアドレス、メールの内容など、IndexController 内で作成されているもの) にIndexControllerFactory.php変数を渡すことができないという問題が発生します。なれ:MailMail
    public function __construct(MailQueueTable $mailQueueTable)
    {
        $this->mailQueueTable = $mailQueueTable;
    }

私はそれが正しいと思いますか?

  1. 私は、waxmud studios の laminas youtube チュートリアルに従っていました。DB チュートリアルはこちらです: https://www.youtube.com/watch?v=07h3OBIF9kc

DB資格情報、DB名などを構成ファイルに保存します。MailQueueTableFactoryあなたが言及したように、それらを再度配置する代わりに、どうすればそれらにアクセスできますか? DB アダプターのインスタンスを取得してから にIndexControllerFactory渡しIndexController、そこからMail?に渡します。

  1. 私がまだ理解していない奇妙なことは、 に を注入するMailQueueTableIndexControllerFactory、つまり:
class IndexControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestName, array $options = null)
    {
        return new IndexController(
            $container->get(MailQueue::class)
        );
    }
}

を作成する必要はなくMailQueueTableFactory、DB資格情報などを渡す必要もありません。どういうわけかMailQueueTable、アダプターを取得するようです... ?!

于 2020-10-23T14:00:09.720 に答える