I am fairly new to slim php, i want to learn about containers but with not much luck, i tried so hard to get it done but still i get nothing.
--api
--src
--Controllers
--HomeController.php
--public
--.htaccess
--index.php
.htaccess
index.php
use DI\Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use api\Controllers\HomeController;
use Psr\Container\ContainerInterface;
require __DIR__ . '/../vendor/autoload.php';
$container = new Container();
AppFactory::setContainer($container);
$app = AppFactory::create();
$app->setBasePath('/api');
$container->set('HomeController', function (ContainerInterface $container) {
$view = $container->get('view');
return new HomeController($view);
});
$app->get('/', \HomeController::class . ':home');
$app->run();
HomeController.php
namespace api\Controllers;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class HomeController
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function home(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
$response->getBody()->write('hello');
return $response;
}
}
i tried every youtube video tutorial, read every documentation. with no understanding what so ever, i just need a basic container to work so i can understand it in person and tweak with it, thank you in advance for your patience.
In order to get things going, I suggest you these steps:
settings.php
file at the root of your project.
Something like:<?php
return [
'settings' => [
'slim' => [
'displayErrorDetails' => true,
'logErrors' => true,
'logErrorDetails' => true,
],
],
// The rest of your container settings go here
];
bootstrap.php
file at the root of your project that contains the app container and you can configure that here. An example would be something like:require_once __DIR__ . '/vendor/autoload.php';
$container = new Container(require __DIR__ . '/settings.php');
And you can add more singletons to your container:
$container->set(DefaultController::class, function (Container $c) {
return new DefaultController($c->get(EntityManager::class));
});
So that you can use your EntityManager
in your controllers. Remember that you have to set that and add it to your container as well. With whatever configurations that you want.
index.php
file in the public
folder, and create your app:require __DIR__ . '/../bootstrap.php';
AppFactory::setContainer($container);
$app = AppFactory::create();
composer.json
like this: ...
"autoload": {
"psr-4": {
"Slim\\": "Slim",
"App\\": "src/",
"Test\\": "tests/"
}
},
...