<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dotclear.watch/feed/rss2/xslt" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DotclearWatch / Blog - Mot-clé - core</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/core/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Tue, 12 May 2026 05:49:52 +0200</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Ajout des versions aux stats</title>
        <link>https://dotclear.watch/Billet/Ajout-des-versions-aux-stats</link>
        <guid isPermaLink="false">urn:md5:3cc05e2daf76b90c3fc8c76ed6bf017a</guid>
        <pubDate>Sat, 30 Nov 2024 10:03:00 +0000</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Actualités</category>
                          <category>core</category>
                  <category>statistique</category>
                <description>&lt;p&gt;Comme vous le constatez, après la sortie d'une nouvelle version de Dotclear, il y a régulièrement une version de correction dans la semaine qui suit. Cela dénote, comme dit le grand chef, d'un manque de test.&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;https://dotclear.watch/public/Billets/.stats_m.webp&quot; alt=&quot;Statistiques&quot; class=&quot;media-center&quot;&gt;&lt;br&gt;
Suite au changement de serveur de DotclearWatch, les statistiques ont été perdu. Rien de grave, elles se reconstruiront toutes seules avec le temps et cela permettra même de faire le ménage dans les vieux logs pas à jour. Mais j'en ai profité pour modifier l'affichage des statistiques, désormais le &lt;a href=&quot;https://dotclear.watch/statistics#core_simple&quot; hreflang=&quot;fr&quot; title=&quot;statistique de version de Dotclear&quot;&gt;tableau des versions de Dotclear&lt;/a&gt; tient compte de l'utilisation de version &lt;strong&gt;unstable&lt;/strong&gt; ou &lt;strong&gt;testing&lt;/strong&gt; de Dotclear.&lt;br&gt;
On pourra voir ceux qui sont motivés et utilisent la release &lt;strong&gt;testing&lt;/strong&gt;.&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/Ajout-des-versions-aux-stats#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/Ajout-des-versions-aux-stats#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/61</wfw:commentRss>
              </item>
          <item>
        <title>Remplacer une classe de premier niveau</title>
        <link>https://dotclear.watch/Billet/Remplacer-une-classe-de-premier-niveau-en-2.28</link>
        <guid isPermaLink="false">urn:md5:b4b07c44e57f9060b7c9e721709fea02</guid>
        <pubDate>Fri, 13 Oct 2023 08:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Articles</category>
                          <category>2.28</category>
                  <category>container</category>
                  <category>core</category>
                  <category>factory</category>
                <description>&lt;p&gt;Dans cet article nous allons voir de façon très succincte comment remplacer une des classes du cœur de Dotclear en utilisant un conteneur de services.&lt;/p&gt; &lt;p&gt;Autant le dire tout de suite, ça ne va pas servir à tout le monde, et uniquement pour des cas bien précis, par des utilisateurs connaissant cette façon de coder.&lt;/p&gt;

&lt;h5&gt;Définition&lt;/h5&gt;


&lt;blockquote&gt;&lt;p&gt;- Mais c'est quoi un conteneur, un service, une usine ?&lt;br /&gt;
- C'est un &lt;a href=&quot;https://fr.wikipedia.org/wiki/Patron_de_conception&quot; hreflang=&quot;fr&quot; title=&quot;Définition de Design Partern su rWikipedia&quot;&gt;patron de conception&lt;/a&gt; aka design pattern.&lt;br /&gt;
- Mais encore ?&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Profitant du passage aux espaces de nom PHP, le cœur de Dotclear, appelé &lt;strong&gt;core&lt;/strong&gt; ou &lt;strong&gt;dcCore&lt;/strong&gt;, a disparu au profit d'un conteneur qui s'occupe uniquement de fournir &lt;a href=&quot;https://dotclear.watch/Billet/Le-conteneur-principal&quot;&gt;les classes maitresses&lt;/a&gt; de Dotclear, ces classes sont définies et leur objets générés par le conteneur, appelé &lt;strong&gt;Core&lt;/strong&gt;. (Original comme nom !) Tout ce petit monde suivant des règles bien précises écrites dans des interfaces.&lt;br /&gt;
Pour faire simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un service est un ensemble de méthodes dédiées à une tâche, par exemple la gestion des behaviors, regroupées dans une classe&lt;/li&gt;
&lt;li&gt;Le conteneur &lt;strong&gt;Container&lt;/strong&gt; fournit à l'utilisateur les objets prêt à l'emploi, ici App:: avec App::unService()&lt;/li&gt;
&lt;li&gt;L'usine &lt;strong&gt;Factory&lt;/strong&gt; fournit ces classes, sans que l'utilisateur sache lesquelles sont réellement chargées.&lt;/li&gt;
&lt;li&gt;Les interfaces &lt;strong&gt;xxxInterface&lt;/strong&gt; définissent les règles que doivent suivre les classes de l'usine. exemple: BehaviorInterface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette technique va permettre de remplacer toutes les classes accessibles depuis App::xxx()&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Déclaration&lt;/h5&gt;

