zend-framework - Isu konfigurasi fungsi getServiceConfig dalam zend framework2 dan 3
phpcn_u1582
phpcn_u1582 2017-05-16 16:43:14
0
1
654
//Module.php中的一段代码(项目是zend framework2官网上的简单例子)
 public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Album\Model\AlbumTable' =>  function($sm) {
                    $tableGateway = $sm->get('AlbumTableGateway');
                    $table = new AlbumTable($tableGateway);
                    return $table;
                },
                'AlbumTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ),
        );
    }
//zend framework3中的样子
 public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\AlbumTable::class => function($container) {
                    $tableGateway = $container->get(Model\AlbumTableGateway::class);
                    return new Model\AlbumTable($tableGateway);
                },
                Model\AlbumTableGateway::class => function ($container) {
                    $dbAdapter = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }
  1. $smApakah jenisnya?

  2. ModelAlbumTableGateway::class这个怎么理解?整个项目中并没有出现AlbumTableGateway这个类,只有AlbumTableKelas ini

phpcn_u1582
phpcn_u1582

membalas semua(1)
洪涛

自己找了一个相似的问题,原文在下面,翻译在更下面。

sumber: AlbumTableGateway dalam Panduan Pengguna Zend Framework 2

Cara terbaik untuk memikirkan perkara ini ialah kaedah get() ServiceManager mengambil nilai kunci, bukan nama kelas. Nilai utama perlu dipetakan kepada sesuatu yang akan menyebabkan contoh kelas dikembalikan.

Jika kunci berada dalam bahagian invokables, maka ServiceManager akan cuba membuat instantiat rentetan yang ditunjuk oleh kunci dengan andaian bahawa ia adalah nama kelas:

'invokables' => array(
    'some_name' => 'My\Mapper\SomeClassName',
),

Jika kunci berada dalam bahagian kilang, maka ServiceManager akan melaksanakan panggilan balik yang dituju oleh kunci dan mengharapkan contoh objek dikembalikan:

'factories' => array(
    'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),

Secara umum, anda menggunakan kilang apabila anda perlu melakukan sesuatu yang lebih daripada sekadar membuat kelas - biasanya anda perlu menyediakan kelas dengan pergantungan lain. Jika anda hanya perlu membuat instantiate kelas, gunakan invokable.


翻译:
最好这样想:ServiceManagerget()方法接受一个而不是不类天,这个会去匹配invokable或kilang中的元素并返回一个创建的对象。ServiceManagerget()方法接受一个而不是一个类名,这个会去匹配invokablesfactories中的元素并返回一个创建的对象。
如果这个是处于invocables的区域, 它就会实例化匹配到的那个类。

'invokables' => array(
    'some_name' => 'My\Mapper\SomeClassName',
),

如果这个处于工厂里,就会通过指向的callback函数实例化一个对象返回。

'factories' => array(
    'some_name' => function($sm) { return new \My\Mapper\SomeClassName(); },
),

(如果都没匹配到就报错了)
一般来说,只有当你不仅仅是实例化一个已存在的类,而是要去构建一个有其他依赖的类的时候才会使用factories,否则的话就用invokables键中文kod>是处于invocable的区域, 它就会实例化匹配到的那个类。

rrreee 🎜如果这个键处于工厂里,就会通过键指向的panggil balik函数实例化一血。 rrreee 🎜(如果都没匹配到就报错了)🎜一般来说,只有当你不仅仅是实例化嘯实例化嘯实例化家要去构建一个有其他依赖的类的时候才会使用kilang ,否则的话就用invokable就好了🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan