6

Zend Framework 2 アプリケーションにモジュールZfcUserを追加しました。しかし、ZfcUser のデフォルトのテーブル構造とは少し異なる列名を持つ既存のデータベース テーブルを使用する必要があります。

ZfcUser wiki ページでは、モデルが提供されたインターフェイスに準拠していない場合、カスタム マッパーを使用できると書かれています。また、データベース テーブルがデフォルトと異なるため、ユーザー エンティティ クラスも標準の ZfcUser\Entity\User とは異なります。しかし、ファイルconfig/autoload/zfcuser.global.phpの設定をオーバーライドすることで、 ZfcUser に自分のクラスを簡単に操作するように指示できます。

'user_entity_class' => 'MyApp\Entity\MyUser',

しかし、これまでのところ、ZfcUser にマッパー クラスを使用するように指示する簡単な方法は見つかりませんでした。

マッパーが ZfcUser\Module::getServiceConfig() によって作成されていることがわかりました。その内部では、マッパーがファクトリ関数から返されていることがわかります。

// ...
public function getServiceConfig()
{
    return array(
    // ...
        'factories' => array(
            // ...
            'zfcuser_user_mapper' => function ($sm) {
                $options = $sm->get('zfcuser_module_options');
                $mapper = new Mapper\User();
                $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter'));
                $entityClass = $options->getUserEntityClass();
                $mapper->setEntityPrototype(new $entityClass);
                $mapper->setHydrator(new Mapper\UserHydrator());
                return $mapper;
            },
            // ...

ZfcUser にカスタム ユーザー マッパー クラスを使用させる方法はありますか?

4

3 に答える 3

4

私はあなたと同じ問題を抱えていましたが、ついに私のアプリケーションにログインすることができました. Rob のアドバイスに従い、既存のユーザー モジュール内に独自のサービス ファクトリを作成しました。残念ながら、ベルンハルトも注目です。機能させるには、ZfcUser のソース コードを掘り下げる必要があります。私が現在取り組んでいるプロジェクトには MSSQL サーバーがあり、物事を処理するのは大変だったと言わざるを得ません。ログインページを機能させるために、ZfcUser ソース内の 1 つの関数だけを微調整することになりました。

現在のアプリケーションではログイン機能のみが必要ですが、今後のプロジェクトではさらに役割が重視されます。すぐに接続できるほど複雑でなく、同時に将来の選択肢と可能性を提供するものを探していました。

これが私が今やったことと私が学んだことです:

Entity フォルダーと Mapper フォルダーを ZfcUser ディレクトリから既存の b2bUser (私のモジュール) フォルダーにコピーしました。すべて... Mapper 内の Exception フォルダーでさえも。必要ではないかもしれませんが、依存関係を理解する気分にはなりませんでした。

zfcuser.global.php ファイルでは、アクティブな構成は次のようになります。

'user_entity_class' => 'b2bUser\Entity\User',
'enable_registration' => false,
'enable_username' => true,
'auth_identity_fields' => array( 'username' ),
'login_redirect_route' => 'home',
'enable_user_state' => false,

残りの設定はデフォルトのままにしました。システムへのログインに電子メール アドレスを使用しないため、認証 ID から電子メール オプションを削除しました。それuser_entity_classは私がコピーしたものです...

Module.php (b2bUser) 以下をサービス マネージャー構成にコピーしました。

'zfcuser_user_mapper' => function ($sm) {
    $mapper = new Mapper\User();
    $mapper->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
    $mapper->setEntityPrototype(new Entity\User());
    $mapper->setHydrator(new Mapper\UserHydrator());
    return $mapper;
},

セットアップが完了したら、エンティティとマッパーのファイルの名前空間などを変更して、新しいホームを反映させました。エンティティとインターフェイスを変更して、独自のデータ構造を反映させました。Mapper ファイルでも同じことを行い、Hydrator ファイルの変数名がデータベースの列名と同じであることを確認しました。

AbstractDbMapper ファイルを元の場所に残しました。しかし、これは私が少し調整したファイルです。

これが私の外観です。SQLSRV ドライバーは、オブジェクトまたは文字列についてずっと不平を言って、プーさんでいっぱいでした...

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null)
{
    $this->initialize();
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select);
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString);
    $stmt->prepare();
    $res = $stmt->execute($stmt);

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(),
            $entityPrototype ?: $this->getEntityPrototype());
    $resultSet->initialize($res);
    return $resultSet;
}

そして、それはそれです。少なくとも誰かが自分のシステムで起動して実行するのに役立つことを願っています. 私はこのように私のものを残すつもりはありませんが、それを機能させるのはちょっとした使命でした.

于 2012-12-15T02:58:29.623 に答える
4

独自のサービス ファクトリを作成するzfcuser_user_mapperと、それが使用されます。

于 2012-11-24T14:21:00.590 に答える
0

現在、ZfcUser ソースを変更せずにテーブル構造を変更する簡単な方法はないようです。この問題を解決するはずの Github のプル リクエストがあります。

https://github.com/ZF-Commons/ZfcUser/pull/174

于 2012-11-08T16:32:52.747 に答える