&lt;p&gt;Il faut commencer par déclarer notre service, une classe dédiée &lt;code&gt;\Dotclear\Helper\Container\Factories&lt;/code&gt; est là pour ça, on va lui dire d'ajouter notre service. Le plus simple est de lui dire depuis le fichier &lt;code&gt;inc/config.php&lt;/code&gt; de l'installation, dans l'exemple qui suit, on veut simplement remplacer une seule méthode de la classe &lt;strong&gt;Error&lt;/strong&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
//... contenu du fichier inc/config.php

// Notre service n&amp;#039;utilise pas d&amp;#039;espace de nom, on le récupère directement
require_once __DIR__ . &amp;#039;/../MyError.php&amp;#039;;

// On dit à la maison mère que notre service va être utilisé dans le core de Dotclear pour le service ErrorInterface::class
\Dotclear\Helper\Container\Factories::addService(&amp;#039;core&amp;#039;, ErrorInterface::class, MyError::class);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Voilà notre service remplace celui de Dotclear.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Service&lt;/h5&gt;

&lt;p&gt;Passons à notre service. Il doit obligatoirement suivre des règles strictes pour pouvoir être utilisé à la place d'un autre, voici le contenu de notre fichier &lt;code&gt;MyError.php&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
// On va reprendre la classe d&amp;#039;erreur et ses méthodes
use Dotclear\Core\Error;
// Pas besoin d&amp;#039;implémenter l&amp;#039;interface qui l&amp;#039;est déjà par la classe Error
//use Dotclear\Interface\Core\ErrorInterface;

// on crée notre classe d&amp;#039;erreur qui va étendre celle par défaut.
class MyError extends Error
{
    // on remplace uniquement la méthode qui nous intéresse
    public function add(string $msg): void
    {
        // notre classe va arrêter net le script sur une erreur au lieu de renvoyer un bandeau par exemple
        exit($msg);
    }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cet exemple est simple, il permet de montrer la mécanique d'utilisation de &lt;code&gt;Factories&lt;/code&gt;, si vous souhaitez remplacer la gestion de connexion à la base de données cela va être bien plus compliqué !&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Liste des classes maîtresses&lt;/h5&gt;

&lt;p&gt;Voici la liste des appels depuis l'application et des interfaces associées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;App::auth(): &lt;code&gt;\Dotclear\Interface\Core\AuthInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::behavior(): &lt;code&gt;\Dotclear\Interface\Core\BehaviorInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::blog(): &lt;code&gt;\Dotclear\Interface\Core\BlogInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::blogSettings(): &lt;code&gt;\Dotclear\Interface\Core\BlogSettingsInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::blogs(): &lt;code&gt;\Dotclear\Interface\Core\BlogsInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::blogWorkspace(): &lt;code&gt;\Dotclear\Interface\Core\BlogWorkspaceInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::categories(): &lt;code&gt;\Dotclear\Interface\Core\CategoriesInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::cache(): &lt;code&gt;\Dotclear\Interface\Core\CacheInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::con(): &lt;code&gt;\Dotclear\Interface\Core\ConnectionInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::error(): &lt;code&gt;\Dotclear\Interface\Core\ErrorInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::filter(): &lt;code&gt;\Dotclear\Interface\Core\FilterInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::formater(): &lt;code&gt;\Dotclear\Interface\Core\FormaterInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::lang(): &lt;code&gt;\Dotclear\Interface\Core\LangInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::log(): &lt;code&gt;\Dotclear\Interface\Core\LogInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::media(): &lt;code&gt;\Dotclear\Interface\Core\MediaInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::meta(): &lt;code&gt;\Dotclear\Interface\Core\MetaInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::nonce(): &lt;code&gt;\Dotclear\Interface\Core\NonceInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::notice(): &lt;code&gt;\Dotclear\Interface\Core\NoticeInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::plugins(): &lt;code&gt;\Dotclear\Interface\Module\ModulesInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::postMedia(): &lt;code&gt;\Dotclear\Interface\Core\PostMediaInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::postTypes(): &lt;code&gt;\Dotclear\Interface\Core\PostTypesInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::rest(): &lt;code&gt;\Dotclear\Interface\Core\RestInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::session(): &lt;code&gt;\Dotclear\Interface\Core\SessionInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::themes(): &lt;code&gt;\Dotclear\Interface\Module\ModulesInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::trackback(): &lt;code&gt;\Dotclear\Interface\Core\TrackbackInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::url(): &lt;code&gt;\Dotclear\Interface\Core\UrlInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::users(): &lt;code&gt;\Dotclear\Interface\Core\UsersInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::userPreferences(): &lt;code&gt;\Dotclear\Interface\Core\UserPreferencesInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::userWorkspace(): &lt;code&gt;\Dotclear\Interface\Core\UserWorkspaceInterface&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;App::version(): &lt;code&gt;\Dotclear\Interface\Core\VersionInterface&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le nom de l'interface sera le nom du service dans l'usine.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.28 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/Remplacer-une-classe-de-premier-niveau-en-2.28#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/Remplacer-une-classe-de-premier-niveau-en-2.28#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/33</wfw:commentRss>
              </item>
      </channel>
</rss>
