{"id":18547824,"url":"https://github.com/neutron-pro/framework-mvc","last_synced_at":"2025-07-18T02:33:51.560Z","repository":{"id":252706499,"uuid":"337935847","full_name":"Neutron-Pro/framework-mvc","owner":"Neutron-Pro","description":"Ceci est mon premier framework mvc.","archived":false,"fork":false,"pushed_at":"2021-02-15T22:55:41.000Z","size":255,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-18T20:46:17.382Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Neutron-Pro.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-11T05:12:22.000Z","updated_at":"2021-06-19T09:18:51.000Z","dependencies_parsed_at":"2024-08-11T23:48:04.953Z","dependency_job_id":null,"html_url":"https://github.com/Neutron-Pro/framework-mvc","commit_stats":null,"previous_names":["neutron-pro/framework-mvc"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/Neutron-Pro/framework-mvc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neutron-Pro%2Fframework-mvc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neutron-Pro%2Fframework-mvc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neutron-Pro%2Fframework-mvc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neutron-Pro%2Fframework-mvc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Neutron-Pro","download_url":"https://codeload.github.com/Neutron-Pro/framework-mvc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Neutron-Pro%2Fframework-mvc/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265692331,"owners_count":23812195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T20:31:51.863Z","updated_at":"2025-07-18T02:33:51.516Z","avatar_url":"https://github.com/Neutron-Pro.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Framework MVC par NeutronStars\n\n---\n\n## Installation du framework\n\n```sh\ngit clone https://github.com/Neutron-Pro/frameword-mvc.git mvc-neutronstars\n```\n\n---\n\n## Configuration du framework\n\n- Copier le fichier `config-dist.php` dans le dossier `config` et coller le dans ce même dossier en le renommant `config.php`.\n\n```php\n\nuse NeutronStars\\Service\\PHPMailer\\PHPMailer;\nuse NeutronStars\\View\\ViewEngine;\n\n// Changer la base de l'url. Ne rien mettre si celui-ci ce trouve à la racine.\n// Exemple: '' =\u003e http(s)://sub.domain.ext/\n// Exemple: '/test' =\u003e http(s)://sub.domain.ext/test/\ndefine('BASE_PATH', '');\n\n// Mettre le nom de votre domaine au complet.\n// Attention: Ne pas mettre le / à la fin. La route s'en occupe déjà.\ndefine('DOMAIN_URL', 'http://localhost');\n\n/*\n * Le moteur par défaut que vous souhaitez sélectionner:\n * ViewEngine::DEFAULT ou ViewEngine::BLADE\n */\ndefine('VIEW_ENGINE', ViewEngine::DEFAULT);\n\n// Changer la location si vous souhaitez déplacer le dossier des layouts.\ndefine('LAYOUTS', '../src/layouts');\n\n// Changer la location si vous souhaitez déplacer le dossier des vues.\ndefine('VIEWS', '../src/views');\n\n// Le cache de vos vues. (Uniquement pour le moteur de Blade)\ndefine('BLADE_CACHE', '../cache');\n\n// Configuration de la base de donnée. (Ce n'est pas obligatoire si vous ne l'utilisez pas.)\n// Le framework utilise une base de donnée SQL.\ndefine('DB_HOST', '127.0.0.1');\ndefine('DB_PORT', 3306);\n\n// Le nom de votre base de donnée.\ndefine('DB_NAME', '');\n// Le nom de l'utilisateur.\ndefine('DB_USER', '');\n// Le mot de passe\ndefine('DB_PASSWORD', '');\n// Le jeu d'encodage des caractères.\ndefine('DB_CHARSET', 'utf8mb4');\n// Le type des résultats que vous souhaitez pour vos réponses.\ndefine('DB_FETCH_MODE', PDO::FETCH_OBJ);\n// Le mode d'erreur en cas de problème sur vos requêtes.\ndefine('DB_ERROR_MODE', PDO::ERRMODE_WARNING);\n\n// Configuration de PHPMailer. (Ce n'est pas obligatoire si vous ne souhaitez pas envoyer de mail.)\n// Le serveur de votre boite mail\ndefine('MAIL_HOST', '');\n// Le port du serveur de votre boite mail\ndefine('MAIL_PORT', '');\n// L'email qui servira à l'envoi.\ndefine('MAIL_USER', '');\n// Le mot de passe de l'email.\ndefine('MAIL_PASSWORD', '');\n// Le jeu de caractère dans les emails à envoyer.\ndefine('MAIL_CHARSET', PHPMailer::CHARSET_UTF8);\n// L'email qui sera affiché dans la section de l'expéditeur dans le mail du client. (Peut-être fictif)\ndefine('MAIL_RECIPIENT_EMAIL', '');\n// Le nom de l'expéditeur que le client verra.\ndefine('MAIL_RECIPIENT_NAME', '');\n\n// Configuration de l'authentification des utilisateurs.\n// Définir le namespace de votre class User qui extends de NeutronStars\\Entity\\UserInterface\ndefine('USER_ENTITY', 'App\\\\Entity\\\\User');\n// Définir la class de chargement de l'utilisateur s'il est authentifié.\n// La class doit implémenter de NeutronStars\\Service\\AuthentificationInterface\n// define('USER_LOADER', 'App\\\\Service\\\\Authentification');\n// Le délai que la saison de l'utilisateur soit maintenant depuis sa dernière connexion.\n// define('USER_TIMEOUT', 86400);\n```\n\nPensez à bien démarrer votre serveur vers le dossier `public`.\n\n---\n\n## Démarrer le serveur avec PHP\n\n```shell\n# Si votre console se trouve à la racine du projet:\nphp -S 127.0.0.1:8080 -t public/\n\n# Si votre console se trouve dans le dossier public:\nphp -S 127.0.0.1:8080\n```\n\n---\n\n## Les routes\n\nPour ajouter des nouvelles routes, allez dans le fichier `routes.php` qui se trouve dans le dossier `config`.\n\n```php\nuse NeutronStars\\Kernel;\n\nKernel::get()-\u003egetRouter()\n    -\u003eadd('home', [\n        'path'       =\u003e '/',\n        'controller' =\u003e 'App\\\\Controller\\\\HomeController#home'\n    ])\n    -\u003eadd('404', [\n        'path'       =\u003e '/404',\n        'controller' =\u003e 'App\\\\Controller\\\\ErrorController#call404'\n    ]);\n```\n\nLes routes sont ajoutées grâce à la méthode `add` de `Router`. Ensuite vous devez lui renseigner un nom et un tableau contenant des paramètres clef.\n\n```php\nuse NeutronStars\\Service\\Role;\n\n$params = [\n    /* L'URL à entrer dans le navigateur. */\n    'path' =\u003e '/test',\n    /* \n        Le chemin vers le controller ou la route se rendra ainsi que la méthode à appeler se trouvant dans se même controller. \n        Pattern: Your\\\\Namespace\\\\YourClassController#yourMethod\n    */\n    'controller' =\u003e 'App\\\\Controller\\\\TestController#index',\n    /*\n        Permet de donner accès à vos routes qu'à certain utilisateur.\n        [ Role::USER, 'VIP'] =\u003e Donner accès a tous vos utilisateur connecté et à vos utilisateur VIP.\n        // VIP est un role que vous créez vous même.\n        S'il n'est pas renseigné ou bien que le tableau est vide alors toutes les personnes peuvent accéder à la route.\n        Les routes enfants ne prennent pas en compte les restrictions des parents.\n     */\n    'roles' =\u003e [ Role::ANONYMOUS ], // Donne accès a la route qu'aux utilisateurs non connectés.\n    /*\n        Les type de requête accepté pour cette route.\n        [ 'GET', 'POST' ] -\u003e Accept les méthode de type GET \u0026 POST uniquement.\n        S'il n'est pas renseigné ou bien que le tableau est vide alors vous autorisez tout type de méthode.\n     */\n    'methods' =\u003e [ 'GET' ] // Accept uniquement les requêtes de type GET.\n];\n// Ajouter votre route\n$router-\u003eadd('test', $params);\n```\n\nIl y a aussi la possibilité d'ajouter des routes enfants ainsi que des paramètres customisés.\n\n```php\n$params = [\n    'path' =\u003e '/parent',\n    'controller' =\u003e 'App\\\\Controller\\\\ParentController#index',\n    /* Ajouter un enfant à la route pour ajouter un chemin après le /test */\n    'children' =\u003e [\n        /* Pour les route enfant c'est exactement les mêmes paramètres que le parent. Juste qu'il prend un nom directement via la clef. */\n        'child' =\u003e [\n            /* Ceci donnera: /parent/children */\n            'path' =\u003e '/children',\n            /*  */\n            'controller' =\u003e 'App\\\\Controller\\\\ParentController#child'\n        ],\n        'child2' =\u003e [\n            /* \n              Pour ajouter une route avec un paramètre customisable, il vous faudra utiliser les accolades\n              Ceci donnera: /parent/test-101\n            */\n            'path' =\u003e '/{slug}-{id}',\n            'controller' =\u003e 'App\\\\Controller\\\\ParentController#child2',\n            /* Ensuite utilisez les paramètres pour indiquer via une regex, la règle à appliquer sur vos clefs dans le path. */\n            'params' =\u003e [\n                /* Le slug accepte tous les caractère de A à Z et de 0 à 9 sans faire attention à la case. */\n                'slug' =\u003e '/[a-zA-Z0-9]+/',\n                /* L'id accepte tous les caractères numérique. */\n                'id'   =\u003e '/[0-9]+/'\n            ],\n            /* Vous pouvez bien sur continuer à créer des enfants dans les enfants sans limite: */\n            'children' =\u003e [\n                'subChild' =\u003e [\n                    /* Ceci donnera: /parent/test-101/sub-child */\n                    'path' =\u003e '/sub-child',\n                    /* Ainsi de suite */\n                    ...\n                ]\n            ]\n        ]\n    ]\n];\n// Puis Ajouter votre route\n$router-\u003eadd('test', $params);\n```\n\n---\n\n## Les controllers\n\nLes controllers seront appelés à la suite d'une route. Elles permettront d'y ajouter la logique de votre page avant son rendu.\n\n```php\nnamespace App\\Controller;\nuse NeutronStars\\Controller\\Controller;\n\nclass ParentController extends Controller\n{\n  public function index(): void\n  {\n    // Ajouter toute la logique de votre page ici avant de faire le rendu.\n    // En cas d'erreur, il est possible de renvoyer la page 404 comme ceci:\n    $this-\u003epage404(); // Pas besoin d'ajouter un 'die' en dessous, le code sera automatiquement coupé.\n    \n    // Pour appeler le ficher de votre vue, procédez comme suit:\n    // Les points représentent la séparation de vos dossiers et l'extension ne doit pas être placé.\n    $this-\u003erender('app.parent.index');\n    // Après un rendu plus rien ne doit-être fait. Celui-ci doit toujours être la dernière chose à faire.\n    \n    // Si vous avez des variables à envoyer à votre vue:\n    $this-\u003erender('app.parent.index', [\n        'message' =\u003e 'Mon super message'\n    ]);\n    \n    // Le layout par défaut est l'index mais si jamais vous avec un autre layout à placer, vous pourrez toujours l'appliquer en fin de paramètre:\n    $this-\u003erender('app.parent.index', [], 'app.layout.index');\n  }\n  \n  /* Si vous avez spécifié des paramètres customisable à vos routes, pensez à les récupérer dans le bon ordre en paramètre de méthode */\n  private function child2($slug, $id): void\n  {\n    // Vous pouvez utiliser la méthode compact de php pour envoyez vos variables à votre vue.\n    $this-\u003erender('app.parent.child', compact($slug, $id), 'app.layout.index');\n  }\n}\n```\n\n---\n\n## Les layouts et les vues avec le moteur Blade\n\nLe layout est la partie qui est le plus courant de votre code HTML, Elle contiendra votre `head`, `body`, `header` et `footer`.\nIl ne faudra pas oublier d'ajouter le `@yield('content')` à l'endroit ou vous souhaitez que le rendu de votre vue se place.\n\nToutes vos vues doivent avoir l'extension `blade.php` pour fonctionner.\n\n```html\n{{-- Le layout est une page blade placé dans votre dossier de layout. (Renseigné dans votre config) --}}\n\u003c!doctype html\u003e\n\u003chtml lang=\"fr\"\u003e\n    \u003chead\u003e\n        \u003cmeta charset=\"UTF-8\"\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n        \u003cmeta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"\u003e\n        \u003ctitle\u003e@hasSection('title') @yield('title') @else MVC Example By NeutronStars @endif\u003c/title\u003e\n        \u003c!-- Vos styles à injecter --\u003e\n        @hasSection('style')\n            @yield('style')\n        @endSection\n        \n        \u003c!-- Vos script à injecter --\u003e\n        @hasSection('script')\n            @yield('script')\n        @endSection\n        \u003c!-- Vos ressources 'link, script, ... à injecter par défault si besoin' --\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003c!-- Votre menu --\u003e\n        @hasSection('header')\n            @yield('header')\n        @else\n            @include('header')\n        @endif\n        \n        \u003c!-- Coller le rendu de vos vues. --\u003e\n        @yield('content')\n        \n        @hasSection('footer')\n            @yield('footer')\n        @endif\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\nLes vues est la partie la plus dense de votre site, c'est l'affichage qui change constamment d'une route à l'autre.\nPour le cas de blade, il vous faudra aussi penser à inclure votre layout pour avoir la totalité de votre page.\n\n```html\n{{-- La vue est une page blade.php placé dans votre dossier de vue. (Renseigné dans votre config) --}}\n\n{{-- Pour inclure vos layouts, utilisez @include de blade et séparer les dossiers par des points et terminer par le nom du fichier sans mettre l'extension  --}}\n@include('app.index') {{-- {LAYOUTS}/app/index.blade.php --}}\n\n{{-- Puis pour rendre votre vue, utiliser la section content. --}}\n@addSection('content')\n\u003cmain\u003e\n    {{-- Pour utiliser les paramètres injectés à votre vue: --}}\n    \u003ch1\u003e{{ $message }}\u003c/h1\u003e\n    \n    {{-- Pour générer une de vos routes --}}\n    {{-- Il faut utiliser la directive @router et placer le nom de votre route --}}\n    \u003ca href=\"@router('parent')\"\u003eLe Parent\u003c/a\u003e\n    \n    {{-- Si vous avez besoin de récupérer une route enfant à votre parent, il suffit de mettre les noms séparer par des points. --}}\n    \u003ca href=\"@router('parent.child.subChild')\"\u003eL'enfant\u003c/a\u003e\n    \n    {{-- Si vous avez besoin de récupérer une route qui comporte des paramètres customisable: --}}\n    \u003ca href=\"@router('parent.child2', ['slug' =\u003e 'test', 'id' =\u003e '101'])\"\u003eL'enfant custom\u003c/a\u003e\n\u003c/main\u003e\n@endSection\n```\n\n---\n\n## Les layouts et les vues avec le moteur par défaut\n\nLe layout est la partie qui est le plus courant de votre code HTML, Elle contiendra votre `head`, `body`, `header` et `footer`.\nIl ne faudra pas oublier d'ajouter le `echo $view;` à l'endroit ou vous souhaitez que le rendu de votre vue se place.\n\n```php\n\u003c?php //Le layout est une page php placé dans votre dossier de layout. (Renseigné dans votre config) ?\u003e\n\u003c!doctype html\u003e\n\u003chtml lang=\"fr\"\u003e\n    \u003chead\u003e\n        \u003cmeta charset=\"UTF-8\"\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n        \u003cmeta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"\u003e\n        \u003ctitle\u003eMon super framework MVC\u003c/title\u003e\n        \u003c!-- Vos ressources 'link, script, ...' --\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003cheader\u003e\n            \u003c!-- Votre menu --\u003e\n        \u003c/header\u003e\n        \u003c!-- Coller le rendu de vos vues. --\u003e\n        \u003c?= $view ?\u003e\n        \u003cfooter\u003e\n            \u0026copy; 2021 - Framework MVC, NeutronStars \u0026 Co\n        \u003c/footer\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\nLes vues est la partie la plus dense de votre site, c'est l'affichage qui change constamment d'une route à l'autre.\n\n```php\n\u003c?php //La vue est une page php placé dans votre dossier de vue. (Renseigné dans votre config) ?\u003e\n\u003cmain\u003e\n    \u003c!-- Pour utiliser les paramètres injectés à votre vue: --\u003e\n    \u003ch1\u003e\u003c?=$message?\u003e\u003c/h1\u003e\n    \n    \u003c!-- Pour générer une de vos routes --\u003e\n    \u003c!-- Il faut utiliser la méthode get de $router et placer le nom de votre route --\u003e\n    \u003ca href=\"\u003c?= $router-\u003eget('parent') ?\u003e\"\u003eLe Parent\u003c/a\u003e\n    \n    \u003c!-- Si vous avez besoin de récupérer une route enfant à votre parent, il suffit de mettre les noms séparer par des points. --\u003e\n    \u003ca href=\"\u003c?= $router-\u003eget('parent.child.subChild') ?\u003e\"\u003eL'enfant\u003c/a\u003e\n    \n    \u003c!-- Si vous avez besoin de récupérer une route qui comporte des paramètres customisable: --\u003e\n    \u003ca href=\"\u003c?= $router-\u003eget('parent.child2', ['slug' =\u003e 'test', 'id' =\u003e '101']) ?\u003e\"\u003eL'enfant custom\u003c/a\u003e\n    \n    \u003c!-- Si vous souhaitez ajouter un lien au cas ou l'utilisateur ce trouve sur la même route --\u003e\n    \u003ca href=\u003c?= $router-\u003eget('parent') ?\u003e class=\"\u003c?= $router-\u003eisRoute('parent')?\u003e\"\u003eVous êtes sur la page ?\u003c/a\u003e\n    \n    \u003c!-- Si vous souhaitez ajouter un lien au cas ou l'utilisateur ce trouve sur la même route ou une route enfant à celle indiqué --\u003e\n    \u003c!-- Le booléan permet de savoir s'il la route doit strictement être correct non: Par défault il est à true --\u003e\n    \u003ca href=\u003c?= $router-\u003eget('parent.child') ?\u003e class=\"\u003c?= $router-\u003eisRoute('parent', false)?\u003e\"\u003eVous êtes sur la page Parent ou Enfant ?\u003c/a\u003e\n\u003c/main\u003e\n```\n\n---\n\n## Les models\n\nLes models vous permettent de gérer vos requêtes SQL en dehors de vos controllers.\n\n```php\nnamespace App\\Model;\nuse NeutronStars\\Model\\Model;\n\nclass UserModel extends Model\n{\n  public function __construct()\n  {\n    // Spécifier le nom de la table SQL que gérera ce model\n    parent::__construct('users');\n  }\n  \n  // Ajouter des requêtes à votre model\n  public function insert($email, $password): void\n  {\n    $this-\u003ecreateQuery()\n         -\u003einsertInto('email,password', '?,?')\n         -\u003esetParameters([$email, $password])\n         -\u003eexecute();\n  }\n  \n  public function userByEmail($email): ?Object\n  {\n    return $this-\u003ecreateQuery()\n                -\u003eselect('*')-\u003ewhere('email=?')\n                -\u003esetParameters([$email])\n                -\u003egetResult();\n  }\n}\n```\n\nPour utiliser votre model dans vos controller, vous devez simplement l'initialiser\n\n```php\nnamespace App\\Controller;\nuse NeutronStars\\Controller\\Controller;\nuse App\\Model\\UserModel;\n\nclass UserController extends Controller\n{\n  private UserModel $userModel;\n  \n  public function __construct() {\n    $this-\u003euserModel = new UserModel();\n  }\n  \n  public function index(){\n    // Pour récupérer tous les utilisateurs enregistrés dans la base de donnée\n    $users = $this-\u003euserModel-\u003eall();\n  }\n  \n  public function user($id){\n    // Pour récupérer tous un utilisateur enregistré dans la base de donnée\n    $user = $this-\u003euserModel-\u003efindById($id);\n  }\n}\n```\n\n---\n\n## Les envoies d'email\n\nLes envoies d'email sont assez important pour échanger avec client en dehors du site. Il est donc important de savoir envoyer des mails.\nPour cela pensez à bien configurer la section email de votre config.\n\n```php\nnamespace App\\Controller;\nuse NeutronStars\\Controller\\Controller;use NeutronStars\\View\\ViewEngine;\n\nclass DefaultController extends Controller\n{\n  public function sendMail() {\n    //Pour envoyer un mail, utiliser la méthode createEmail du controller.\n    $this-\u003ecreateEmail()\n        // Ajouter tous vos destinataires en concaténant la méthode add les uns à la suites des autres.\n        -\u003eadd('email de votre destinataire 1', 'Le nom de votre destinataire 1')\n        -\u003eadd('email de votre destinataire 2', 'Le nom de votre destinataire 2')\n        //Puis envoyer votre email.\n        /*\n         * 1 = Le sujet du mail.\n         * 2 = Le contenu du mail. (Ou le chemin de la vue comme pour le render si vous utiliser un moteur de rendu.)\n         * \n         * //A partir d'ici les arguments ne sont pas obligatoires.\n         * 3 = Les paramètre à donner à la vue si vous utilisez un moteur de rendu.\n         * 4 = Le layout pour le mode de rendu, sinon laissez à null. (Seulement le moteur de rendu par défaut)\n         * isHTML = Si le contenu est un rendu HTML. Si oui alors il vous faudra utiliser les vues. Par default c'est à true.\n         * viewEngine = Le moteur de rendu à utiliser. (Par défaut ça prend celui indiqué dans la configuration.)\n         */\n        -\u003esend('1', '2', [3], '4', $isHTML, $viewEngine)\n        //Exemples:\n        -\u003esend('Mon Sujet', 'mail.index', ['name' =\u003e 'John Doe'])\n        -\u003esend('Mon Sujet', 'mail.index', ['name' =\u003e 'John Doe'], null, true, ViewEngine::BLADE)\n        -\u003esend('Mon Sujet', 'mail.index', ['name' =\u003e 'John Doe'], null, true, ViewEngine::DEFAULT)\n        -\u003esend('Mon Sujet', 'mail.index', ['name' =\u003e 'John Doe'], 'mail.layout.index', true, ViewEngine::DEFAULT)\n        -\u003esend('Mon Sujet', 'Bonjour Mr John Doe !', [], null, false);\n  }\n}\n```\n\n---\n\n## La session d'authentification\n\nPour créer un espace d'authentification. Il vous faudra créer deux class essentiels.\n\nLa première est l'entité `Utilisateur` où sera stocké les données de votre utilisateur connecté.\n\n```php\nuse NeutronStars\\Entity\\UserInterface;\nuse NeutronStars\\Service\\Role;\nuse DateTime;\n\nclass User extends UserInterface\n{\n    // Variables d'exemple. Il sera bien sur préférable d'utiliser des GETTERS \u0026 SETTERS\n    public int $id;\n    public string $email;\n    public string $name;\n    public DateTime $createdAt;\n    \n    // Cette méthode est important car elle indique les roles que possède vos utilisateur.\n    // Sachez que par défaut un utilisateur non authentifié aura le role 'ANONYMOUS'.\n    // Pensez a bien donner au minimum le role 'USER' à tous vos utilisateurs.\n    // Deux autres roles sont également présent mais ne sont pour l'instant pas utilisé par le framework:\n    // MODERATOR \u0026 ADMIN. Vous pouvez bien sur les utiliser pour controller vos accès de vos routes.\n    public function getRoles() : array\n    {\n      return [ Role::USER ];\n    }\n}\n```\n\nLa seconde class est la class qui permet de charger l'utilisateur depuis votre base de donnée.\n\n```php\nuse App\\Model\\UserModel;\nuse DateTime;\nuse NeutronStars\\Entity\\UserInterface;\nuse NeutronStars\\Service\\AuthenticationInterface;\n\nclass Authentification implements AuthenticationInterface\n{\n    // Cette méthode permet de retourner si oui ou non l'utilisateur dois rester authentifier.\n    // Si elle retourne false alors les données charger de l'utilisateur seront perdus et il sera considéré comme Anonymous.\n    public function loadUser(UserInterface $user, $id): bool\n    {\n        $u = (new UserModel())-\u003efindById($id);\n        if ($u === null) {\n            return false;\n        }\n        $user-\u003eid = $u-\u003eid;\n        $user-\u003ename = $u-\u003ename;\n        $user-\u003eemail = $u-\u003eemail;\n        $user-\u003ecreatedAt = new DateTime($u-\u003ecreated_at);\n        return true;\n    }\n}\n```\n\nDans vos vues, il vous sera possible de savoir si l'utilisateur est connecté et ses informations:\n\n### Avec Blade:\n\n```html\n@isConnected()\n    \u003cdiv\u003e\n        Bonjour {{ $user-\u003ename }}, vous êtes bien connecté !\n    \u003c/div\u003e\n@else\n    \u003cdiv\u003e\n        Vous n'êtes pas connecté !\n    \u003c/div\u003e\n@endIf\n\n{{-- Ou bien --}}\n@isNotConnected()\n    \u003cdiv\u003e\n        Vous n'êtes pas connecté !\n    \u003c/div\u003e\n@else\n    \u003cdiv\u003e\n        Bonjour {{ $user-\u003ename }}, vous êtes bien connecté !\n    \u003c/div\u003e\n@endIf\n```\n\n### Avec PHP (Rendu par défaut)\n\n```php\n\u003c?php if($user-\u003eisConnected()): ?\u003e\n    \u003cdiv\u003e\n        Bonjour \u003c?= $user-\u003ename ?\u003e, vous êtes bien connecté !\n    \u003c/div\u003e\n\u003c?php else: ?\u003e\n    \u003cdiv\u003e\n        Vous n'êtes pas connecté !\n    \u003c/div\u003e\n\u003c?php endif; ?\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneutron-pro%2Fframework-mvc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneutron-pro%2Fframework-mvc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneutron-pro%2Fframework-mvc/lists"}