<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://chierchia.fr/wp-content/plugins/pretty-rss-feeds/xslt/pretty-feed.xsl" type="text/xsl" media="screen" ?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>programmation objet - Ange Chierchia</title>
	<atom:link href="https://chierchia.fr/tag/programmation-objet/feed/" rel="self" type="application/rss+xml" />
	<link>https://chierchia.fr/tag/programmation-objet/</link>
	<description>Développeur Web full-stack</description>
	<lastBuildDate>Sun, 13 Oct 2024 10:59:28 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://chierchia.fr/wp-content/uploads/cropped-16350293-SSDKVqo3-32x32.jpg</url>
	<title>programmation objet - Ange Chierchia</title>
	<link>https://chierchia.fr/tag/programmation-objet/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
					<title>Créer son framework PHP Objet</title>
					<link>https://chierchia.fr/2016/01/creer-son-framework-php-objet/</link>
					<comments>https://chierchia.fr/2016/01/creer-son-framework-php-objet/#respond</comments>
		
		<dc:creator><![CDATA[<span class='p-author h-card'>Ange Chierchia</span>]]></dc:creator>
		<pubDate>Mon, 11 Jan 2016 07:40:21 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[back-end]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmation objet]]></category>
		<guid isPermaLink="false">https://nighcrawl.com/blog/2016/01/creer-son-framework-php-objet</guid>

					<description><![CDATA[Pour faire suite à un article que j’avais écrit il y a un peu plus de quatre ans maintenant sur la création d’un framework PHP, je vous propose de créer un framework PHP Objet en utilisant les principes MVC. Lorsque je travaillais encore chez CBC Informatique, nous n’utilisions pas les principes de la programmation orientée [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class='e-content'>Pour faire suite à un article que j’avais écrit il y a un peu plus de quatre ans maintenant sur la <a href="http://chierchia.fr/blog/creer-son-framework-php/">création d’un framework PHP</a>, je vous propose de créer un framework PHP Objet en utilisant les principes MVC.<span id="more-1344"></span></p>
<p>Lorsque je travaillais encore chez CBC Informatique, nous n’utilisions pas les principes de la programmation orientée Objet et nous préférions développer nous même les sites Web de nos clients plutôt que de s’appuyer sur des solutions toutes faites, afin de garder la maitrise de notre code. C’est dans cette optique que j’avais développé <a href="https://github.com/nighcrawl/custom-cms" target="_blank" rel="noopener">notre mini-framework/CMS</a>.</p>
<p>Depuis presque 1 an maintenant,  je travaille chez Ibakus Europe et à nouvelle équipe nouvelle façon de travailler. Pour concevoir les nouvelles applications Web IBAKUS, nous utilisons la programmation orientée Objet et les principes du MVC. Nos applications gérant des données plutôt sensibles, il a été décidé de développer notre propre framework PHP Objet, afin de garder au maximum la main sur le code et pouvoir le modifier plus facilement.</p>
<h2 id="les-bases-du-framework-php-objet">Les bases du framework PHP Objet</h2>
<p>D’abord, nous avons écrit une classe maîtresse que l’on a appelée <em>Container</em>. Elle nous permet entre autre d’initialiser le framework avec un fichier de configuration, de définir les différentes routes et de charger les différents Modèles et Contrôleurs.</p>
<p>Une <strong>classe abstraite</strong> <em>Model</em> définit les méthodes utilisées pour agir sur la base de données puis chacun de nos modèles étendent cette classe afin de gérer les spécificités qui leur sont propres.</p>
<p>Mon but n’étant pas de publier le code source de notre framework, je m’intéresserai uniquement aux méthodes CRUD de notre classe abstraite <em>Model</em>.</p>
<h2 id="structure-de-la-classe-abstraite-model">Structure de la classe abstraite <em>Model</em></h2>
<p>La classe abstraite <em>Model</em> est définie par deux propriétés <code class="language-plaintext highlighter-rouge">$db</code> et <code class="language-plaintext highlighter-rouge">$table</code> et cinq méthodes : <code class="language-plaintext highlighter-rouge">get()</code>, <code class="language-plaintext highlighter-rouge">getDatas()</code>, <code class="language-plaintext highlighter-rouge">set()</code>, <code class="language-plaintext highlighter-rouge">delete()</code> et <code class="language-plaintext highlighter-rouge">save()</code>.</p>
<p>La propriété <code class="language-plaintext highlighter-rouge">$db</code> est une instance de la classe PDO établissant la connexion à notre base de données, <code class="language-plaintext highlighter-rouge">$table</code> quand à elle contient le nom de la table sur laquelle les opérations des méthodes <code class="language-plaintext highlighter-rouge">save()</code> et <code class="language-plaintext highlighter-rouge">delete()</code> vont être faites. Voici la structure de notre classe :</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>abstract class Model {
  protected $db;
  protected $table;
  
  public function __construct() {
    $this -&gt; db = Container::getDb();
    $this -&gt; table = $this; 
  }
  
  /**
   * Un echo de $this retournera le nom de la table associée au modèle.
   * Par exemple 'pages' pour le modèle 'PagesModel'
   */
  public function __toString() {
    return strtolower(substr(get_class($this), 0, -5));
  }
  
  // GETTERS
  public function get($attr) {
    return $this -&gt; $attr;
  }
  
  /**
   * Retourne tous les attributs de l'objet
   */
  public function getDatas() {
    $datas = array();
    foreach (get_object_vars($this) as $key =&gt; $value)
        $datas[$key] = $value;
    
    return $datas;
  }
  
  // SETTER
  public function set($attr, $data) {
    if (property_exists($this, $attr)
        $this -&gt; $attr = $data;
  }
  
  // METHODES
  public function delete() {}
  
  public function save() {}
}
</code></pre>
</div>
</div>
<h3 id="la-méthode-save">La méthode <code class="language-plaintext highlighter-rouge">save()</code></h3>
<p>cette méthode permet d’enregistrer l’objet dans la base de données, que ce soit pour son insertion ou lors de sa modification. Pour définir si l’on va faire un <code class="language-plaintext highlighter-rouge">INSERT</code> ou un <code class="language-plaintext highlighter-rouge">UPDATE</code>, on testera la valeur de l’attribut <code class="language-plaintext highlighter-rouge">id</code> de l’objet courant. Si elle n’est pas nulle on souhaite modifier l’objet, sinon on crée une nouvelle entrée dans la base.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>public function save($type = null) {
  if ($this -&gt; get('id') == null) {
    $query = 'INSERT INTO ' . $this -&gt; get('table') . ' SET';
    $nbDatas = count($this -&gt; getDatas());

    $i = 0;
    foreach ($this -&gt; getDatas() as $key =&gt; $value) {
      $i++;
      $query .= ' ' . $key . ' = :' . $key;
      if ($i &lt; $nbDatas) $query .= ','; else $query .= ';'; } } else { $query = 'UPDATE ' . $this -&gt; get('table') . ' SET';
    $nbDatas = count($this -&gt; getDatas());

    $i = 0;
    foreach ($this -&gt; getDatas() as $key =&gt; $value) {
      $i++;
      if ($key != 'id') {
        $query .= ' ' . $key . ' = :' . $key;
        if ($i &lt; $nbDatas) $query .= ','; } } $query .= ' WHERE id = :id;'; } $query = $this -&gt; get('db') -&gt; prepare($query);

  foreach ($this -&gt; getDatas() as $key =&gt; $value)
    $query -&gt; bindValue(':' . $key, $value);

  $executed = $query -&gt; execute();

  if ($executed &amp;&amp; $this -&gt; get('id') == null)
    $this -&gt; set('id', $this -&gt; get('db') -&gt; lastInsertId());

  return $executed;
}
</code></pre>
</div>
</div>
<h3 id="la-méthode-delete">La méthode <code class="language-plaintext highlighter-rouge">delete()</code></h3>
<p>Pour supprimer les données de l’objet enregistré, rien de vraiment compliqué, on execute simplement une requête préparée avec la classe PDO et on supprime l’enregistrement dont <code class="language-plaintext highlighter-rouge">id</code> correspond à l’attribut <code class="language-plaintext highlighter-rouge">id</code> de l’objet courant.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>public function delete() {
  $query = $this -&gt; get('db') -&gt; prepare('DELETE FROM ' . $this -&gt; get('table') . ' WHERE id = :id;');
  $query -&gt; bindValue(':id', $this -&gt; get('id'));
  
  return $query -&gt; execute();
}
</code></pre>
</div>
</div>
<h2 id="pour-finir--construire-un-cms">Pour finir : construire un CMS</h2>
<p>Construire un CMS sur base d’une classe abstraite comme celle-ci permet d’écrire très simplement les différents modules dont on aura besoin.</p>
<p>Si l’on souhaite gérer des pages de contenu, il suffira d’écrire un modèle héritant de la classe <em>Model</em>, par exemple <em>pagesModel</em> et d’y définir les attributs de l’objet en regard de la structure de la table <em>pages</em> de la base de données.</p>
<p>Cette classe héritant de la classe abstraite, nous n’auront pas besoin de réécrire nos méthodes <code class="language-plaintext highlighter-rouge">save()</code> et <code class="language-plaintext highlighter-rouge">delete()</code> et l’on pourra se concentrer sur des méthodes permettant par exemple, de retourner un menu de navigation, des méta-tags pour le référencement naturel, etc.</p>
<p>Bien sûr, il faudra écrire un contrôleur permettant de traiter les données à passer au modèle, qui se chargera ensuite de les enregistrer en base de données, mais ça se fait rapidement  .</p>
<p>Là dessus, bonne semaine (et bonne année) !</p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chierchia.fr/2016/01/creer-son-framework-php-objet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
