# About mvc db connection, mysqlAdapter

**URL:** <https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042>\
**Category:** Components & MVC\
**Tags:** laminas-db, laminas-mvc\
**Created:** [September 12, 2022, 10:25am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042 "2022-09-12T10:25:49Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![jobsfan](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/jobsfan/32/399_2.png) [@jobsfan](https://discourse.laminas.dev/u/jobsfan)\
**Post date:** [September 12, 2022, 10:25am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/1 "2022-09-12T10:25:49Z")

</div>

> **[Integrating in a Laminas MVC application - laminas-db - Laminas Docs](https://docs.laminas.dev/laminas-db/application-integration/usage-in-a-laminas-mvc-application/)**
>
> Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations

I got

```auto
return [
    'db' => [
        'driver' => 'Pdo',
        'adapters' => [
            mysqlAdapter::class => [
                'driver' => 'Pdo',
                'dsn' => 'mysql:dbname=your_database_name;host=your_mysql_host;charset=utf8',
                'username' => 'your_mysql_username',
                'password' => 'your_mysql_password',
                'driver_options' => [
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ],
            ],
        ],
    ],
];

```

then I use

```auto
public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\MemberTable::class => function($container) {
                    $tableGateway = $container->get(Model\MemberTableGateway::class);
                    return new Model\MemberTable($tableGateway);
                },
                Model\MemberTableGateway::class => function($container){
                    $dbAdapter = $container->get(mysqlAdapter::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Member());
                    return new TableGateway('member', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }

```

However I got error like

> Unable to resolve service “Application\mysqlAdapter” to a factory; are you certain you provided it during configuration?

How to fix this? Anyone can help?

---

<div class="post-metadata">

**Author:** ![ezkimo](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/ezkimo/32/781_2.png) [@ezkimo](https://discourse.laminas.dev/u/ezkimo)\
**Post date:** [September 12, 2022, 2:19pm UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/2 "2022-09-12T14:19:27Z")

</div>

It 's all about namespacing. As long as your config file does not use namespaces the `mysqlAdapter::class` statement must be used as a use statement in your `Module.php` or with a forwarding backslash.

```auto
<?php
declare(strict_types=1);
namespace Application;

use mysqlAdapter;

class Module
{
    public function getServiceConfig()
    {
        return [
            'factories' => [
                $dbAdapter = $container->get(mysqlAdapter::class); 
                // or as \mysqlAdapter::class without the use statement above
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Model\Member());
                return new TableGateway('member', $dbAdapter, null, $resultSetPrototype);
            ]
        ];
    }
}

```

---

<div class="post-metadata">

**Author:** ![jobsfan](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/jobsfan/32/399_2.png) [@jobsfan](https://discourse.laminas.dev/u/jobsfan)\
**Post date:** [September 13, 2022, 2:01am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/3 "2022-09-13T02:01:47Z")

</div>

> [@ezkimo](#):
>
> `use mysqlAdapter;`

thank you so much! Yes, you are right, when I add **use mysqlAdapter;** at to top of module.php  
Everything goes right!

---

<div class="post-metadata">

**Author:** ![ALTAMASH80](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/altamash80/32/895_2.png) [@ALTAMASH80](https://discourse.laminas.dev/u/ALTAMASH80)\
**Post date:** [September 13, 2022, 6:47am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/4 "2022-09-13T06:47:34Z")

</div>

Hi @jobsfan,

I am just curious to know can you still use Lamda functions in Laminas. The one you’ve used above is here.

> [@jobsfan](#):
>
> ```auto
> public function getServiceConfig()
> {
> return [
> 'factories' => [/* I'm talking about these definition below. */
> Model\MemberTable::class => function($container) {
> $tableGateway = $container->get(Model\MemberTableGateway::class);
> return new Model\MemberTable($tableGateway);
> },
> Model\MemberTableGateway::class => function($container){
> $dbAdapter = $container->get(mysqlAdapter::class);
> $resultSetPrototype = new ResultSet();
> $resultSetPrototype->setArrayObjectPrototype(new Model\Member());
> return new TableGateway('member', $dbAdapter, null, $resultSetPrototype);
> },
> ],
> ];
> }
> 
> ```

Thanks!

---

<div class="post-metadata">

**Author:** ![ezkimo](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/ezkimo/32/781_2.png) [@ezkimo](https://discourse.laminas.dev/u/ezkimo)\
**Post date:** [September 13, 2022, 6:55am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/5 "2022-09-13T06:55:49Z")

</div>

Lambda functions still do not pose a problem. Looking at the current `laminas/laminas-servicemanager` package the class `ServiceManager` recognizes callables when getting factories. In line 534ff at `ServiceManager.php` factories are first, it is checked whether the specified factory is a string and the named class exists. This case covers factories as classes. Immediately afterwards, it is checked whether the specified factory is a callable. Since every factory class should implement the PSR \_\_invoke() method, it is a callable, too. So the service manager handles classes and lambdas as well.

I myself prefer to write factories as classes, as this seems much clearer to me. The code is encapsulated and is exactly where it should be. However, callables are still a tried and tested means.

---

<div class="post-metadata">

**Author:** ![COMCDUARTE](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/comcduarte/32/1005_2.png) [@COMCDUARTE](https://discourse.laminas.dev/u/COMCDUARTE)\
**Post date:** [September 22, 2022, 1:59pm UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/6 "2022-09-22T13:59:05Z")

</div>

I actually started taking my adapter out of Module.php. I find it to be much easier.

local.php

```auto
return [
    'service_manager' => [
        'services' => [
            'model-adapter-config' => [
                'driver' => 'PDO',
                'dsn' => 'mysql:host=host;dbname=dbname',
                'username' => 'username',
                'password' => 'password',
            ],
        ],
    ],
];

```

module.config.php

```auto
'service_manager' => [
        'aliases' => [
        ],
        'factories' => [
            'model-adapter' => ModelAdapterFactory::class,
        ],
    ],
];

```

src/Service/Factory/ModelAdapterFactory.php

```auto
namespace Service\Factory;

use Psr\Container\ContainerInterface;
use Laminas\Db\Adapter\Adapter;
use Laminas\ServiceManager\Factory\FactoryInterface;

class ModelAdapterFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $adapter = new Adapter($container->get('model-adapter-config'));
        return $adapter;
    }
}

```

---

<div class="post-metadata">

**Author:** ![ALTAMASH80](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/altamash80/32/895_2.png) [@ALTAMASH80](https://discourse.laminas.dev/u/ALTAMASH80)\
**Post date:** [September 23, 2022, 12:11pm UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/7 "2022-09-23T12:11:21Z")

</div>

@COMCDUARTE,

I’ve to agree to disagree here with your approach. When a much easier and more understandable approach is defined [here](https://github.com/LM-Commons/LmcUser#post-install-laminasdb). Why should I go with your solution which is a sacrilege? Sacrilege is just used here in a humble sense. Don’t take it as an offence. Thanks!

---

<div class="post-metadata">

**Author:** ![COMCDUARTE](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/comcduarte/32/1005_2.png) [@COMCDUARTE](https://discourse.laminas.dev/u/COMCDUARTE)\
**Post date:** [September 23, 2022, 12:36pm UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/8 "2022-09-23T12:36:37Z")

</div>

No Offense. Good information though. Coding is a art, many different techniques out there.

---

<div class="post-metadata">

**Author:** ![ALTAMASH80](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/altamash80/32/895_2.png) [@ALTAMASH80](https://discourse.laminas.dev/u/ALTAMASH80)\
**Post date:** [September 24, 2022, 11:53am UTC](https://discourse.laminas.dev/t/about-mvc-db-connection-mysqladapter/3042/9 "2022-09-24T11:53:31Z")

</div>

Thanks for understanding. Agreed on coding is an art. But, when joining a community I have this dumb idea some configuration should resemble exactly what is shown by the people who have created this community. Then we bring everyone to some common way of writing. But that is just my dumb opinion. In the end thanks for understanding.
