tag:linuxfr.org,2005:/tags/php/publicLinuxFr.org : les contenus étiquetés avec « php »2024-01-21T17:49:10+01:00/favicon.pngtag:linuxfr.org,2005:Post/440662024-01-21T12:14:54+01:002024-01-21T12:14:54+01:00Monter une clé USB depuis une page PHP<p>Bonjour tout le forum,</p>
<p>J'ai besoin de votre aide.</p>
<p>Je souhaite pouvoir monter une clé USB via une page PHP pour un utilisateur en local.</p>
<p>Voici mes fichiers<br>
- test.php<br>
- /etc/sudoers</p>
<p>/var/www/admin/test.php</p>
<pre><code class="php"><span class="o"><!</span><span class="nx">DOCTYPE</span> <span class="nx">html</span><span class="o">></span>
<span class="o"><</span><span class="nx">html</span><span class="o">></span>
<span class="o"><</span><span class="nx">head</span><span class="o">></span>
<span class="o"><</span><span class="nx">meta</span> <span class="nx">charset</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="o">/></span>
<span class="o"><</span><span class="nx">title</span><span class="o">></span><span class="nx">test</span><span class="o"></</span><span class="nx">title</span><span class="o">></span>
<span class="o"></</span><span class="nx">head</span><span class="o">></span>
<span class="o"><</span><span class="nx">body</span><span class="o">></span>
<span class="o"><?</span><span class="nx">php</span>
<span class="c1">// Chemin du point de montage</span>
<span class="nv">$mountPoint</span> <span class="o">=</span> <span class="s2">"/mnt/cle"</span><span class="p">;</span>
<span class="c1">// Chemin du périphérique USB</span>
<span class="nv">$usbDevice</span> <span class="o">=</span> <span class="s2">"/dev/sdb1"</span><span class="p">;</span>
<span class="c1">// Commande pour monter la clé USB</span>
<span class="nv">$command</span> <span class="o">=</span> <span class="s2">"sudo mount </span><span class="si">$usbDevice</span><span class="s2"> </span><span class="si">$mountPoint</span><span class="s2"> 2>&1"</span><span class="p">;</span>
<span class="c1">// Exécution de la commande et capture de la sortie</span>
<span class="nv">$output</span> <span class="o">=</span> <span class="p">[];</span>
<span class="nv">$exitCode</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nb">exec</span><span class="p">(</span><span class="nv">$command</span><span class="p">,</span> <span class="nv">$output</span><span class="p">,</span> <span class="nv">$exitCode</span><span class="p">);</span>
<span class="c1">// Vérification du code de sortie de la commande</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$exitCode</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"La clé USB a été montée avec succès."</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"Erreur lors du montage de la clé USB:"</span><span class="p">;</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$output</span> <span class="k">as</span> <span class="nv">$line</span><span class="p">)</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"<br></span><span class="si">$line</span><span class="s2">"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="cp">?></span><span class="x"></span>
<span class="x"> </body></span>
<span class="x"></html></span></code></pre>
<p>/etc/sudoers</p>
<pre><code class="shell">root <span class="nv">ALL</span><span class="o">=(</span>ALL:ALL<span class="o">)</span> ALL
www-data <span class="nv">ALL</span><span class="o">=(</span>ALL<span class="o">)</span> NOPASSWD: /bin/mount
www-data <span class="nv">ALL</span><span class="o">=(</span>ALL<span class="o">)</span> NOPASSWD: /bin/umount</code></pre>
<p>Résultat :</p>
<p>Erreur lors du montage de la clé USB:<br>
mount: /mnt/cle: /dev/sdb1 already mounted on /mnt/cle</p>
<p>Le répertoire /mnt/cle est vide.<br>
Le fichier /etc/mtab ne mentionne pas /dev/sdb1.</p>
<p>Si je lance :</p>
<pre><code class="shell"><span class="k">if</span> <span class="o">[[</span> <span class="k">$(</span>findmnt /mnt/cle<span class="k">)</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"La clé est montée"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"La clé n'est pas montée"</span>
<span class="k">fi</span></code></pre>
<p>Résultat :</p>
<p>La clé n'est pas montée.</p>
<p>Merci pour votre aide</p>
<div><a href="https://linuxfr.org/forums/programmation-php/posts/monter-une-cle-usb-depuis-une-page-php.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/134690/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-php/posts/monter-une-cle-usb-depuis-une-page-php#comments">ouvrir dans le navigateur</a>
</p>
sebhttps://linuxfr.org/nodes/134690/comments.atomtag:linuxfr.org,2005:Post/440612024-01-19T13:25:25+01:002024-01-19T13:25:25+01:00Comment avoir un serveur web + PHP en local sans droits admin’ ?<p>Salut,</p>
<p>Dans le cadre un peu particulier (<a href="//linuxfr.org/users/space_e_man/journaux/dual-oschool-free-software-pack">DOSFSP</a>) d’ordinateurs fortement sécurisés sur lesquels nous n’avons pas les droits admin’ (root) et sur lesquels tout est réinitialisé au démarrage*, je cherche malgré tout à avoir un serveur web + PHP en local pour apprendre le dev’web…</p>
<p>*: Il est possible de sauvegarder et récupérer un dossier utilisateur, avec travaux élève, etc. Le nécessaire pour serveur web+PHP pourrait en être un sous-dossier.</p>
<p>Donc, <strong>je cherche à savoir s’il est possible d’avoir une version « portable » de PHP.</strong></p>
<p>Système <strong>Debian 12 Gnome</strong>.</p>
<p>Il y aurait alors la possibilité suivante :</p>
<pre><code class="bash">php -S localhost:8000 -t http-test</code></pre>
<p>En effet, les techniciens qui ont conçu ce système ont pensé à énormément de chose et notamment installer gcc, Python etc. Mais n’ont pas installé PHP :(</p>
<p>Je sais pas si ça peut m’aider mais par contre, Python est bien présent et ceci fonctionne (mais sans PHP du coup) :</p>
<pre><code class="bash">python -m http.server</code></pre>
<p>Quelqu’un aurait-il une idée ? Merci d’avance :)</p>
<div><a href="https://linuxfr.org/forums/linux-general/posts/comment-avoir-un-serveur-web-php-en-local-sans-droits-admin.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/134666/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-general/posts/comment-avoir-un-serveur-web-php-en-local-sans-droits-admin#comments">ouvrir dans le navigateur</a>
</p>
Space_e_manhttps://linuxfr.org/nodes/134666/comments.atomtag:linuxfr.org,2005:News/418432024-01-10T10:25:14+01:002024-01-10T10:25:14+01:00Dévoilement du programme de l’édition 2024 de ConFoo à Montréal ! Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p><img src="//img.linuxfr.org/img/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726163746963616c6465762f696d6167652f66657463682f732d2d5a723775466963512d2d2f635f696d616767615f7363616c652c665f6175746f2c666c5f70726f67726573736976652c685f3432302c715f6175746f2c775f313030302f68747470733a2f2f6465762d746f2d75706c6f6164732e73332e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f777a656773646a6161386966797264657a73726e2e706e67/wzegsdjaa8ifyrdezsrn.png" alt="ConFoo" title="Source : https://res.cloudinary.com/practicaldev/image/fetch/s--Zr7uFicQ--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wzegsdjaa8ifyrdezsrn.png"></p>
<p>Voulez-vous être à l’avant-garde de l’industrie ? Réservez votre calendrier pour la 22ᵉ édition de ConFoo en février 2024 à Montréal !</p>
<p>Avec plus de <a href="https://confoo.ca/fr/2024/sessions">170 présentations</a>, offertes par des conférenciers de partout à travers le monde, ConFoo est une conférence destinée aux développeurs Full-Stack, couvrant tout, du backend au frontend : JavaScript, PHP, Java, Dotnet, Sécurité, Intelligence Artificielle, DevOps et bien plus encore.</p>
<p>ConFoo apporte une remarquable diversité de contenu pour élargir vos connaissances, augmenter votre productivité et amener vos compétences en développement au niveau supérieur.</p>
<p>Avec un choix de présentations axé sur les technologies de pointe, il y a une raison pour laquelle les participants qui reviennent de ConFoo disent avoir appris davantage en ces trois jours que pendant trois années à l’université !</p>
<p>Inscrivez-vous dès maintenant pour participer, rencontrer <a href="https://confoo.ca/fr/2024/speakers">les conférenciers</a> de renom qui contribuent aux projets Open Source que vous utilisez tous les jours.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://confoo.ca/fr/2024" hreflang="fr" href="https://linuxfr.org/redirect/113235">ConFoo Montreal 2024</a></li><li>lien nᵒ 2 : <a title="https://confoo.ca/fr/2024/schedule" hreflang="fr" href="https://linuxfr.org/redirect/113236">Programme de la conférence</a></li></ul><div></div><div><a href="https://linuxfr.org/news/devoilement-du-programme-de-l-edition-2024-de-confoo-a-montreal.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/134442/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/devoilement-du-programme-de-l-edition-2024-de-confoo-a-montreal#comments">ouvrir dans le navigateur</a>
</p>
Yann LarriveeBenoît SibaudYsabeau 🧶 🧦https://linuxfr.org/nodes/134442/comments.atomtag:linuxfr.org,2005:Bookmark/75482023-11-23T22:29:36+01:002023-11-23T22:29:36+01:00PHP 8.3 est disponible <a href="https://www.php.net/releases/8.3/en.php">https://www.php.net/releases/8.3/en.php</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133991/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/weborator/liens/php-8-3-est-disponible#comments">ouvrir dans le navigateur</a>
</p>
weboratorhttps://linuxfr.org/nodes/133991/comments.atomtag:linuxfr.org,2005:News/417592023-11-20T08:53:56+01:002023-11-20T10:50:56+01:00Sortie de passbolt 4.4.0 : gestion TOTP, suspension des utilisateursLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Un mot de passe à usage unique basé sur le temps (TOTP, <em>Time based One Time Password</em> en anglais) est un algorithme permettant de générer un mot de passe à usage unique. </p>
<p>Dans cette nouvelle version 4.4.0, les utilisateurs peuvent maintenant gérer leurs TOTP directement depuis l’extension navigateur, offrant ainsi une facilité d'accès et de gestion sur tous les appareils.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://help.passbolt.com/releases/ce/zombie" hreflang="en" href="https://linuxfr.org/redirect/112960">Notes de version</a></li><li>lien nᵒ 2 : <a title="https://www.passbolt.com/security" hreflang="en" href="https://linuxfr.org/redirect/112961">Sécurité</a></li><li>lien nᵒ 3 : <a title="https://www.passbolt.com" hreflang="en" href="https://linuxfr.org/redirect/112962">Site web</a></li><li>lien nᵒ 4 : <a title="https://github.com/passbolt/" hreflang="en" href="https://linuxfr.org/redirect/112977">Code source</a></li></ul><div><h2 id="toc-nouvelles-fonctionnalités">Nouvelles fonctionnalités</h2>
<h3 id="toc-gestion-des-totp">Gestion des TOTP</h3>
<p>Il est maintenant possible de créer et modifier des TOTP facilement depuis l’interface principale, rendant l’expérience utilisateur multi-appareils puisque la fonctionnalité était déjà disponible sur l’application mobile. Comme les autres types d’identifiants gérés par passbolt, il est également possible de partager les TOTP avec d’autres utilisateurs. Les TOTP peuvent aussi être associés à un identifiant existant.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f6578706f72743d646f776e6c6f61642669643d31686c4c6b4e513458586b61307176453263564252566c30726a4754646f4d4f5f/uc?export=download&id=1hlLkNQ4XXka0qvE2cVBRVl0rjGTdoMO_" alt="Impression d'écran du fonctionnement de TOTP sur Passbolt et son application mobile" title="Source : https://drive.google.com/uc?export=download&id=1hlLkNQ4XXka0qvE2cVBRVl0rjGTdoMO_"></p>
<h3 id="toc-suspension-et-activation-des-utilisateurs">Suspension et activation des utilisateurs</h3>
<p>Les administrateurs peuvent maintenant suspendre un compte utilisateur pour couper l’accès à la solution, offrant un contrôle accru sur la gestion des accès. Auparavant, il était uniquement possible de supprimer un utilisateur.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f64726976652e676f6f676c652e636f6d2f75633f6578706f72743d646f776e6c6f61642669643d314b574571325344575670533051596b6c2d48524f2d634f47743271663654466c/uc?export=download&id=1KWEq2SDWVpS0QYkl-HRO-cOGt2qf6TFl" alt="Impression d'écran de la fonctionnalité de suspension d'utilisateur sur Passbolt" title="Source : https://drive.google.com/uc?export=download&id=1KWEq2SDWVpS0QYkl-HRO-cOGt2qf6TFl"></p>
<h3 id="toc-améliorations-et-correctifs">Améliorations et correctifs</h3>
<p>Diverses améliorations ont été apportées pour renforcer la sécurité et l'expérience utilisateur, y compris des notifications par courriel regroupées pour limiter le nombre de messages lors d'importations massives de mots de passe.</p>
<p><strong>Mise à jour importante pour les administrateurs système</strong>: Utilisez PHP 8.1 ou supérieur pour une meilleure performance et compatibilité avec la dernière version de l'API passbolt.</p>
<h2 id="toc-sécurité">Sécurité</h2>
<p>De nombreux audits de sécurité ont été réalisés ces derniers mois. Les rapports d’audit sont publics et accessibles directement depuis la page <a href="https://www.passbolt.com/security">sécurité</a> de notre site web.</p>
<h2 id="toc-en-savoir-plus-sur-la-version-440">En savoir plus sur la version 4.4.0</h2>
<p>Pour en savoir plus et mettre à jour vers passbolt 4.4.0, consultez les <a href="https://help.passbolt.com/releases/ce/zombie">notes de version</a>.</p>
</div><div><a href="https://linuxfr.org/news/sortie-de-passbolt-4-4-0-gestion-totp-suspension-des-utilisateurs.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133920/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-passbolt-4-4-0-gestion-totp-suspension-des-utilisateurs#comments">ouvrir dans le navigateur</a>
</p>
kevin mullerBenoît SibaudgUIPierre JarillonXavier Teyssierhttps://linuxfr.org/nodes/133920/comments.atomtag:linuxfr.org,2005:Bookmark/74092023-10-27T13:40:37+02:002023-10-27T13:40:37+02:00People who say “PHP is insecure” are uninformed<a href="https://hakluke.com/people-who-say-php-is-insecure-are-uninformed/">https://hakluke.com/people-who-say-php-is-insecure-are-uninformed/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133747/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/mousquetaire_g2/liens/people-who-say-php-is-insecure-are-uninformed#comments">ouvrir dans le navigateur</a>
</p>
mousquetaire G2https://linuxfr.org/nodes/133747/comments.atomtag:linuxfr.org,2005:News/416822023-10-26T14:38:04+02:002023-10-26T14:38:04+02:00Paheko 1.3 : refonte de la gestion des membres, drive intégré, reçus fiscaux, etc.Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Paheko, logiciel de gestion d’association, disponible via une interface web sur n’importe quel serveur, ou sur Linux, Windows ou même Android, sort une nouvelle version majeure après plus de deux ans de travail.</p>
<p>Au menu : refonte de la gestion des membres, du site web et du porte-documents ; accès WebDAV, compatibilité avec les applications NextCloud et ownCloud ; intégration avec Collabora Online ; cartes de membres ; reçus fiscaux, et bien plus encore !</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f666f7373696c2e6b64322e6f72672f706168656b6f2f6c6f676f3f69643d3161663466313132/logo?id=1af4f112" alt="Logo Paheko" title="Source : https://fossil.kd2.org/paheko/logo?id=1af4f112"></p>
</div><ul><li>lien nᵒ 1 : <a title="https://fossil.kd2.org/paheko/" hreflang="fr" href="https://linuxfr.org/redirect/112725">Site du logiciel Paheko</a></li><li>lien nᵒ 2 : <a title="https://paheko.cloud/" hreflang="fr" href="https://linuxfr.org/redirect/112726">Site du service SaaS Paheko.cloud</a></li><li>lien nᵒ 3 : <a title="https://fossil.kd2.org/paheko/wiki?name=Changelog%2F1.3" hreflang="fr" href="https://linuxfr.org/redirect/112727">ChangeLog de la version 1.3.0</a></li><li>lien nᵒ 4 : <a title="https://paheko.cloud/aide" hreflang="fr" href="https://linuxfr.org/redirect/112728">Documentation utilisateur de Paheko</a></li><li>lien nᵒ 5 : <a title="https://paheko.cloud/nouveautes-1-3" hreflang="fr" href="https://linuxfr.org/redirect/112729">Nouveautés de la version 1.3</a></li><li>lien nᵒ 6 : <a title="https://paheko.cloud/aide" hreflang="fr" href="https://linuxfr.org/redirect/112748">Documentation utilisateur de Paheko</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<ul>
<li><a href="#toc-quest-ce-qui-a-chang%C3%A9-depuis-2012">Qu’est-ce qui a changé depuis 2012 ?</a></li>
<li><a href="#toc-quest-ce-qui-na-pas-chang%C3%A9">Qu’est-ce qui n’a pas changé ?</a></li>
<li><a href="#toc-quoi-de-neuf-dans-cette-version-13">Quoi de neuf dans cette version 1.3 ?</a></li>
<li><a href="#toc-les-modules--des-plugins-light">Les modules : des plugins « light »</a></li>
<li><a href="#toc-serveur-webdav-compatible-avec-nextcloud-et-owncloud">Serveur WebDAV, compatible avec NextCloud et ownCloud</a></li>
<li><a href="#toc-autres-nouveaut%C3%A9s">Autres nouveautés</a></li>
<li><a href="#toc-autres-sujets-de-d%C3%A9veloppement">Autres sujets de développement</a></li>
<li><a href="#toc-le-futur">Le futur</a></li>
</ul>
</li>
</ul>
<p>Que de temps passé depuis <a href="//linuxfr.org/news/garradin-gestionnaire-d-association-leger-complet-et-libre">la première dépêche LinuxFR annonçant la sortie de Garradin</a> ! En 11 ans les choses ont bien changé.</p>
<p>La petite solution adaptée aux besoins de notre atelier vélo a bien grandi, mais tout en sachant rester sobre (le package d’installation fait toujours moins de 1 Mo).</p>
<p>Pour rappel, Paheko est un logiciel de gestion d’association à but non lucratif (mais les plans comptables des syndics d’immeuble, syndicats, entreprises, etc. sont aussi disponibles), comprenant la comptabilité en partie double (mais accessible aux débutant·e·s), la gestion des membres, un site web et le partage de documents.</p>
<p>Il est développé en PHP et utilise SQLite3 comme moteur de stockage, et <a href="http://www.fossil-scm.org/index.html/doc/trunk/www/index.wiki">Fossil</a> comme forge décentralisée. Un miroir Github existe, mais il ne sera jamais porté vers d’autres moteurs de BDD, et oui SQLite c’est très bien, ça marche au poil ;-)</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f666f7373696c2e6b64322e6f72672f706168656b6f2f646f632f7472756e6b2f646f632f73656c66686f7374322e706e67/selfhost2.png" alt="Dessin auto-hébergement Paheko" title="Source : https://fossil.kd2.org/paheko/doc/trunk/doc/selfhost2.png"></p>
<h3 id="toc-quest-ce-qui-a-changé-depuis-2012">Qu’est-ce qui a changé depuis 2012 ?</h3>
<ul>
<li><a href="https://paheko.cloud/garradin-devient-paheko">Garradin a changé de nom et est devenu Paheko</a></li>
<li>Une version hors ligne, pour les associations sans accès Internet, est disponible sous Linux (paquet Debian/Ubuntu/Mint) et Windows, et peut même être installée sur un téléphone ou tablette <a href="https://fossil.kd2.org/paheko/wiki?name=Installation%2FAndroid">sous Android avec Termux</a>
</li>
<li>Des paquets communautaires Docker, Ansible et Yunohost ont été créés</li>
<li>
<a href="https://fossil.kd2.org/paheko/wiki?name=Installation">Six structures</a> proposent d’héberger votre instance Paheko pour vous</li>
<li>5000 associations sont hébergées sur Paheko.cloud, et plusieurs milliers d’autres sont auto-hébergées</li>
<li>une documentation utilisateur complète a été écrite (merci Isabelle !) et illustrée (merci Pauline !), les illustrations seront dispo en SVG et sous licence libre un peu plus tard</li>
</ul>
<h3 id="toc-quest-ce-qui-na-pas-changé">Qu’est-ce qui n’a pas changé ?</h3>
<ul>
<li>L’interface a évolué mais garde les mêmes lignes directrices pour ne pas avoir à réapprendre les automatismes</li>
<li>On utilise toujours PHP, SQLite et Fossil, avec grand plaisir :)</li>
</ul>
<h3 id="toc-quoi-de-neuf-dans-cette-version-13">Quoi de neuf dans cette version 1.3 ?</h3>
<p>Cette version intègre certains changements importants :</p>
<ul>
<li>refonte du code de la gestion des membres ;</li>
<li>refonte de l’interface de la gestion du site web ;</li>
<li>refonte de l’interface de la gestion des documents ;</li>
<li>intégration d’un serveur WebDAV, compatible avec les applis NextCloud et ownCloud ;</li>
<li>intégration des modules.</li>
</ul>
<h3 id="toc-les-modules--des-plugins-light">Les modules : des plugins « light »</h3>
<p>Les modules sont une grosse nouveauté de cette version. Ils utilisent un langage de programmation maison, inspiré de Twig, Smarty, SPIP et consorts : <a href="https://paheko.cloud/modules-brindille">Brindille</a>. Ce langage léger s’intègre au code HTML pour réaliser des requêtes SQL, gérer des formulaires, stocker et restituer des données, transformer des variables, etc.</p>
<p>Un petit exemple de code sera plus parlant :</p>
<pre><code>{{if $_POST.save}}
{{:save info=$_POST.information}}
{{/if}}
{{#load id=$_GET.id}}
{{$info|markdown}}
{{else}}
L’information n’a pas été trouvée.
{{/if}}
</code></pre>
<p>Brindille permet de créer relativement facilement des petites extensions, appelées modules, qui n’ont pas accès en écriture à la base de données, et ne présentent pas de risque de sécurité pour le serveur, les fonctionnalités étant limitées. Ces modules s’intègrent à l’interface de gestion de l’association avec seulement quelques lignes de code. Les modules peuvent également s’intégrer à certains endroits de l’interface via des « snippets ».</p>
<p>Le site web lui-même est maintenant un module, et donc peut intégrer les fonctionnalités d’autres modules.</p>
<ul>
<li><a href="https://paheko.cloud/modules">Guide des développeureuses de modules</a></li>
</ul>
<p>Plusieurs modules sont fournis, packagés avec Paheko :</p>
<ul>
<li>le thème du site web est lui-même un module,
- reçus fiscaux,</li>
<li>modèles d’écritures,
- reçus simples et de don (non fiscal),</li>
<li>bordereau de remise de chèque,</li>
<li>horaires d’ouverture de l’association,</li>
<li>réservation de créneau ou d’événement,</li>
<li>cartes de membre.</li>
</ul>
<p>Les plugins sont aussi maintenant packagés avec Paheko, permettant de ne pas avoir à gérer la mise à jour séparée des plugins et du code de Paheko.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d61737465722e706168656b6f2e636c6f75642f6e6f75766561757465732d312d332f43617274652532306d656d6272652e706e673f683d34643262383866396166/Carte%20membre.png?h=4d2b88f9af" alt="Module carte de membre" title="Source : https://master.paheko.cloud/nouveautes-1-3/Carte%20membre.png?h=4d2b88f9af"></p>
<h3 id="toc-serveur-webdav-compatible-avec-nextcloud-et-owncloud">Serveur WebDAV, compatible avec NextCloud et ownCloud</h3>
<p>Pour permettre une meilleure interopérabilité de Paheko et pouvoir accéder aux fichiers stockés en dehors de Paheko, notamment pour synchroniser un poste informatique, il fallait un protocole de transfert de fichiers. WebDAV est un standard de qualité, bien implémenté par de multiples clients (mais aussi mal par de nombreux autres), bien documenté, et assez facile à implémenter.</p>
<p>Au cours de l’implémentation, je me suis rendu compte qu’il n’existait pas réellement de client WebDAV libre pour Android ou iOS. Comme NextCloud et ownCloud se basent sur WebDAV je me suis dit qu’on pourrait sûrement utiliser leurs applications. Bon, sauf qu’ils ont tout fait pour que ça ne marche pas avec un serveur WebDAV standard malheureusement, il faut donc implémenter une couche de compatibilité.</p>
<p>Ce travail a fait l’objet d’une implémentation dans une bibliothèque externe, qui a aussi donné lieu au projet <a href="//linuxfr.org/news/karadav-un-serveur-webdav-leger-compatible-avec-les-applications-owncloud-et-nextcloud">KaraDAV</a> qui permet de créer un partage de fichiers minimaliste compatible avec les applis Nextcloud et ownCloud.</p>
<h3 id="toc-autres-nouveautés">Autres nouveautés</h3>
<p>Les nouveautés de cette version étant nombreuses, ne pas hésiter à consulter <a href="https://paheko.cloud/nouveautes-1-3">l’annonce illustrée de cette version</a> ou le <a href="https://fossil.kd2.org/paheko/wiki?name=Changelog/1.3">Changelog complet</a>.</p>
<h3 id="toc-autres-sujets-de-développement">Autres sujets de développement</h3>
<p>Paheko n’utilise que les bibliothèques C disponibles dans PHP, aucune dépendance externe ou framework.</p>
<p>Pour chaque besoin, je trouve cela plus intéressant d’aller au fond du sujet plutôt que de prendre du code tout fait, que je ne maîtriserais pas.</p>
<p>Au cours des dernières années j’ai ainsi développé pour les besoins des Paheko :</p>
<ul>
<li>un parseur CSS, inspiré du code du moteur <a href="https://awesomekling.github.io/Ladybird-a-new-cross-platform-browser-project/">LibWeb, le code derrière le navigateur Ladybug</a>, issu de SerenityOS ;</li>
<li>un générateur qui transforme un tableau HTML en document tableur ODS ou XLSX, en conservant certains styles CSS ;</li>
<li>un serveur WebDAV, comme décrit précédemment ;</li>
<li>un langage de programmation, Brindille ;</li>
<li>des librairies de lecture / écriture de fichier ZIP.</li>
</ul>
<p>C’est particulièrement satisfaisant d’apprendre à aller au fond d’un sujet technique et pouvoir le mettre en pratique. Ce n’est certes pas rentable, mais le sujet ici n’est pas d’être rentable justement :)</p>
<h3 id="toc-le-futur">Le futur</h3>
<p>Au niveau organisationnel :</p>
<ul>
<li>transformer l’association qui s’occupe aujourd’hui de Paheko pour pérenniser le fonctionnement et le financement; </li>
<li>abandonner AWS pour l’envoi de mail sur le SaaS Paheko.cloud ;</li>
<li>candidater pour rejoindre le collectif des CHATONS; </li>
<li>faire faire des audits : UX, accessibilité, sécurité.</li>
</ul>
<p>Au niveau développement :</p>
<ul>
<li>continuer à améliorer l’expérience utilisateur,</li>
<li>ajouter un module « devis et factures » (déjà commencé),</li>
<li>ajouter un module « notes de frais »,</li>
<li>refonte de l’inscription aux activités pour répondre aux besoins divers et variés des associations (sans que ça devienne une usine à gaz),</li>
<li>intégration en direct des paiements via les prestataires de paiement (HelloAsso, Stripe, Mollie, Stancer, etc.).</li>
</ul>
<p>Voir la <a href="https://fossil.kd2.org/paheko/wiki?name=Roadmap">feuille de route</a> pour les détails.</p>
</div><div><a href="https://linuxfr.org/news/paheko-1-3-refonte-de-la-gestion-des-membres-drive-integre-recus-fiscaux-etc.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133423/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/paheko-1-3-refonte-de-la-gestion-des-membres-drive-integre-recus-fiscaux-etc#comments">ouvrir dans le navigateur</a>
</p>
BohwaZYsabeau 🧶 🧦Xavier TeyssierNÿcopalm123https://linuxfr.org/nodes/133423/comments.atomtag:linuxfr.org,2005:News/416272023-08-17T08:05:41+02:002023-08-17T08:05:41+02:00ConFoo Montreal 2024 : L'appel aux conférenciers est ouvertLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p><img src="//img.linuxfr.org/img/68747470733a2f2f636f6e666f6f2e63612f696d616765732f64657369676e2f6c6f676f2e676966/logo.gif" alt="Titre de l'image" title="Source : https://confoo.ca/images/design/logo.gif"> </p>
<p>La conférence <a href="https://confoo.ca/fr/2024">ConFoo</a> est de retour pour sa 22<sup>e</sup> édition ! Du 21 au 23 février 2024 à l’Hôtel Bonaventure de Montréal, venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les développeurs de partout en Amérique du Nord !</p>
<p>Nous sommes présentement à la recherche de conférenciers avides de partager leur expertise et leur savoir dans une multitude de domaine des hautes technologies ; PHP, Ruby, Java, DotNet, JavaScript, bases de données, intelligence artificielle et plus encore !</p>
</div><ul><li>lien nᵒ 1 : <a title="https://confoo.ca/fr/2024/call-for-papers" hreflang="fr" href="https://linuxfr.org/redirect/112565">Appel aux conférenciers</a></li><li>lien nᵒ 2 : <a title="https://confoo.ca/fr/2024" hreflang="fr" href="https://linuxfr.org/redirect/112566">ConFoo.ca</a></li></ul><div><p>Pouvant être offertes en français ou en anglais, nos présentations sont généralement dans un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers invités profitent d’un traitement privilégié ; avec notamment la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).</p>
<p>Vous avez jusqu’au <strong>22 septembre</strong> prochain pour <a href="https://confoo.ca/fr/2024/call-for-papers">soumettre votre projet de présentation</a> !</p>
<p>Si vous souhaitez simplement vous inscrire en tant que participant, profitez dès maintenant d’un rabais de <strong>400$</strong> en <a href="https://confoo.ca/fr/2024">réservant votre inscription</a> d’ici le 16 octobre prochain !</p>
</div><div><a href="https://linuxfr.org/news/confoo-montreal-2024-l-appel-aux-conferenciers-est-ouvert.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133001/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/confoo-montreal-2024-l-appel-aux-conferenciers-est-ouvert#comments">ouvrir dans le navigateur</a>
</p>
Yann LarriveeNÿcoBenoît SibaudXavier Teyssierhttps://linuxfr.org/nodes/133001/comments.atomtag:linuxfr.org,2005:Bookmark/69692023-08-12T18:10:20+02:002023-08-12T18:10:20+02:00Installer NativePHP, un outil pour faire des applications de bureau en PHP<a href="https://zonetuto.fr/php/comment-installer-nativephp-pour-faire-des-applications-de-bureau/">https://zonetuto.fr/php/comment-installer-nativephp-pour-faire-des-applications-de-bureau/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/132980/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/weborator/liens/installer-nativephp-un-outil-pour-faire-des-applications-de-bureau-en-php#comments">ouvrir dans le navigateur</a>
</p>
weboratorhttps://linuxfr.org/nodes/132980/comments.atomtag:linuxfr.org,2005:Bookmark/69122023-08-03T12:19:18+02:002023-08-03T12:19:18+02:00Un paquet pour sécuriser en masse ses instances SPIP avec AlternC<a href="https://github.com/AlternC/alternc-spip">https://github.com/AlternC/alternc-spip</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/132888/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/azerttyu/liens/un-paquet-pour-securiser-en-masse-ses-instances-spip-avec-alternc#comments">ouvrir dans le navigateur</a>
</p>
azerttyuhttps://linuxfr.org/nodes/132888/comments.atomtag:linuxfr.org,2005:News/413522023-03-06T15:09:53+01:002023-03-06T15:09:53+01:00Sortie de Laravel 10Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Laravel, l'un des frameworks PHP les plus en vogue en ce moment, est sorti en version 10 le 7 février 2023.<br>
Petit tour des nouveautés !</p>
</div><ul><li>lien nᵒ 1 : <a title="https://laravel.com/" hreflang="en" href="https://linuxfr.org/redirect/111809">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://laravel-news.com/laravel-10" hreflang="en" href="https://linuxfr.org/redirect/111810">Annonce de la sortie</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<ul>
<li>
<a href="#toc-liste-non-exhaustive-des-nouveaut%C3%A9s">Liste (non-exhaustive) des nouveautés</a><ul>
<li><a href="#toc-fin-du-support-de-php-80">Fin du support de PHP 8.0</a></li>
<li><a href="#toc-d%C3%A9clarations-natives-et-typage-fort">Déclarations natives et typage fort</a></li>
<li><a href="#toc-les-r%C3%A8gles-de-validation-invokable-deviennent-le-fonctionnement-par-d%C3%A9faut">Les règles de validation <em>Invokable</em> deviennent le fonctionnement par défaut</a></li>
<li><a href="#toc-process-layer">Process Layer</a></li>
<li><a href="#toc-d%C3%A9tecter-les-tests-les-plus-lents">Détecter les tests les plus lents</a></li>
</ul>
</li>
<li><a href="#toc-fin-du-partenariat-avec-le-laravel-certification-program">Fin du partenariat avec le "Laravel Certification Program"</a></li>
<li><a href="#toc-laravel-pennant">Laravel Pennant</a></li>
<li><a href="#toc-laravel-11">Laravel 11 ?</a></li>
</ul>
</li>
</ul>
<p>Un an après la version 9, Laravel maintient son rythme de sortie (qui était autrefois d'une nouvelle version majeure tous les six mois).<br>
Avec, toutefois, une évolution qui se veut sans (trop de) révolution : les changements sont plus discrets, et nécessitent moins d'intervention ou d'attention lors de la montée de version, <a href="https://laravel.com/docs/10.x/upgrade#main-content">comme le montre d'ailleurs la taille de la page "Upgrade Guide"</a>, qui est <a href="https://twitter.com/PovilasKorop/status/1625766366572605441">l'une des plus petites de ces dernières années.</a></p>
<h3 id="toc-liste-non-exhaustive-des-nouveautés">Liste (non-exhaustive) des nouveautés</h3>
<h4 id="toc-fin-du-support-de-php-80">Fin du support de PHP 8.0</h4>
<p>Avec cette nouvelle version vient l'abandon du support de la version 8.0 de PHP (qui est, de toute façon, dans sa phase "<em>security support</em>" <a href="https://www.php.net/supported-versions.php">depuis novembre 2022</a>). En effet, des nouveautés de PHP 8.1 et 8.2 (seules versions supportées, donc) sont utilisées par Laravel, telles que les <code>enum</code> et les propriétés de classes <em>readonly</em>.</p>
<h4 id="toc-déclarations-natives-et-typage-fort">Déclarations natives et typage fort</h4>
<p>Désormais, Laravel aura beaucoup plus recours au typage et aux déclarations natives. Finis les commentaires en PHPDoc : place aux types partout !<br>
Ainsi, <a href="https://github.com/laravel/framework/blob/9.x/src/Illuminate/Foundation/Console/stubs/cast.inbound.stub">ce fichier stub de Laravel 9</a> :</p>
<pre><code class="php"><span class="k">namespace</span> <span class="p">{{</span> <span class="k">namespace</span> <span class="p">}};</span>
<span class="k">use</span> <span class="nx">Illuminate\Database\Eloquent\Model</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes</span><span class="p">;</span>
<span class="k">class</span> <span class="err">{{ </span><span class="nc">class</span> <span class="p">}}</span> <span class="k">implements</span> <span class="nx">CastsInboundAttributes</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Prepare the given value for storage.</span>
<span class="sd"> *</span>
<span class="sd"> * @param \Illuminate\Database\Eloquent\Model $model</span>
<span class="sd"> * @param string $key</span>
<span class="sd"> * @param mixed $value</span>
<span class="sd"> * @param array $attributes</span>
<span class="sd"> * @return mixed</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">set</span><span class="p">(</span><span class="nv">$model</span><span class="p">,</span> <span class="nx">string</span> <span class="nv">$key</span><span class="p">,</span> <span class="nv">$value</span><span class="p">,</span> <span class="k">array</span> <span class="nv">$attributes</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$value</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<p><a href="https://github.com/laravel/framework/blob/be2ddb5c31b0b9ebc2738d9f37a9d4c960aa3199/src/Illuminate/Foundation/Console/stubs/cast.inbound.stub">devient désormais, en Laravel 10</a> :</p>
<pre><code class="php"><span class="k">namespace</span> <span class="p">{{</span> <span class="k">namespace</span> <span class="p">}};</span>
<span class="k">use</span> <span class="nx">Illuminate\Database\Eloquent\Model</span><span class="p">;</span>
<span class="k">use</span> <span class="nx">Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes</span><span class="p">;</span>
<span class="k">class</span> <span class="err">{{ </span><span class="nc">class</span> <span class="p">}}</span> <span class="k">implements</span> <span class="nx">CastsInboundAttributes</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Prepare the given value for storage.</span>
<span class="sd"> *</span>
<span class="sd"> * @param array<string, mixed> $attributes</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">set</span><span class="p">(</span><span class="nx">Model</span> <span class="nv">$model</span><span class="p">,</span> <span class="nx">string</span> <span class="nv">$key</span><span class="p">,</span> <span class="nx">mixed</span> <span class="nv">$value</span><span class="p">,</span> <span class="k">array</span> <span class="nv">$attributes</span><span class="p">)</span><span class="o">:</span> <span class="nx">mixed</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$value</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<p>Deux choses à noter :</p>
<ul>
<li>La documentation est certes réduite (inutile de déclarer le type d'un paramètre en commentaire ET dans la signature de la méthode), mais il reste encore les informations concernant la structure des tableaux (en attendant qu'une future version de PHP permette de déclarer cela, comme en Java ?) ;</li>
<li>L'exemple ci-dessus provient d'un fichier stub de Laravel : ce sont des fichiers "à trous" (d'où le fait que ni le <em>namespace</em> ni le nom de la classe ne soient renseignés) utilisés lorsque le développeur veut créer une nouvelle classe (modèle, contrôleur, job, …) au sein de son projet. Le but ici étant de ne pas limiter au framework uniquement cette nouveauté mais, au contraire, de propager cet usage du typage dans le code du développeur.</li>
</ul>
<h4 id="toc-les-règles-de-validation-invokable-deviennent-le-fonctionnement-par-défaut">Les règles de validation <em>Invokable</em> deviennent le fonctionnement par défaut</h4>
<p>Laravel fournit de base un ensemble de règles de validation (appelées <em>Rules</em>) pour vérifier que les données provenant des formulaires sont correctes. Il est néanmoins possible de créer les siennes.<br>
Jusqu'à présent, une telle rule devait être écrite ainsi :</p>
<pre><code class="php"><span class="k">namespace</span> <span class="nx">App\Rules</span><span class="p">;</span>
<span class="nx"> </span>
<span class="k">use</span> <span class="nx">Illuminate\Contracts\Validation\Rule</span><span class="p">;</span>
<span class="nx"> </span>
<span class="k">class</span> <span class="nc">Uppercase</span> <span class="k">implements</span> <span class="nx">Rule</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Determine if the validation rule passes.</span>
<span class="sd"> *</span>
<span class="sd"> * @param string $attribute</span>
<span class="sd"> * @param mixed $value</span>
<span class="sd"> * @return bool</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">passes</span><span class="p">(</span><span class="nv">$attribute</span><span class="p">,</span> <span class="nv">$value</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">strtoupper</span><span class="p">(</span><span class="nv">$value</span><span class="p">)</span> <span class="o">===</span> <span class="nv">$value</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx"> </span>
<span class="sd">/**</span>
<span class="sd"> * Get the validation error message.</span>
<span class="sd"> *</span>
<span class="sd"> * @return string</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">message</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="s1">'The :attribute must be uppercase.'</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<p>À partir de Laravel 9, on peut la simplifier en utilisant la méthode magique <code>__invoke</code> de PHP, et donc écrire la même <em>rule</em> ainsi :</p>
<pre><code class="php"><span class="k">namespace</span> <span class="nx">App\Rules</span><span class="p">;</span>
<span class="nx"> </span>
<span class="k">use</span> <span class="nx">Illuminate\Contracts\Validation\InvokableRule</span><span class="p">;</span>
<span class="nx"> </span>
<span class="k">class</span> <span class="nc">Uppercase</span> <span class="k">implements</span> <span class="nx">InvokableRule</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Run the validation rule.</span>
<span class="sd"> *</span>
<span class="sd"> * @param string $attribute</span>
<span class="sd"> * @param mixed $value</span>
<span class="sd"> * @param \Closure $fail</span>
<span class="sd"> * @return void</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__invoke</span><span class="p">(</span><span class="nv">$attribute</span><span class="p">,</span> <span class="nv">$value</span><span class="p">,</span> <span class="nv">$fail</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">strtoupper</span><span class="p">(</span><span class="nv">$value</span><span class="p">)</span> <span class="o">!==</span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$fail</span><span class="p">(</span><span class="s1">'The :attribute must be uppercase.'</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<p>Néanmoins, pour que ce changement se fasse en douceur, il avait été décidé qu'il ne serait possible qu'en ajoutant le paramètre <code>--invokable</code> à la ligne de commande.<br>
Ainsi, pour obtenir la classe telle que dans l'exemple ci-dessus, il fallait faire : <code>php artisan make:rule Uppercase --invokable</code>.</p>
<p>Depuis Laravel 10, ce comportement est désormais celui par défaut, et le paramètre optionnel a donc disparu de la ligne de commande indiqué précédemment.</p>
<h4 id="toc-process-layer">Process Layer</h4>
<p>Déjà existant dans Symfony depuis longtemps, ce service-objet permet de lancer des processus en ligne de commande, et d’interagir avec (code d'erreur, valeur renvoyée, …). Comme souvent dans Laravel, l'usage d'une <em>fluent interface</em> y est très présent, permettant l'enchaînement d'appels de méthodes pour construire le processus voulu, avant de l'exécuter.</p>
<pre><code class="php"><span class="k">use</span> <span class="nx">Illuminate\Support\Facades\Process</span><span class="p">;</span>
<span class="nv">$result</span> <span class="o">=</span> <span class="nx">Process</span><span class="o">::</span><span class="na">run</span><span class="p">(</span><span class="s1">'ls -la'</span><span class="p">);</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">successful</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">failed</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">exitCode</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">output</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">errorOutput</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">throw</span><span class="p">();</span>
<span class="nv">$result</span><span class="o">-></span><span class="na">throwIf</span><span class="p">(</span><span class="nv">$condition</span><span class="p">);</span></code></pre>
<p>À noter que, comme <a href="https://laravel.com/docs/10.x/http-client#main-content">le client HTTP</a> déjà présent dans Laravel, qui (comme son nom l'indique) permet d'interagir avec des appels HTTP(S), ce service est prévu pour pouvoir être "mocké", afin de faciliter l'écriture des tests.</p>
<h4 id="toc-détecter-les-tests-les-plus-lents">Détecter les tests les plus lents</h4>
<p>Une nouvelle option <code>--profile</code> est apparue, pour faire ressortir les 10 tests les plus lents à l'exécution. Cela permet de détecter ceux qui auraient peut-être besoin d'être optimisés ou, parce que ça n'est pas toujours possible de les rendre plus rapides, de voir lesquels devraient être regroupés dans un lot de tests lents (qui ne seraient pas exécutés tout le temps, par exemple).</p>
<h3 id="toc-fin-du-partenariat-avec-le-laravel-certification-program">Fin du partenariat avec le "Laravel Certification Program"</h3>
<p>Depuis plusieurs années, Laravel avait un partenariat avec un organisme extérieur, le reconnaissant comme seul autorisé à délivrer officiellement une certification de Laravel. <a href="https://twitter.com/taylorotwell/status/1610661365110247425">Depuis ce début d'année</a>, ce partenariat n'existe plus, et il n'y en a pas d'autres officiels pour autant (ce qui n'interdit pas quiconque de créer une certification Laravel).</p>
<h3 id="toc-laravel-pennant">Laravel Pennant</h3>
<p>Il s'agit non pas d'une nouveauté de Laravel 10, mais d'un <em>first-class package</em> dont la sortie coïncide quasiment, et qui était très demandé et attendu par la communauté.</p>
<p><a href="https://laravel.com/docs/10.x/pennant">Laravel Pennant</a> est un package officiel dont le but est de permettre de faire du <em>feature flag</em>. Il s'agit d'une technique d'ingénierie logicielle permettant d'activer/désactiver une fonctionnalité à tout ou partie des utilisateurs d'une application. Ainsi, on peut tester en production l'accueil qu'aura une nouvelle interface graphique, ne proposer dans un premier temps une fonctionnalité qu'à des utilisateurs triés sur le volet.</p>
<h3 id="toc-laravel-11">Laravel 11 ?</h3>
<p>Bien que la prochaine version majeure de Laravel ne soit pas attendue avec début 2024, on sait déjà au moins une chose la concernant : <a href="https://github.com/laravel/framework/pull/45526">elle abandonnera le support de PHP 8.1</a> ! Seules les versions 8.2 et 8.3 (dont la sortie est prévue en novembre 2023) de PHP seront donc supportées.</p>
</div><div><a href="https://linuxfr.org/news/sortie-de-laravel-10.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129952/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-laravel-10#comments">ouvrir dans le navigateur</a>
</p>
windu.2bBenoît SibaudNÿcoXavier Teyssierbobble bubblehttps://linuxfr.org/nodes/129952/comments.atomtag:linuxfr.org,2005:News/413492023-01-12T22:34:39+01:002023-01-12T22:34:39+01:00wallabag.it a 6 ansLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Pour mémoire, wallabag est une application open source qui sauvegarde des articles et vous permet de les lire plus tard.<br>
Voici le billet traditionnel pour faire le bilan de l'année écoulée sur <a href="https://wallabag.it/fr">le service en ligne wallabag.it</a>, lancé en décembre 2016. </p>
<p>En parallèle de cette activité (en micro entrepreneur), je suis salarié à 80% en tant que développeur web. Donc wallabag.it n'est pas mon activité principale et je n'y consacre pas énormément de temps. Et je ne fais aucune publicité du service. C'est uniquement le bouche-à-oreille qui fonctionne.<br>
Pour info, j'ai démarré wallabag.it le 3 décembre 2016.</p>
<p>Dans cette diffusion de données, je ne vais pas forcément chercher à comprendre / étudier telle ou telle donnée, ou alors réfléchir comment améliorer mon chiffre d'affaires. L'idée est d'être transparent avec mes clients et donner des idées à celles et ceux qui souhaiteraient se lancer.</p>
<p>Je ne vais pas non plus refaire l'historique du changement d'offres, tout cela se trouve dans les liens liés. Toutes les données sont en seconde partie de dépêche.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://www.wallabag.it/fr" hreflang="fr" href="https://linuxfr.org/redirect/111568">wallabag.it (solution hébergée)</a></li><li>lien nᵒ 2 : <a title="https://wallabag.org/fr" hreflang="fr" href="https://linuxfr.org/redirect/111569">wallabag, le projet</a></li><li>lien nᵒ 3 : <a title="https://nicolas.loeuillet.org/billets/2016/12/05/comment-je-vais-tenter-de-gagner-un-peu-dargent-avec-un-projet-opensource/" hreflang="fr" href="https://linuxfr.org/redirect/111574">Comment je vais tenter de gagner un peu d'argent avec un projet opensource</a></li><li>lien nᵒ 4 : <a title="https://nicolas.loeuillet.org/billets/2017/02/26/comment-je-vais-tenter-de-gagner-ma-vie-avec-un-projet-opensource/" hreflang="fr" href="https://linuxfr.org/redirect/111575">Comment je vais tenter de gagner ma vie avec un projet opensource</a></li><li>lien nᵒ 5 : <a title="https://nicolas.loeuillet.org/billets/2016/12/07/retours-sur-la-mise-en-ligne-de-wallabagit/" hreflang="fr" href="https://linuxfr.org/redirect/111576">Retours sur la mise en ligne de wallabag.it</a></li><li>lien nᵒ 6 : <a title="https://nicolas.loeuillet.org/billets/2017/11/30/un-an-apres-faisons-le-point-sur-wallabagit/" hreflang="fr" href="https://linuxfr.org/redirect/111577">Un an après, faisons le point sur wallabag.it</a></li><li>lien nᵒ 7 : <a title="https://nicolas.loeuillet.org/billets/2020/01/02/situation-apres-trois-annees-dactivite-pour-wallabagit/" hreflang="fr" href="https://linuxfr.org/redirect/111578">Situation après trois années d'activité pour wallabag.it</a></li><li>lien nᵒ 8 : <a title="https://nicolas.loeuillet.org/billets/2020/12/03/quatre-annees-de-wallabagit/" hreflang="fr" href="https://linuxfr.org/redirect/111579">Quatre années de wallabag.it</a></li><li>lien nᵒ 9 : <a title="https://nicolas.loeuillet.org/billets/2022/01/03/wallabagit-5-ans-dactivite/" hreflang="fr" href="https://linuxfr.org/redirect/111580">wallabag.it : 5 ans d'activité</a></li></ul><div><p>En l'état actuel des choses, aujourd'hui voici les offres disponibles :<br>
* 3 mois pour 3 €<br>
* 1 an pour 9 €<br>
* 1 an pour 25 € (abonnement de soutien)</p>
<h3 id="toc-nombre-de-factures">Nombre de factures</h3>
<p>Une facture est un abonnement, peu importe que ça soit pour 3 mois ou 1 an, et peu importe sa valeur.</p>
<ul>
<li>2016 : 89 (un seul mois d'activité)</li>
<li>2017 : 662 factures</li>
<li>2018 : 787 factures (+18,9%)</li>
<li>2019 : 959 factures (+21,9%)</li>
<li>2020 : 1266 (+32%)</li>
<li>2021 : 1526 (+20,5%)</li>
<li>2022 : 1531 (+0,3%)</li>
</ul>
<p>Nombre moyen mensuel de factures :</p>
<ul>
<li>2016 : 89 (un seul mois d'activité)</li>
<li>2017 : 55 factures / mois</li>
<li>2018 : 65 factures / mois</li>
<li>2019 : 79,9 factures / mois</li>
<li>2020 : 105,5 factures / mois</li>
<li>2021 : 127 factures / mois</li>
<li>2022 : 127 factures / mois</li>
</ul>
<h3 id="toc-chiffre-daffaires-ca">Chiffre d'affaires (CA)</h3>
<ul>
<li>2016 : 783 € (un seul mois d'activité)</li>
<li>2017 : 6093 €</li>
<li>2018 : 7593 € (+24,6%)</li>
<li>2019 : 9481 € (+24,9%)</li>
<li>2020 : 12922 € (+36,3%)</li>
<li>2021 : 15460 € (+21,5%)</li>
<li>2022 : 15735 € (+1,8%)</li>
</ul>
<p>CA mensuel moyen :</p>
<ul>
<li>2016 : 783 € (un seul mois d'activité)</li>
<li>2017 : 507 €</li>
<li>2018 : 632 €</li>
<li>2019 : 790 €</li>
<li>2020 : 1076 €</li>
<li>2021 : 1288 €</li>
<li>2022 : 1311 €</li>
</ul>
<p>Abonnement moyen (en moyenne, combien un client paie pour s'abonner) :</p>
<ul>
<li>2016 : 8,80 €</li>
<li>2017 : 9,19 €</li>
<li>2018 : 9,54 €</li>
<li>2019 : 9,83 €</li>
<li>2020 : 10,20 €</li>
<li>2021 : 10,09 €</li>
<li>2022 : 10,23 €</li>
</ul>
<h3 id="toc-type-dabonnements">Type d'abonnements</h3>
<ul>
<li>2017 : 342 abonnements à 9 € (+145 à 12 €, prix au départ de l'abonnement), 32 abonnements à 25 € et 80 abonnements à 3 €</li>
<li>2018 : 532 abonnements à 9 €, 93 abonnements à 25 € et 161 abonnements à 3 €</li>
<li>2019 : 668 abonnements à 9 €, 118 abonnements à 25 € et 173 abonnements à 3 €</li>
<li>2020 : 853 abonnements à 9 €, 173 abonnements à 25 € et 240 abonnements à 3 €</li>
<li>2021 : 1084 abonnements à 9 €, 199 abonnements à 25 € et 243 abonnements à 3 €</li>
<li>2022 : 1098 abonnements à 9 €, 207 abonnements à 25 € et 226 abonnements à 3 €</li>
</ul>
<p>Sur cette partie, c'est compliqué d'avoir des choses très détaillées surtout pour 2017, car j'ai tenté plusieurs choses (changement d'abonnements), il y a aussi eu une offre "Anniversaire" etc.</p>
<h3 id="toc-dépenses">Dépenses</h3>
<p>En 2022, j'ai dépensé pour 1510 € de frais (hébergement, nom de domaine, prestation admin sys, etc.), soit 126€ en moyenne par mois.<br><br>
J'ai payé 1097 € de commissions pour PayPal et PayPlug, mes prestataires de paiement en ligne.<br><br>
J'ai également payé environ 3725 € de cotisations sociales.</p>
<h3 id="toc-résultat-net">Résultat net</h3>
<ul>
<li>2017 : 3130 €</li>
<li>2018 : 3454 €</li>
<li>2019 : 4823 €</li>
<li>2020 : 6591 €</li>
<li>2021 : 9034 €</li>
<li>2022 : 9401 €</li>
</ul>
<h3 id="toc-conclusion">Conclusion</h3>
<p>Habituellement, je me fixais un objectif de +20%. En début d'année 2021, j'ai voulu être raisonnable en restant ambitieux. J'étais parti sur +10%.</p>
<p>Pour la toute première fois depuis la création du service, l'objectif n'est pas atteint (+1,8%). J'évoquais en conclusion l'an dernier des "premiers signes de fatigue pour ce projet". En effet, ça semble s'essouffler mais absolument rien de catastrophique.</p>
<p>Pour l'année prochaine, tentons de redresser la barre et visons 5% de hausse. Je vais voir comment je peux faire pour améliorer ça. J'ai quelques idées en tête, on verra si le temps disponible me permet d'avancer au mieux.</p>
<p>En tout cas, je tiens à remercier l'ensemble des utilisateurs/trices de ce beau projet. Et énorme merci à l'équipe derrière le projet open source !</p>
</div><div><a href="https://linuxfr.org/news/wallabag-it-a-6-ans.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129929/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/wallabag-it-a-6-ans#comments">ouvrir dans le navigateur</a>
</p>
Nicolas LœuilletXavier TeyssierPierre Jarillonhttps://linuxfr.org/nodes/129929/comments.atomtag:linuxfr.org,2005:Diary/405392023-01-11T11:36:23+01:002023-01-11T11:36:23+01:00Laravel 10 : la chasse aux bugs est ouverte !Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Cher Nal,<br>
En attendant la sortie prochaine du framework en PHP Laravel 10, une chasse aux bugs a été lancée par Taylor Otwell (créateur du framework).<br>
Pour cela, il suffit de remplir les règle suivantes :<br>
- la <em>pull request</em> doit pointer sur la branche 10.x du <a href="https://github.com/laravel/framework"><em>repository</em></a> <code>laravel/framework</code> ;<br>
- seuls les "vrais" bugs sont acceptés : pas de corrections de typos, de nouvelles fonctionnalités ou de refactoring du code ;<br>
- La correction du bug doit s'accompagner de tests.</p>
<p>À la clé, une récompense de 1.000$ ira à l'auteur de la <em>pull request</em> tirée au sort parmi toutes celles qui auront été fusionnées dans <em>master</em> et qui auront rempli les conditions ci-dessus, lors de la sortie de la 1ère version stable de Laravel 10 (prévue pour le 7 février).</p>
<div><a href="https://linuxfr.org/users/windu2b/journaux/laravel-10-la-chasse-aux-bugs-est-ouverte.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129951/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/windu2b/journaux/laravel-10-la-chasse-aux-bugs-est-ouverte#comments">ouvrir dans le navigateur</a>
</p>
windu.2bhttps://linuxfr.org/nodes/129951/comments.atomtag:linuxfr.org,2005:News/413472023-01-09T09:52:55+01:002023-01-09T09:52:55+01:00Sortie de PrestaShop 8.0.1Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>La version 8.0.1 de PrestaShop <a href="https://build.prestashop-project.org/news/2023/prestashop-8-0-1-maintenance-release/">vient d’être publiée</a>, la première version de correctifs pour PrestaShop 8.</p>
<p>PrestaShop est un système de gestion de contenu (CMS) libre français de commerce en ligne, développé en PHP + MySQL et placé sous licence <a href="https://opensource.org/licenses/OSL-3.0">OSL v3</a>.</p>
<p>La version 8.0.0 publiée en octobre 2022 est la première version majeure du projet depuis 2016, l’occasion de mettre à jour, simplifier et réorganiser de nombreux composants internes.</p>
<p>Les <a href="https://www.prestashop-project.org/releases/prestashop80/">nouveautés</a> de cette version sont très nombreuses, on peut mentionner le support de PHP 8.0 et PHP 8.1, le support du format d’image <a href="https://fr.wikipedia.org/wiki/Scalable_Vector_Graphics">SVG</a>, l’usage de <a href="https://blog.dashlane.com/fr/le-nouveau-guide-zxcvbn-de-dashlane-vous-aide-a-creer-des-mots-de-passe-maitre-plus-complexes-et-vous-evite-les-prises-de-tete/">zxcvbn</a> pour sécuriser les mots de passe, une nouvelle page dédiée à la sécurité…</p>
<p>La liste complète des nouveautés est disponible dans les <a href="https://build.prestashop-project.org/news/2022/prestashop-8-0-0-available/">notes de publication</a> (en anglais).</p>
</div><ul><li>lien nᵒ 1 : <a title="https://www.prestashop-project.org/" hreflang="en" href="https://linuxfr.org/redirect/111558">Site du projet PrestaShop</a></li><li>lien nᵒ 2 : <a title="https://build.prestashop-project.org/news/2022/prestashop-8-0-0-available/" hreflang="en" href="https://linuxfr.org/redirect/111559">Notes de publication de la version 8.0.0</a></li><li>lien nᵒ 3 : <a title="https://build.prestashop-project.org/news/2023/prestashop-8-0-1-maintenance-release/" hreflang="en" href="https://linuxfr.org/redirect/111560">Notes de publication de la version 8.0.1</a></li></ul><div></div><div><a href="https://linuxfr.org/news/sortie-de-prestashop-8-0-1.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129916/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-prestashop-8-0-1#comments">ouvrir dans le navigateur</a>
</p>
Mathieu FermentYsabeau 🧶 🧦https://linuxfr.org/nodes/129916/comments.atomtag:linuxfr.org,2005:News/409932022-12-05T19:36:21+01:002022-12-06T09:58:52+01:00PHP sort en version 8.2Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Après 3 Alpha, 3 Beta et 7 RC, et tout juste un an après la sortie de <a href="//linuxfr.org/news/la-version-8-1-de-php-et-creation-de-la-fondation-php">PHP 8.1</a>, PHP, le langage de programmation pour le Web le plus connu et le plus utilisé, devrait être disponible après-demain en version 8.2, la sortie initiale prévue au 24 novembre ayant été reportée.<br>
Petit tour (non-exhaustif) des nouveautés !</p>
</div><ul></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<ul>
<li>
<a href="#toc-nouvelles-fonctionnalit%C3%A9s">Nouvelles fonctionnalités</a><ul>
<li>
<a href="#toc-classes-en-lecture-seule-readonly-classes--rfc">Classes en lecture seule (<em>Readonly classes</em> : </a><a href="https://wiki.php.net/rfc/readonly_classes">RFC</a>)</li>
<li>
<a href="#toc-d%C3%A9pr%C3%A9ciation-des-propri%C3%A9t%C3%A9s-dynamiques-deprecate-dynamic-properties--rfc">Dépréciation des propriétés dynamiques (<em>Deprecate dynamic properties</em> : </a><a href="https://wiki.php.net/rfc/deprecate_dynamic_properties">RFC</a>)<ul>
<li><a href="#toc-ajouter-les-m%C3%A9thodes-magiques-__get-etou-__set-">Ajouter les méthodes magiques <code>__get</code> et/ou <code>__set</code> :</a></li>
<li><a href="#toc-utiliser-la-classe-stdclass-de-php-ou-en-h%C3%A9riter-">Utiliser la classe <code>stdClass</code> de PHP (ou en hériter) :</a></li>
<li><a href="#toc-ajouter-lattribut-allowdynamicproperties-%C3%A0-la-classe-">Ajouter l'attribut <code>#[AllowDynamicProperties]</code> à la classe :</a></li>
</ul>
</li>
<li>
<a href="#toc-nouveaux-types-de-retour--null-true-et-false-allow-null-and-false-as-stand-alone-types--rfc">Nouveaux types de retour : <code>null</code>, <code>true</code>, et <code>false</code> (<em>Allow null and false as stand-alone types</em> : </a><a href="https://wiki.php.net/rfc/null-false-standalone-types">RFC</a>)</li>
<li>
<a href="#toc-masquage-des-donn%C3%A9es-sensibles-dans-les-logs-redacting-parameters-in-back-traces--rfc">Masquage des données sensibles dans les logs (<em>Redacting parameters in back traces</em> : </a><a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces">RFC</a>)</li>
<li>
<a href="#toc-constantes-dans-les-traits-rfc">Constantes dans les Traits (</a><a href="https://wiki.php.net/rfc/constants_in_traits">RFC</a>)</li>
<li>
<a href="#toc-retrait-du-support-de-libmysql-remove-support-for-libmysql-from-mysqli--rfc">Retrait du support de <em>libmysql</em> (<em>Remove support for libmysql from mysqli</em> : </a><a href="https://wiki.php.net/rfc/mysqli_support_for_libmysql">RFC</a>)</li>
<li><a href="#toc-liste-compl%C3%A8te-des-rfc">Liste complète des RFC</a></li>
</ul>
</li>
<li><a href="#toc-php-83">PHP 8.3</a></li>
</ul>
</li>
</ul>
<h3 id="toc-nouvelles-fonctionnalités">Nouvelles fonctionnalités</h3>
<h4 id="toc-classes-en-lecture-seule-readonly-classes--rfc">Classes en lecture seule (<em>Readonly classes</em> : <a href="https://wiki.php.net/rfc/readonly_classes">RFC</a>)</h4>
<p>Après la possibilité offerte par PHP 8.1 d'ajouter le mot-clé <em><a href="https://wiki.php.net/rfc/readonly_properties_v2">readonly</a></em> aux propriétés d'une classe, c'est désormais directement sur la classe que l'on peut le faire.<br>
Cela permet d'alléger le code, en évitant la répétition du même mot-clé sur chacune des propriétés d'une classe (au risque de l'oublier sur l'une d'entre elles, notamment lorsque le code vient à évoluer), et de le rendre plus clair (quand la classe est <em>readonly</em>, toutes ses propriétés le sont forcément).<br>
Cela permet aussi d'empêcher la création de propriétés dynamiques (propriétés non déclarées dans le corps de la classe).<br>
Le principal usage est bien évidemment les classes DTO (<em>Data Transfer Object</em>), en permettant d'instancier des objets garantis immuables.</p>
<p>On est donc passé de ceci, en PHP 8.0 :</p>
<pre><code class="php"><span class="k">class</span> <span class="nc">Book</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Constructeur PHP utilisant la nouvelle syntaxe "Constructor property promotion" apparue avec PHP 8.0</span>
<span class="sd"> * @see https://stitcher.io/blog/new-in-php-8#constructor-property-promotion-rfc</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span>
<span class="k">private</span> <span class="nx">string</span> <span class="nv">$title</span><span class="p">,</span>
<span class="k">private</span> <span class="nx">string</span> <span class="nv">$author</span><span class="p">;</span>
<span class="p">)</span>
<span class="p">{}</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">getTitle</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="na">title</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">getAuthor</span><span class="p">()</span><span class="o">:</span> <span class="nx">string</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="na">author</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nv">$book</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Book</span><span class="p">(</span><span class="s1">'A Game of Thrones'</span><span class="p">,</span> <span class="s1">'George R.R. Martin'</span><span class="p">);</span>
<span class="nv">$book</span><span class="o">-></span><span class="na">getAuthor</span><span class="p">();</span> <span class="c1">// "George R.R. Martin"</span></code></pre>
<p>Puis ça, en PHP 8.1 :</p>
<pre><code class="php"><span class="k">class</span> <span class="nc">Book</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * Les propriétés étant déclarées 'readonly', elles peuvent être déclarées 'public' sans risque.</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span>
<span class="k">public</span> <span class="nx">readonly</span> <span class="nx">string</span> <span class="nv">$title</span><span class="p">,</span>
<span class="k">public</span> <span class="nx">readonly</span> <span class="nx">string</span> <span class="nv">$author</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">{}</span>
<span class="c1">// Suppression des getters, devenus inutiles</span>
<span class="p">}</span>
<span class="nv">$book</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Book</span><span class="p">(</span><span class="s1">'A Game of Thrones'</span><span class="p">,</span> <span class="s1">'George R.R. Martin'</span><span class="p">);</span>
<span class="c1">// On peut désormais appeler directement la propriété, sans craindre de la modifier</span>
<span class="k">echo</span> <span class="nv">$book</span><span class="o">-></span><span class="na">author</span><span class="p">;</span> <span class="c1">// "George R.R. Martin"</span>
<span class="nv">$book</span><span class="o">-></span><span class="na">author</span> <span class="o">=</span> <span class="s1">'J.R.R. Tolkien'</span><span class="p">;</span> <span class="c1">// Error: Cannot modify readonly property Book::$author</span></code></pre>
<p>Pour arriver finalement à ceci, en PHP 8.2 :</p>
<pre><code class="php"><span class="c1">// utilisation du mot-clé 'readonly' sur la classe directement</span>
<span class="nx">readonly</span> <span class="k">class</span> <span class="nc">Book</span>
<span class="p">{</span>
<span class="sd">/**</span>
<span class="sd"> * La classe étant déclarée 'readonly', les propriétés peuvent être déclarées 'public' sans risque,</span>
<span class="sd"> * sans pour autant avoir encore besoin de les déclarer 'readonly' une à une.</span>
<span class="sd"> */</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span>
<span class="k">public</span> <span class="nx">string</span> <span class="nv">$title</span><span class="p">,</span>
<span class="k">public</span> <span class="nx">string</span> <span class="nv">$author</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">{}</span>
<span class="c1">// Suppression des getters, devenus inutiles</span>
<span class="p">}</span>
<span class="nv">$book</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Book</span><span class="p">(</span><span class="s1">'A Game of Thrones'</span><span class="p">,</span> <span class="s1">'George R.R. Martin'</span><span class="p">);</span>
<span class="k">echo</span> <span class="nv">$book</span><span class="o">-></span><span class="na">author</span><span class="p">;</span> <span class="c1">// "George R.R. Martin"</span>
<span class="nv">$book</span><span class="o">-></span><span class="na">author</span> <span class="o">=</span> <span class="s1">'J.R.R. Tolkien'</span><span class="p">;</span> <span class="c1">// Error: Cannot modify readonly property Book::$author</span>
<span class="nv">$book</span><span class="o">-></span><span class="na">genre</span> <span class="o">=</span> <span class="s1">'Epic fantasy'</span><span class="p">;</span> <span class="c1">// Uncaught Error: Cannot create dynamic property Book::$genre</span></code></pre>
<p><strong>ATTENTION !</strong><br>
Un objet <em>readonly</em> n'est pas forcément immuable ! Si un objet A a une référence vers un objet B (composition), le fait que cette référence soit <em>readonly</em> garantit uniquement que A ne pointera jamais vers C à la place de B. Mais cela n'empêche pas pour autant les propriétés de B de pouvoir changer dans le temps (si elles ne sont pas elles-mêmes <em>readonly</em>, évidemment).</p>
<h4 id="toc-dépréciation-des-propriétés-dynamiques-deprecate-dynamic-properties--rfc">Dépréciation des propriétés dynamiques (<em>Deprecate dynamic properties</em> : <a href="https://wiki.php.net/rfc/deprecate_dynamic_properties">RFC</a>)</h4>
<p>Dans la continuité du refus d'ajouter une propriété dynamique sur une classe <em>readonly</em>, une Deprecated est désormais levée lorsqu'on fait appel à une propriété inexistante au sein de la classe/de l'objet.<br>
Ex :</p>
<pre><code class="php"><span class="k">class</span> <span class="nc">User</span> <span class="p">{</span>
<span class="k">public</span> <span class="nv">$name</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">$user</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
<span class="c1">// Assigns declared property User::$name</span>
<span class="nv">$user</span><span class="o">-></span><span class="na">name</span> <span class="o">=</span> <span class="s2">"foo"</span><span class="p">;</span>
<span class="c1">// Oops, a typo:</span>
<span class="nv">$user</span><span class="o">-></span><span class="na">nane</span> <span class="o">=</span> <span class="s2">"foo"</span><span class="p">;</span>
<span class="c1">// PHP <= 8.1: Silently creates dynamic $user->nane property.</span>
<span class="c1">// PHP 8.2: "Deprecated: Creation of dynamic property User::$nane is deprecated"</span>
<span class="c1">// PHP 9.0: Throws Error exception.</span></code></pre>
<p>Néanmoins, les cas où il faut pouvoir continuer à créer des propriétés dynamiques ont été pris en compte. Pour cela, 3 solutions :</p>
<h5 id="toc-ajouter-les-méthodes-magiques-__get-etou-__set-">Ajouter les méthodes magiques <code>__get</code> et/ou <code>__set</code> :</h5>
<pre><code class="php"><span class="k">class</span> <span class="nc">Post</span>
<span class="p">{</span>
<span class="k">private</span> <span class="k">array</span> <span class="nv">$properties</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__set</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$name</span><span class="p">,</span> <span class="nx">mixed</span> <span class="nv">$value</span><span class="p">)</span><span class="o">:</span> <span class="nx">void</span>
<span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="na">properties</span><span class="p">[</span><span class="nv">$name</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$value</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// …</span>
<span class="p">}</span>
<span class="c1">// …</span>
<span class="nv">$post</span><span class="o">-></span><span class="na">name</span> <span class="o">=</span> <span class="s1">'Name'</span><span class="p">;</span> <span class="c1">// Pas de message de dépréciation</span></code></pre>
<h5 id="toc-utiliser-la-classe-stdclass-de-php-ou-en-hériter-">Utiliser la classe <code>stdClass</code> de PHP (ou en hériter) :</h5>
<pre><code class="php"><span class="cm">/*</span>
<span class="cm"> * Ne faites pas ça : ça marche mais c'est une solution fortement déconseillée !</span>
<span class="cm"> */</span>
<span class="k">class</span> <span class="nc">Post</span> <span class="k">extends</span> <span class="k">stdClass</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="nv">$post</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Post</span><span class="p">();</span>
<span class="nv">$post</span><span class="o">-></span><span class="na">name</span> <span class="o">=</span> <span class="s1">'Name'</span><span class="p">;</span> <span class="c1">// Pas de message de dépréciation</span></code></pre>
<h5 id="toc-ajouter-lattribut-allowdynamicproperties-à-la-classe-">Ajouter l'attribut <code>#[AllowDynamicProperties]</code> à la classe :</h5>
<pre><code class="php"><span class="cm">/*</span>
<span class="cm"> * Solution la plus recommandée pour gérer le code legacy, car l'impact est nul.</span>
<span class="cm"> */</span>
<span class="c1">#[AllowDynamicProperties]</span>
<span class="k">class</span> <span class="nc">Post</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="nv">$post</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Post</span><span class="p">();</span>
<span class="nv">$post</span><span class="o">-></span><span class="na">name</span> <span class="o">=</span> <span class="s1">'Name'</span><span class="p">;</span> <span class="c1">// Pas de message de dépréciation</span></code></pre>
<p>À terme (PHP 9), le message passera de <code>Deprecated</code> à la levée d'une exception de type <code>Error</code>.</p>
<h4 id="toc-nouveaux-types-de-retour--null-true-et-false-allow-null-and-false-as-stand-alone-types--rfc">Nouveaux types de retour : <code>null</code>, <code>true</code>, et <code>false</code> (<em>Allow null and false as stand-alone types</em> : <a href="https://wiki.php.net/rfc/null-false-standalone-types">RFC</a>)</h4>
<p>Il est désormais possible d'indiquer que le type de retour d'une fonction/méthode est <code>null</code>, <code>true</code>, ou <code>false</code>. C'est notamment utile pour les fonctions de PHP qui renvoient une valeur, ou <code>false</code> si un problème a été rencontré.<br>
Par exemple :</p>
<pre><code class="php"><span class="cm">/*</span>
<span class="cm"> * Trouve la première occurrence de $needle dans $haystack</span>
<span class="cm"> * @return la portion de la chaîne, ou false si needle n'est pas trouvé.</span>
<span class="cm"> */</span>
<span class="nb">strstr</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$haystack</span><span class="p">,</span> <span class="nx">string</span> <span class="nv">$needle</span><span class="p">,</span> <span class="nx">bool</span> <span class="nv">$before_needle</span> <span class="o">=</span> <span class="k">false</span><span class="p">)</span><span class="o">:</span> <span class="nx">string</span><span class="o">|</span><span class="k">false</span></code></pre>
<h4 id="toc-masquage-des-données-sensibles-dans-les-logs-redacting-parameters-in-back-traces--rfc">Masquage des données sensibles dans les logs (<em>Redacting parameters in back traces</em> : <a href="https://wiki.php.net/rfc/redact_parameters_in_back_traces">RFC</a>)</h4>
<p>Il est désormais possible d'indiquer que la valeur d'un paramètre ne doit jamais se retrouver dans des traces d'erreurs. C'est évidemment très utile pour éviter qu'un mot de passe ne finisse en clair dans un fichier de logs.<br>
Pour cela, il faut ajouter un attribut à la variable concernée, comme ceci :</p>
<pre><code class="php"><span class="k">function</span> <span class="nf">test</span><span class="p">(</span>
<span class="nv">$foo</span> <span class="o">=</span> <span class="k">null</span><span class="p">,</span>
<span class="c1">#[\SensitiveParameter] $bar = null,</span>
<span class="nv">$baz</span> <span class="o">=</span> <span class="k">null</span>
<span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nx">\Exception</span><span class="p">(</span><span class="s1">'Error'</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">test</span><span class="p">(</span><span class="nx">baz</span><span class="o">:</span> <span class="s1">'baz'</span><span class="p">);</span>
<span class="cm">/*</span>
<span class="cm">Fatal error: Uncaught Exception: Error in test.php:8</span>
<span class="cm">Stack trace:</span>
<span class="cm">#0 test.php(11): test(NULL, Object(SensitiveParameterValue), 'baz')</span>
<span class="cm">#1 {main}</span>
<span class="cm"> thrown in test.php on line 8</span>
<span class="cm">*/</span></code></pre>
<p>Comme on le voit dans la trace d'erreur, la valeur du paramètre en entrée <code>$bar</code> a été remplacée par <code>Object(SensitiveParameterValue)</code>.</p>
<h4 id="toc-constantes-dans-les-traits-rfc">Constantes dans les Traits (<a href="https://wiki.php.net/rfc/constants_in_traits">RFC</a>)</h4>
<p>Il est désormais possible d'inclure des constantes au sein d'un Trait.<br>
La syntaxe suivante est donc désormais valide :</p>
<pre><code class="php"><span class="k">trait</span> <span class="nx">T</span> <span class="p">{</span>
<span class="k">public</span> <span class="k">const</span> <span class="no">CONSTANT</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
<span class="k">public</span> <span class="k">function</span> <span class="nf">doSomething</span><span class="p">()</span><span class="o">:</span> <span class="nx">void</span> <span class="p">{</span>
<span class="c1">// Fatal Error</span>
<span class="k">echo</span> <span class="nx">T</span><span class="o">::</span><span class="na">CONSTANT</span><span class="p">;</span>
<span class="c1">// OK</span>
<span class="k">echo</span> <span class="nx">self</span><span class="o">::</span><span class="na">CONSTANT</span><span class="p">;</span>
<span class="k">echo</span> <span class="k">static</span><span class="o">::</span><span class="na">CONSTANT</span><span class="p">;</span>
<span class="k">echo</span> <span class="nv">$this</span><span class="o">::</span><span class="na">CONSTANT</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span></code></pre>
<h4 id="toc-retrait-du-support-de-libmysql-remove-support-for-libmysql-from-mysqli--rfc">Retrait du support de <em>libmysql</em> (<em>Remove support for libmysql from mysqli</em> : <a href="https://wiki.php.net/rfc/mysqli_support_for_libmysql">RFC</a>)</h4>
<p>Le support de la bibliothèque <em>libmysql</em> a été retiré de PHP, pour ne conserver désormais que le support de <em>mysqlnd</em>. Si vous utilisez PHP avec MySQL (que ce soit avec l'extension PHP <em>mysqli</em> ou avec <em>PDO_mysql</em>), vous ne devriez même pas vous en rendre compte : <em>mysqlnd</em> est utilisée par défaut depuis… PHP 5.4 (sortie en 2012).</p>
<h4 id="toc-liste-complète-des-rfc">Liste complète des RFC</h4>
<p>La liste complète des apports de cette nouvelle version est <a href="https://wiki.php.net/rfc#php_82">consultable ici</a>.</p>
<h3 id="toc-php-83">PHP 8.3</h3>
<p>La prochaine version sera la 8.3, <a href="https://wiki.php.net/todo/php83">prévue (pour l'instant) pour novembre 2023</a>.<br>
La liste des nouvelles fonctionnalités n'est évidemment pas encore arrêtée, mais on peut d'ores et déjà <a href="https://wiki.php.net/rfc#php_83">la retrouver ici</a>.</p>
</div><div><a href="https://linuxfr.org/news/php-sort-en-version-8-2.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127613/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/php-sort-en-version-8-2#comments">ouvrir dans le navigateur</a>
</p>
windu.2bEllendhelvmagninbobble bubblePierre JarillonYves BourguignonNils Ratusznikpalm123https://linuxfr.org/nodes/127613/comments.atom