Bonjour à tous,
Comme promis, me revoilà!
Je pense avoir compris un certain nombre de choses. J’espère ne pas trop dire de bétises. Je rappelle que je suis novice en framework. Donc j’espère que vous serez indulgent
avec mes erreurs.
Ancien programme
- Le programme précédent n’avait pas la bonne structure et se référait à une ancienne documentation Docrine.
- le conteneur uma/dic ne gère pas l’autowire et doit être aidé par la console pour trouver les injections à effectuer. Voici une documentation avec du code obsèlte mais qui décrit bien l’utilité de la console:
console
Ce qui n’est pas le cas de d’un containeur PH-DI. Les injections se font automatiquement, lorsque cela est demandé dans le programme
Nouveau programme
Voici les deux documents de référence qui m’ont servi à faire mon programme.
- un excellent tutoriel qui décrit la construction d’un programme PHP-DI et qui m’a appris beaucoup de choses.
[tutoriel](https://odan.github.io/2019/11/05/slim4-tutorial.html. Il est à joour contrairement à la documentation slim qui n’est pas à jour. Je l’ai testé sans problème)
L’auteur attache aussi beaucoup d’importance à bien structurer son programme. Il l’explique au fur et à mesure. Ce qui est génial pour un novice comme moi. Avec quelques connaissances sur l’injection des dépendances, ce tutoriel est vraiment une référence
- documentation doctrine:doc doctrine
Voici les programmes qui ont permit d’installer le servcie EntityManager dans le programme pour pouvoir à partir de données JSON générées par POSTMAN et de les de les enregistrer dans une base de données "users" (OPFDoction.
Voici la structure json à trairer
{
"nom": "Dupont",
"age": 30,
"estEmploye": true
}
Je n’ai pas encore gérer la sécurité et les erreurstext**
Voici les programmes:
- public/index: (tutorial code)
<?php
(require __DIR__ . '/../config/bootstrap.php')->run();
- config/bootstrap (code of the tutorial)
use DI\ContainerBuilder;
use Slim\App;
require_once __DIR__ . '/../vendor/autoload.php';
$container = (new ContainerBuilder())
->addDefinitions(__DIR__ . '/container.php')
->build();
return $container->get(App::class);
-config/settings.php (personnal code)
```php
<?php
// settings.php
return [
'doctrine' => [
'pathToModels' => '__DIR__ . /../src/Models',
'isDevMode' => true,
'connectionMysql' => [
'driver' => 'pdo_mysql',
'dbname' => 'university',
'user' => 'toto',
'password' => 'mdp',
],
],
];
- container.php (tutorial code modified)
<?php
use Slim\App;
use Slim\Factory\AppFactory;
use Doctrine\DBAL\DriverManager;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMSetup;
use Psr\Container\ContainerInterface;
return[
'settings' => function () {
$settings = require __DIR__ . '/settings.php';
return $settings;
},
EntityManager::class => function (ContainerInterface $container) : EntityManager {
$settings = (array)$container->get('settings')['doctrine'];
$paths = [$settings['pathToModels']];
$isDevMode = $settings['isDevMode'];
$dbParams = $settings['connectionMysql'];
$config = ORMSetup::createAttributeMetadataConfiguration($paths, $isDevMode);
$connection = DriverManager::getConnection($dbParams, $config);
return new EntityManager($connection, $config);
},
App::class => function (ContainerInterface $container) {
$app = AppFactory::createFromContainer($container);
(require __DIR__ . '/routes.php')($app);
(require __DIR__ . '/middleware.php')($app);
return $app;
}
];
- config/routes.php (code personnal code)
<?php
use Slim\App;
use App\Controllers\StudentController;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
return function (App $app) {
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write('Hello, World!');
return $response;
});
$app->post('/create/student', StudentController::class . ':createStudent');
};
- src/Controllers/ControllerStudent.php (personnal code):
<?php
namespace App\Controllers;
use App\Models\Student;
use Doctrine\ORM\EntityManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class StudentController
{
private $entityManager;
public function __construct(EntityManager $entityManager){
$this->entityManager = $entityManager;
}
public function createStudent(Request $request, Response $response): Response
{
$data = $request->getParsedBody();
error_log(print_r($data, true), 3, __DIR__ . '/StudentController.log');
$student = new Student();
$student->setName($data['name']);
$student->setFirstname($data['firstname']);
$student->setAge($data['age']);
$this->entityManager->persist($student);
$this->entityManager->flush();
$response->getBody()->write('Étudiant créé avec succès avec l\'ID :' . $student->getId());
return $response->withHeader('Content-Type', 'application/json');
}
- src/Models/Student.php (personnal code)
<?php
namespace App\Controllers;
use App\Models\Student;
use Doctrine\ORM\EntityManager;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
```<?php
namespace App\Models;
use Doctrine\ORM\Mapping as ORM;
class Student{
private $id;
private $name;
private $firstname;
private $age;
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name): void
{
$this->name = $name;
}
public function getFirstname()
{
return $this->firstname;
}
public function setFirstname($firstname): void
{
$this->firstname = $firstname;
}
public function getAge()
{
return $this->age;
}
public function setAge($age): void
{
$this->age = $age;
}
}
Vos remarques sont es bienvenues.
Merci pour votre lecture! Et bonne fin de journée.