<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: neothone</title>
    <description>The latest articles on DEV Community by neothone (@neothone).</description>
    <link>https://dev.to/neothone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1775873%2F5c3c3734-2edd-4963-811f-1882b45368cc.jpg</url>
      <title>DEV Community: neothone</title>
      <link>https://dev.to/neothone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neothone"/>
    <language>en</language>
    <item>
      <title>Fastfony is officially out!</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Tue, 22 Jul 2025 14:31:11 +0000</pubDate>
      <link>https://dev.to/fastfony/fastfony-is-officially-out-1n8l</link>
      <guid>https://dev.to/fastfony/fastfony-is-officially-out-1n8l</guid>
      <description>&lt;h1&gt;
  
  
  Fastfony v0.3.1: First Stable Release 🚀
&lt;/h1&gt;

&lt;p&gt;I'm excited to share the release of Fastfony v0.3.1—the very first stable version of this modern web app starter kit!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Fastfony?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Fastfony helps you launch web projects, with PHP and the Symfony  framework, faster by combining a robust tech stack (PHP 8.2, Symfony 7.3, Webpack Encore, Vue 3, Tailwind CSS 4, API Platform, EasyAdmin) with essential features out-of-the-box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content Management:&lt;/strong&gt; SEO pages, collections, taxonomies, inline editing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Magic link login, user management, permissions, password reset, avatars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-Commerce:&lt;/strong&gt; Product management, Stripe integration, contact form&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin Tools:&lt;/strong&gt; Scheduler, logs, settings panel, CRUD generator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern UI:&lt;/strong&gt; Responsive Tailwind + DaisyUI, toast notifications, i18n&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIs:&lt;/strong&gt; OAuth2 ready, REST &amp;amp; GraphQL, flexible endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Release Cycle:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Fastfony syncs with Symfony’s release schedule (with a 2-month delay). Expect releases in January and July, with LTS versions for long-term stability (v0.4 in January 2026 will be the first LTS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get Started:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Check out the &lt;a href="https://docs.fastfony.com" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; (still growing!) and explore the &lt;a href="https://fastfony.com/?source=devto-release-0.3.1" rel="noopener noreferrer"&gt;showroom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope Fastfony will thrive and evolve with the help of the community. Interested in contributing or collaborating? Reach out—everyone is welcome!&lt;/p&gt;

&lt;p&gt;Happy coding!  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>symfony</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Fastfony : Symfony boilerplate and starter-kit for professionnals</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Sun, 22 Jun 2025 16:06:26 +0000</pubDate>
      <link>https://dev.to/neothone/fastfony-symfony-boilerplate-and-starter-kit-for-professionnals-4aoj</link>
      <guid>https://dev.to/neothone/fastfony-symfony-boilerplate-and-starter-kit-for-professionnals-4aoj</guid>
      <description>&lt;h1&gt;
  
  
  Announcing &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;Fastfony&lt;/a&gt; RC1: A New Symfony Starter-Kit for Professionals
&lt;/h1&gt;

&lt;p&gt;Hey folks! 👋&lt;/p&gt;

&lt;p&gt;After months of hard work, sleepless nights, and way too much coffee, I’m thrilled (and a little relieved!) to announce the &lt;strong&gt;first release candidate of &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;Fastfony&lt;/a&gt;&lt;/strong&gt;, my very own &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;starter-kit for Symfony projects&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fastfony?
&lt;/h2&gt;

&lt;p&gt;I realized something was missing: a true, ready-to-go starter-kit that covers both the &lt;strong&gt;boilerplate&lt;/strong&gt; and the &lt;strong&gt;essential features&lt;/strong&gt; that almost every Symfony project needs. There were some attempts out there, but none really hit the mark for me. So, what do you do when you can’t find the tool you need? You build it yourself! 🚀&lt;/p&gt;

&lt;p&gt;Fastfony is the result of about &lt;strong&gt;200 hours of work&lt;/strong&gt;, and I can say without hesitation: it’s been a labor of love. My goal is simple—&lt;strong&gt;save you those 200 hours&lt;/strong&gt; (or more!) by providing a solid, &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;customizable foundation for your next Symfony project&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Inside?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;Fastfony is more than just a boilerplate&lt;/a&gt;. It’s a &lt;strong&gt;complete, production-ready stack&lt;/strong&gt; designed to get you up and running quickly. Here’s what you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A functional, opinionated boilerplate&lt;/strong&gt;: All the boring setup is already done for you!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Essential features, simplified&lt;/strong&gt;: Authentication, user management, basic CRUD, and more—implemented in their simplest, most customizable form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A base you can truly make your own&lt;/strong&gt;: The code is easy to adapt, extend, or strip down to fit your needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re launching a SaaS, building an internal tool, or just want a strong starting point for your next client project, Fastfony gives you the boost you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Pros, By a Pro
&lt;/h2&gt;

&lt;p&gt;I built Fastfony for my own professional use, and I’ve already used it on real-world projects. That means I’m committed to keeping it battle-tested, up-to-date, and aligned with the needs of people who build real apps for real clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing and the Road Ahead
&lt;/h2&gt;

&lt;p&gt;Fastfony will be available via a &lt;strong&gt;license subscription&lt;/strong&gt;. I believe this is the fairest way to ensure ongoing development and support, especially for professional and commercial use. I know putting a price tag on open tooling can be divisive, but my hope is that the time you save and the quality you get will make it a no-brainer for serious Symfony devs. And... it's free for personal usage!&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback: The Good, The Bad, and the Honest
&lt;/h2&gt;

&lt;p&gt;I’m well aware that not everyone will love every decision I’ve made—and that’s okay! I’m expecting a range of feedback, both positive and critical, and I genuinely welcome it. Your input will help me improve Fastfony and make it even more useful for the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Plan: In Sync with Symfony
&lt;/h2&gt;

&lt;p&gt;No matter how widely Fastfony is adopted, I’m in this for the long haul. I plan to follow the official Symfony release calendar, ensuring that Fastfony stays compatible and up-to-date. After all, I’m the &lt;strong&gt;first and main user&lt;/strong&gt;—I depend on it for my own work!&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Fastfony Today
&lt;/h2&gt;

&lt;p&gt;If you’re a Symfony developer looking for &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;a fast, reliable, and professional-grade starter-kit&lt;/a&gt;, I’d love for you to give Fastfony a try. Check out the RC1, let me know what you think, and help shape the future of this project.&lt;/p&gt;

&lt;p&gt;Thanks for reading—and happy coding! ✨&lt;/p&gt;

&lt;p&gt;More info on &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;https://fastfony.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>symfony</category>
    </item>
    <item>
      <title>My first published project!</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Wed, 18 Jun 2025 14:26:28 +0000</pubDate>
      <link>https://dev.to/neothone/my-first-published-project-47ma</link>
      <guid>https://dev.to/neothone/my-first-published-project-47ma</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f" class="crayons-story__hidden-navigation-link"&gt;v0.3.0-RC1 is out and available for testing&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/fastfony"&gt;
            &lt;img alt="Fastfony logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F10396%2F1eb233c5-40e0-4cf8-8d93-893775f2ab01.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/neothone" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1775873%2F5c3c3734-2edd-4963-811f-1882b45368cc.jpg" alt="neothone profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/neothone" class="crayons-story__secondary fw-medium m:hidden"&gt;
              neothone
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                neothone
                
              
              &lt;div id="story-author-preview-content-2603203" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/neothone" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1775873%2F5c3c3734-2edd-4963-811f-1882b45368cc.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;neothone&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/fastfony" class="crayons-story__secondary fw-medium"&gt;Fastfony&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 18 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f" id="article-link-2603203"&gt;
          v0.3.0-RC1 is out and available for testing
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/php"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;php&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/symfony"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;symfony&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tooling"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tooling&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>php</category>
      <category>symfony</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>v0.3.0-RC1 is out and available for testing</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Wed, 18 Jun 2025 14:25:12 +0000</pubDate>
      <link>https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f</link>
      <guid>https://dev.to/fastfony/v030-rc1-is-out-and-available-for-testing-h5f</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Introducing Fastfony: The Pragmatic Symfony Starter-Kit You’ve Been Waiting For (if you are Symfony PHP Developers) !
&lt;/h1&gt;

&lt;p&gt;Hey devs!  &lt;/p&gt;

&lt;p&gt;I’m super excited (and, let’s be honest, a little nervous 😅) to announce the &lt;strong&gt;very first Release Candidate&lt;/strong&gt; of &lt;a href="https://fastfony.com/?source=dailydev_squad_fastfony" rel="noopener noreferrer"&gt;Fastfony&lt;/a&gt; — a pragmatic starter-kit for Symfony that I’ve poured around 200 hours of work into, so you don’t have to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fastfony?
&lt;/h2&gt;

&lt;p&gt;If you’ve ever kicked off a new Symfony project, you know the drill:&lt;br&gt;&lt;br&gt;
You start by setting up the same stack, the same basic features, and the same best practices — over and over. There are some “boilerplate” projects out there, but nothing truly opinionated &lt;em&gt;and&lt;/em&gt; flexible that covers the professional needs and patterns I (and, I bet, you) use in the real world.&lt;/p&gt;

&lt;p&gt;That’s where Fastfony comes in. Think of it as a &lt;strong&gt;complete, production-ready boilerplate&lt;/strong&gt; and a &lt;strong&gt;customizable starter-kit&lt;/strong&gt; rolled into one. It provides you with a solid, functional technical stack, plus all those essential features you end up building in every Symfony project — in their simplest, most customizable form.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Inside?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A full-featured Symfony base with modern best practices baked in.
&lt;/li&gt;
&lt;li&gt;Ready-to-customize features that you’ll want in every project, but stripped to their essentials so you can make them your own.
&lt;/li&gt;
&lt;li&gt;Pragmatic defaults: sensible, flexible, and designed for commercial/pro use.
&lt;/li&gt;
&lt;li&gt;A release plan tied to the official Symfony release calendar — because I’m the first user of Fastfony, and I’ll be maintaining it for real projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Launching Today on Product Hunt!
&lt;/h2&gt;

&lt;p&gt;I’ve just dropped &lt;a href="https://www.producthunt.com/posts/fastfony-pragmatic-starter-kit?utm_source=other&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;Fastfony on Product Hunt&lt;/a&gt; — and, well, it only has &lt;strong&gt;5 upvotes as I write this!&lt;/strong&gt; If you like what you see, I’d love your support, but more importantly, your feedback. 😍&lt;/p&gt;

&lt;h2&gt;
  
  
  Open for Feedback (Positive &lt;em&gt;and&lt;/em&gt; Negative!)
&lt;/h2&gt;

&lt;p&gt;This is just the beginning. I’m sure there are things to improve — and I’m counting on the dev community to help me make Fastfony even better. Whether you’re excited, skeptical, or have suggestions, I want to hear from you! Every bit of criticism will help shape Fastfony’s future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sustainable &amp;amp; Professional
&lt;/h2&gt;

&lt;p&gt;To make ongoing development sustainable (and because this is a pro-grade tool), Fastfony will be offered as a &lt;strong&gt;subscription license&lt;/strong&gt; for commercial use. But regardless of its commercial success or mass adoption, I &lt;em&gt;will&lt;/em&gt; keep it updated and evolving — because I rely on it for my own projects, too.&lt;/p&gt;




&lt;p&gt;Thanks for reading, and thanks even more if you give Fastfony a try!&lt;br&gt;&lt;br&gt;
Let’s build better Symfony projects, faster, together.&lt;/p&gt;

&lt;p&gt;Feel free to check it out, give feedback, or just come say hi! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/fastfony-pragmatic-starter-kit?utm_source=other&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;👉 Support Fastfony now on Product Hunt&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://fastfony.com/?source=dailydev_squad_fastfony" rel="noopener noreferrer"&gt;👉 Discover Fastfony.com and Github repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;br&gt;&lt;br&gt;
neothone&lt;/p&gt;

</description>
      <category>php</category>
      <category>symfony</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Fastfony : première Release Candidate 🚀</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Tue, 17 Jun 2025 13:37:52 +0000</pubDate>
      <link>https://dev.to/neothone/fastfony-premiere-release-candidate-fo3</link>
      <guid>https://dev.to/neothone/fastfony-premiere-release-candidate-fo3</guid>
      <description>&lt;p&gt;Hello à tous,&lt;/p&gt;

&lt;p&gt;Aujourd’hui, j’ai le plaisir (et une pointe de fierté, je l’avoue) de vous annoncer la toute première Release Candidate de &lt;strong&gt;&lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;Fastfony&lt;/a&gt;&lt;/strong&gt;, mon starter-kit pour Symfony ! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi Fastfony ?
&lt;/h2&gt;

&lt;p&gt;Parce que je ne trouvais aucun acteur solide sur ce segment, j’ai décidé de créer &lt;strong&gt;Fastfony&lt;/strong&gt; : un starter-kit pensé pour les développeurs qui veulent aller vite, bien, et avec une stack moderne, sans repartir d’une feuille blanche à chaque nouveau projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fastfony&lt;/strong&gt;, c’est deux choses :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Un boilerplate Symfony complet et fonctionnel&lt;/strong&gt; : tout est prêt à l’emploi pour démarrer un projet pro, sans perdre de temps sur l’initialisation de la stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un starter-kit personnalisable&lt;/strong&gt; : toutes les fonctionnalités de base (authentification, gestion des utilisateurs, configuration des outils courants, etc.) sont intégrées dans leur version la plus simple, pour que chacun puisse les adapter à son contexte.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  200 heures de boulot… pour vous en faire gagner autant !
&lt;/h2&gt;

&lt;p&gt;Je ne vais pas vous mentir : ce projet, c’est environ &lt;strong&gt;200 heures de travail&lt;/strong&gt; (soirées, week-ends, cafés, refactors et “tiens, si je faisais mieux”). Mais c’est du temps que j’ai investi pour que vous n’ayez pas à le faire ! Mon objectif, c’est que Fastfony vous fasse gagner des jours, voire des semaines, sur vos prochains projets Symfony.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un modèle pro &amp;amp; commercial
&lt;/h2&gt;

&lt;p&gt;Fastfony s’adresse aux développeurs, aux agences, aux startups… à tous ceux qui veulent une base sérieuse pour leurs projets Symfony. Pour garantir un vrai suivi, des mises à jour régulières et un support de qualité, &lt;strong&gt;la licence sera proposée sous forme d’abonnement&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Je sais que ce choix peut susciter des débats (et sûrement des critiques, bonnes ou mauvaises), mais il me paraît juste pour garantir la pérennité du projet. Les retours, même négatifs, seront précieux pour faire grandir Fastfony !&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Plan et roadmap
&lt;/h2&gt;

&lt;p&gt;Que Fastfony devienne un standard ou reste un outil de niche, &lt;strong&gt;je vais maintenir le projet&lt;/strong&gt;. En tant que premier utilisateur (je l’ai déjà utilisé sur mes propres projets), je vais suivre le release calendar officiel de Symfony pour garantir une compatibilité optimale et des évolutions continues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Et maintenant ?
&lt;/h2&gt;

&lt;p&gt;Je vous invite à tester cette Release Candidate, à me faire vos retours (bons ou mauvais, tout est bon à prendre !), et à suivre l’aventure. Fastfony, c’est un projet passion, mais aussi une vraie volonté de faire avancer la communauté Symfony.&lt;/p&gt;

&lt;p&gt;Merci à tous ceux qui suivront, testeront, critiqueront, ou encourageront ce projet !&lt;/p&gt;

&lt;p&gt;Le point d'entrée : &lt;a href="https://fastfony.com" rel="noopener noreferrer"&gt;fastfony.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À très vite,&lt;br&gt;
neothone&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>symfony</category>
      <category>starterkit</category>
    </item>
    <item>
      <title>Bash script for install php on naked Ubuntu 24.04</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Sun, 23 Mar 2025 14:18:40 +0000</pubDate>
      <link>https://dev.to/neothone/bash-script-for-install-php-on-naked-ubuntu-2404-389f</link>
      <guid>https://dev.to/neothone/bash-script-for-install-php-on-naked-ubuntu-2404-389f</guid>
      <description>&lt;p&gt;This script works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx wget build-essential curl lsb-release ca-certificates apt-transport-https software-properties-common &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow &lt;span class="s1"&gt;'Nginx Full'&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository ppa:ondrej/php &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;php8.4 php8.4-fpm php8.4-common php8.4-pgsql php8.4-xml php8.4-xmlrpc php8.4-curl php8.4-gd php8.4-imagick php8.4-cli php8.4-dev php8.4-imap php8.4-mbstring php8.4-opcache php8.4-soap php8.4-zip php8.4-intl php8.4-bcmath unzip &lt;span class="nt"&gt;-y&lt;/span&gt;
curl &lt;span class="nt"&gt;-sS&lt;/span&gt; https://getcomposer.org/installer | &lt;span class="nb"&gt;sudo &lt;/span&gt;php &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;core&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;snap refresh core
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get remove certbot
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--classic&lt;/span&gt; certbot
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /snap/bin/certbot /usr/bin/certbot

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install php 8.4, composer, nginx &amp;amp; certbot!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>bash</category>
      <category>ubuntu</category>
      <category>php</category>
    </item>
    <item>
      <title>Directory structure of a PHP Symfony project</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Wed, 19 Mar 2025 22:01:49 +0000</pubDate>
      <link>https://dev.to/neothone/directory-structure-of-a-php-symfony-project-26m</link>
      <guid>https://dev.to/neothone/directory-structure-of-a-php-symfony-project-26m</guid>
      <description>&lt;p&gt;The &lt;code&gt;src&lt;/code&gt; folder of a Symfony project contains your business classes and forms the heart of your application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://symfony.com/doc/current/best_practices.html#use-the-default-directory-structure" rel="noopener noreferrer"&gt;Symfony Best Practices&lt;/a&gt; recommends a structure for this &lt;code&gt;src/&lt;/code&gt; folder and a few subfolders. &lt;/p&gt;

&lt;p&gt;Here I offer you the results of recent years and PHP projects carried out with the Symfony framework: this is a tree structure that I was able to find in the &lt;code&gt;src&lt;/code&gt; folders.&lt;/p&gt;

&lt;p&gt;The list is not here to set things in stone and is not official.&lt;/p&gt;

&lt;p&gt;The purpose of this list is to create a reference for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;defining what types of classes and services should be found in each namespace corresponding to a subfolder of the src folder&lt;/li&gt;
&lt;li&gt;"finding inspiration" when you don't have a design pattern that spontaneously comes to mind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some come from the Symfony documentation or its best practices, others from entirely personal habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  A
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adapter: A service that converts one object into another (see Transformer if it's data and not an object)&lt;/li&gt;
&lt;li&gt;Aggregator: A service that gathers data from different sources&lt;/li&gt;
&lt;li&gt;ApiResource: A folder created by API Platform that contains the models used to build APIs "automatically" with API Platform and that are not Doctrine entities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  B
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Builder: A service that constructs a service with its required elements or default values ​​(see Factory for building objects)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  C
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Client: A service that allows you to connect to a third-party service (an API, a web service, etc.)&lt;/li&gt;
&lt;li&gt;Command: A service that executes scripts/command-line processes&lt;/li&gt;
&lt;li&gt;Controller: A service that handles an HTTP request and provides an HTTP response&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  D
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DataFixtures: A folder created by the Doctrine Fixtures bundle in which you create your "Entity1Fixture", "Entity2Fixture", etc. classes&lt;/li&gt;
&lt;li&gt;DataManager: A service that organizes, sorts, filters, and/or enriches data from from a third-party source (similar to the concept of DAO)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  E
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enricher: Service that enriches data or an object with data from another source&lt;/li&gt;
&lt;li&gt;Entity: Doctrine object that makes up the data model&lt;/li&gt;
&lt;li&gt;EnvProcessor: Contains classes that define custom Environment Variable Processors&lt;/li&gt;
&lt;li&gt;EventListener: Service that sets up processes to be executed when a listened event is triggered&lt;/li&gt;
&lt;li&gt;EventSubscriber: Service that sets up processes to be executed when an event to which it subscribes is triggered&lt;/li&gt;
&lt;li&gt;Exception&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  F
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Factory: Service that constructs objects with required and/or default values ​​(quite similar to Builder for services)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  G
&lt;/h2&gt;

&lt;h2&gt;
  
  
  H
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Handler: Service that orchestrates business logic, organizes, sorts, and filters objects/entities (like a "manager")&lt;/li&gt;
&lt;li&gt;Helper: Service that provides useful "all over the place" and simple (often static) functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IndexManager: Service that organizes, sorts, filters, and enriches documents from an index Elasticsearch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  J
&lt;/h2&gt;

&lt;h2&gt;
  
  
  K
&lt;/h2&gt;

&lt;h2&gt;
  
  
  L
&lt;/h2&gt;

&lt;h2&gt;
  
  
  M
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Message: Data structure that forms an envelope for transmitting information in message queues&lt;/li&gt;
&lt;li&gt;MessageHandler: Service that organizes the business logic associated with message reception&lt;/li&gt;
&lt;li&gt;Model: Business Objects (DAO)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  N
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Naming: this directory can contain the Namer class for your custom file namer (see also &lt;a href="https://github.com/dustin10/VichUploaderBundle/blob/master/docs/file_namer/howto/create_a_custom_file_namer.md" rel="noopener noreferrer"&gt;https://github.com/dustin10/VichUploaderBundle/blob/master/docs/file_namer/howto/create_a_custom_file_namer.md&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O
&lt;/h2&gt;

&lt;h2&gt;
  
  
  P
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Paginator: Service that allows you to set up pagination&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Q
&lt;/h2&gt;

&lt;h2&gt;
  
  
  R
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repository: Service associated with Doctrine entities and that contains DQL or SQL queries, or dynamic query constructions (using query builders, for example) and that allows you to retrieve objects or arrays of objects that respond to these queries (these services do not contain business logic, which should instead be found in the "Handlers")&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  S
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Security: This folder contains services specific to and related to the Symfony Security component (e.g., Authenticator, Provider, etc.)&lt;/li&gt;
&lt;li&gt;Serializer: Service that serializes or deserializes data objects&lt;/li&gt;
&lt;li&gt;Service: Since Symfony 2 this folder was often used to store everything that wasn't a controller or repository, but it's imprecise. On large projects, it became a catch-all and dense resource. I'm trying as hard as possible to stop using it and eliminate it in favor of all the others mentioned in this article.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  T
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Transformer: service that converts data of a certain type into another type&lt;/li&gt;
&lt;li&gt;Twig: custom Twig extensions (filters or functions)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  U
&lt;/h2&gt;

&lt;h2&gt;
  
  
  V
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Validator: service that checks validation rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  W
&lt;/h2&gt;

&lt;h2&gt;
  
  
  X
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Y
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Z
&lt;/h2&gt;

&lt;p&gt;Today, I also tend to add "business" sub-namespaces to each of these namespaces. For example, &lt;code&gt;src/Entity/User/&lt;/code&gt; can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;src/Entity/User/User.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/Group.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/Role.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/RequestPassword.php&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This avoids having a tree structure with folders that require endless scrolling...&lt;/p&gt;




&lt;p&gt;Help me keep this topic moving forward and alive!&lt;/p&gt;

&lt;p&gt;I'm wondering if it's structured more or less the same way with Laravel?&lt;/p&gt;




&lt;p&gt;This post is a translation of a first post in French, available here: &lt;a href="https://dev.to/neothone/arborescence-dun-projet-php-symfony-34go"&gt;https://dev.to/neothone/arborescence-dun-projet-php-symfony-34go&lt;/a&gt;&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>webdev</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>AssociationField with entity parameter in QueryBuilder</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Mon, 17 Mar 2025 11:20:14 +0000</pubDate>
      <link>https://dev.to/neothone/associationfield-with-entity-parameter-in-querybuilder-4i2</link>
      <guid>https://dev.to/neothone/associationfield-with-entity-parameter-in-querybuilder-4i2</guid>
      <description>&lt;p&gt;If you need to restrict the results displayed in an AssociationField in Easyadmin with a condition on the current entity which you are editing, you can do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductCrud&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbstractCrudController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;ProductRepository&lt;/span&gt; &lt;span class="nv"&gt;$productRepository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;RequestStack&lt;/span&gt; &lt;span class="nv"&gt;$requestStack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getEntityFqcn&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Product&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * @return iterable&amp;lt;FieldInterface&amp;gt;
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;configureFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$pageName&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;iterable&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$entityId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;requestStack&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getCurrentRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'entityId'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$currentProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nv"&gt;$entityId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$currentProduct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;productRepository&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$entityId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nc"&gt;AssociationField&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'defaultPrice'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setQueryBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;QueryBuilder&lt;/span&gt; &lt;span class="nv"&gt;$queryBuilder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$queryBuilder&lt;/span&gt;
                        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;andWhere&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'entity.product = :product'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$currentProduct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, I want only displayed prices link to the current product (ManyToOne relation defaultPrice on Product, ManyToOne relation product on Price, OneToMany relation prices on Product). &lt;/p&gt;

&lt;p&gt;This is a solution for this issues :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/EasyCorp/EasyAdminBundle/issues/1145" rel="noopener noreferrer"&gt;https://github.com/EasyCorp/EasyAdminBundle/issues/1145&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/EasyCorp/EasyAdminBundle/issues/1255" rel="noopener noreferrer"&gt;https://github.com/EasyCorp/EasyAdminBundle/issues/1255&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/EasyCorp/EasyAdminBundle/issues/5081" rel="noopener noreferrer"&gt;https://github.com/EasyCorp/EasyAdminBundle/issues/5081&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>symfony</category>
      <category>easyadmin</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Arborescence d’un projet PHP Symfony</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Sun, 16 Mar 2025 09:17:08 +0000</pubDate>
      <link>https://dev.to/neothone/arborescence-dun-projet-php-symfony-34go</link>
      <guid>https://dev.to/neothone/arborescence-dun-projet-php-symfony-34go</guid>
      <description>&lt;p&gt;Le dossier &lt;code&gt;src&lt;/code&gt; d’un projet Symfony contient vos classes métiers et compose le coeur de votre application.&lt;/p&gt;

&lt;p&gt;Les &lt;a href="https://symfony.com/doc/current/best_practices.html#use-the-default-directory-structure" rel="noopener noreferrer"&gt;Best Practices de Symfony&lt;/a&gt; préconise une structure de base avec ce dossier &lt;code&gt;src/&lt;/code&gt; et quelques sous-dossiers. &lt;/p&gt;

&lt;p&gt;Je vous propose ici le fruit de ces dernières années et des projets PHP réalisés avec le framework Symfony : il s’agit d’une arborescence des dossiers que j'ai pu trouvé dans les dossiers &lt;code&gt;src&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cette liste n’est pas là pour figer les choses et n’a rien d’officielle. &lt;/p&gt;

&lt;p&gt;Le but de cette liste est de faire un référentiel pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;définir quels types de classe et services nous devrions trouvés dans chaque namespace correspondant à un sous-dossier du dossier &lt;code&gt;src&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;“trouver l’inspiration” quand vous n’avez pas de modèle de conception qui vous vienne spontanément à l’esprit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certains proviennent de la documentation Symfony ou de ses best-practices, d’autres d’habitudes tout à fait personnelles.&lt;/p&gt;

&lt;h2&gt;
  
  
  A
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adapter : service qui converti un objet en un autre (c.f. Transformer s’il s’agit de donnée et non d’objet)&lt;/li&gt;
&lt;li&gt;Aggregator : service qui rassemble de la donnée depuis différentes sources&lt;/li&gt;
&lt;li&gt;ApiResource : dossier créé par API Platform qui vise à contenir les modèles utilisés pour construire des APIs “automatiquement” avec API Platform et qui ne sont pas des entités Doctrine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  B
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Builder : service qui construit un service avec ses éléments requis ou des valeurs par défaut (c.f. Factory pour construire des objets)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  C
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Client : service qui permet de se connecter à un service tiers (une API, un webservice…)&lt;/li&gt;
&lt;li&gt;Command : service qui exécute des scripts / des processus en ligne de commande&lt;/li&gt;
&lt;li&gt;Controller : service qui prend en charge une requête HTTP et fourni une réponse HTTP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  D
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DataFixtures : dossier créé par le bundle Doctrine Fixtures dans lequel on vient créer ses classes “Entity1Fixture”, “Entity2Fixture” etc…&lt;/li&gt;
&lt;li&gt;DataManager : service qui organise, tri, filtre et/ou enrichi des données provenant d’une source tierce (similaire à la notion de DAO)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  E
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enricher : service qui enrichi une donnée ou un objet avec la donnée d’une autre source&lt;/li&gt;
&lt;li&gt;Entity : objet Doctrine composant le modèle de données&lt;/li&gt;
&lt;li&gt;EnvProcessor : contient les classes qui définissent des Environment Variable Processor custom&lt;/li&gt;
&lt;li&gt;EventListener : service qui met en place les processus à exécuter quand un événement écouté est déclenché&lt;/li&gt;
&lt;li&gt;EventSubscriber : service qui met en place les processsus à exécuter quand un évènement auquel il souscrit se déclenche&lt;/li&gt;
&lt;li&gt;Exception&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  F
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Factory : service qui construit des objets avec les requis et/ou les valeurs par défaut (assez similaire à Builder pour les services)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  G
&lt;/h2&gt;

&lt;h2&gt;
  
  
  H
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Handler : service qui orchestre une logique métier, organise, tri, filtre des objets/entités (en français : “gestionnaire”)&lt;/li&gt;
&lt;li&gt;Helper : service qui fournie des fonctions utiles “un peu partout” et simples (souvent static)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IndexManager : service qui organise, tri, filtre et enrichi des documents provenant d’un index Elasticsearch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  J
&lt;/h2&gt;

&lt;h2&gt;
  
  
  K
&lt;/h2&gt;

&lt;h2&gt;
  
  
  L
&lt;/h2&gt;

&lt;h2&gt;
  
  
  M
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Message : structure de données qui permet de former une enveloppe pour faire des transiter des informations dans des files de messages&lt;/li&gt;
&lt;li&gt;MessageHandler : service qui organise la logique métier associé à la réception de message&lt;/li&gt;
&lt;li&gt;Model : objets métiers (DAO)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  N
&lt;/h2&gt;

&lt;h2&gt;
  
  
  O
&lt;/h2&gt;

&lt;h2&gt;
  
  
  P
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Paginator : service qui permet de mettre en place une pagination&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Q
&lt;/h2&gt;

&lt;h2&gt;
  
  
  R
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repository : service associé aux entités Doctrine et qui contient des requêtes DQL ou SQL, ou des constructions dynamiques de requêtes (grâce aux “query builder” par exemple) et qui permet de récupérer les objets ou les tableaux d’objets répondant à ces requêtes (ces services ne contiennent pas de logique métier, qui doit plutôt être retrouvé dans les “Handlers”)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  S
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Security : ce dossier contient les services spécifiques et relatifs au composant Security de symfony (ex: Authenticator, Provider…)&lt;/li&gt;
&lt;li&gt;Serializer : service qui procède à la sérialisation ou la dé-sérialisation d’objets données&lt;/li&gt;
&lt;li&gt;Service : ce dossier était beaucoup utilisé depuis l’apparition de Symfony 2 pour y mettre tout ce qui n’était pas un contrôleur ou un repository, mais il est imprécis. Sur les projets importants il devenait “fourre-tout” et dense. J’essaie au maximum de ne plus l’utiliser et de le faire disparaître au profit de tous les autres cités dans cet article&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  T
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Transformer : service qui converti une donnée d’un certain type dans un autre type&lt;/li&gt;
&lt;li&gt;Twig : extensions twig personnalisés (filters ou functions)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  U
&lt;/h2&gt;

&lt;h2&gt;
  
  
  V
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Validator : service qui contrôle des règles de validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  W
&lt;/h2&gt;

&lt;h2&gt;
  
  
  X
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Y
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Z
&lt;/h2&gt;




&lt;p&gt;Aujourd'hui je tend aussi à ajouter dans chacun de ces namespaces des sous-namespaces "métiers". Par exemple &lt;code&gt;src/Entity/User/&lt;/code&gt; peut contenir :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;src/Entity/User/User.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/Group.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/Role.php&lt;/li&gt;
&lt;li&gt;src/Entity/User/RequestPassword.php&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ceci permet d'éviter d'avoir une arborescence avec des dossiers dans lesquels il faut scroller vers l'infini et l'au delà...&lt;/p&gt;




&lt;p&gt;Aidez moi à faire évoluer et vivre ce sujet !&lt;/p&gt;

&lt;p&gt;Je me demande d'ailleurs si avec Laravel c'est plus ou moins structuré de la même manière ?&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>webdev</category>
      <category>php</category>
      <category>laravel</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Wed, 12 Mar 2025 22:22:02 +0000</pubDate>
      <link>https://dev.to/neothone/-205h</link>
      <guid>https://dev.to/neothone/-205h</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/robertobutti" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F243922%2F13c0045e-6656-4f74-aa57-3f9f39716be5.jpeg" alt="robertobutti"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/robertobutti/add-test-coverage-badge-for-php-and-pest-in-your-github-repository-37mo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Add test coverage badge for PHP and Pest in your GitHub repository&lt;/h2&gt;
      &lt;h3&gt;Roberto B. ・ Dec 20 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#php&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#testing&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#codequality&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>php</category>
      <category>github</category>
      <category>testing</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Recent vulnerabilities in eslint impact my Symfony projects with ux-vue</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Thu, 27 Feb 2025 20:00:52 +0000</pubDate>
      <link>https://dev.to/neothone/recent-vulnerabilities-in-eslint-impact-my-symfony-projects-with-ux-vue-4g17</link>
      <guid>https://dev.to/neothone/recent-vulnerabilities-in-eslint-impact-my-symfony-projects-with-ux-vue-4g17</guid>
      <description>&lt;p&gt;Since a few days, I saw in my npm command the warning "3 moderate severity vulnerabilities".&lt;/p&gt;

&lt;p&gt;I tried to execute &lt;code&gt;npm audit fix --force&lt;/code&gt; but the warning is always here...&lt;/p&gt;

&lt;p&gt;In fact, it's a library load by composer, not a library load by npm! I saw this important warn: &lt;code&gt;Manual fix required in linked project at ./vendor/symfony/ux-vue/assets for @vitejs/plugin-vue@1.8.0 - 5.2.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;So, I tried with &lt;code&gt;cd ./vendor/symfony/ux-vue/assets&lt;/code&gt; and run &lt;code&gt;npm install &amp;amp;&amp;amp; npm audit fix --force&lt;/code&gt; and the warning became &lt;code&gt;**2** moderate severity vulnerabilities&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally, I returned to the root of my project with &lt;code&gt;cd ../../../../&lt;/code&gt; and I executed a &lt;code&gt;npm audit fix&lt;/code&gt; that it fixed the last 2 vulnerabilities and update the package-lock.json file.&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>eslint</category>
      <category>npm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Editor.js in Symfony EasyAdmin</title>
      <dc:creator>neothone</dc:creator>
      <pubDate>Wed, 26 Feb 2025 20:27:45 +0000</pubDate>
      <link>https://dev.to/neothone/editorjs-in-symfony-easyadmin-40ao</link>
      <guid>https://dev.to/neothone/editorjs-in-symfony-easyadmin-40ao</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/neothone/editorjs-ou-une-belle-alternative-aux-editeurs-wysiwyg-traditionnel-2lcn"&gt;Yesterday&lt;/a&gt;, I spoke about &lt;a href="https://editorjs.io" rel="noopener noreferrer"&gt;Editor.js&lt;/a&gt;. Today, I purpose an implementation for Symfony with &lt;a href="https://github.com/EasyCorp/EasyAdminBundle" rel="noopener noreferrer"&gt;EasyAdmin&lt;/a&gt; for a properties of type &lt;code&gt;json&lt;/code&gt; on a Doctrine entity.&lt;/p&gt;

&lt;p&gt;If you think to an improvement, don't hesitate to comment!&lt;/p&gt;

&lt;p&gt;First, create new Field (it's specific for EasyAdmin):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;# src/admin/Field/Editorjs.php
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Admin\Field&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Form\Type\EditorjsType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Editorjs&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FieldInterface&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;FieldTrait&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$propertyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="nv"&gt;$label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;self&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$propertyName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setLabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setFormType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;EditorjsType&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;// required also the easyadmin entry in webpack.config.js&lt;/span&gt;
        &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the form type EditorJsType mentioned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;# src/Form/Type/EditorjsType.php
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strict_types&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Form\Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Form\AbstractType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Form\CallbackTransformer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Form\Extension\Core\Type\TextType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Symfony\Component\Form\FormBuilderInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EditorjsType&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbstractType&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;buildForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;FormBuilderInterface&lt;/span&gt; &lt;span class="nv"&gt;$builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$builder&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addModelTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CallbackTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// transform the array to a json string&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// transform the json string to a php array&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getParent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;TextType&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In order to have specific js and css load in EasyAdmin context, I create a specific entry in webpack.config.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// webpack.config.js&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="nx"&gt;Encore&lt;/span&gt;
   &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;easyadmin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/easyadmin.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, create the easyadmin.js file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./styles/easyadmin.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;EditorJS&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/editorjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Quote&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/quote&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;RawTool&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SimpleImage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@editorjs/simple-image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;EditorjsList&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Embed&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/embed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Paragraph&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/paragraph&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/table&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CodeTool&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Underline&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/underline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Delimiter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/delimiter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InlineCode&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@editorjs/inline-code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;editorjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fieldId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EditorJS&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;shortcut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CMD+SHIFT+H&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;defaultLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inlineToolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;shortcut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CMD+SHIFT+O&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RawTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SimpleImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EditorjsList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inlineToolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;defaultStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unordered&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Embed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;paragraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Paragraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inlineToolbar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CodeTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;underline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Underline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;delimiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Delimiter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;inlineCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;InlineCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;shortcut&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CMD+SHIFT+M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;onReady&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;outputData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outputData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the easyadmin.css file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Editor.js customization */&lt;/span&gt;
&lt;span class="nc"&gt;.editorjs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--form-control-bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;background-repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;no-repeat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--form-input-border-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bs-border-radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--form-input-shadow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--form-input-text-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;box-shadow&lt;/span&gt; &lt;span class="m"&gt;.08s&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="m"&gt;.08s&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;word-break&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;keep-all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="err"&gt;.codex-editor__redactor&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;.ce-inline-toolbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;.ce-popover__container,&lt;/span&gt; &lt;span class="err"&gt;.ce-popover__items&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;overflow-y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Dark mode */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* Editor.js customization */&lt;/span&gt;
    &lt;span class="nc"&gt;.editorjs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="err"&gt;.codex-editor__redactor&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
            &lt;span class="err"&gt;.ce-block__content&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
                &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nc"&gt;.ce-toolbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="err"&gt;.ce-toolbar__plus,&lt;/span&gt; &lt;span class="err"&gt;.ce-toolbar__settings-btn&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
                &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text-color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="err"&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
                    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1d202b&lt;/span&gt;&lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="err"&gt;}&lt;/span&gt;
        &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this npm install command:&lt;br&gt;
&lt;code&gt;npm install @editorjs/editorjs @editorjs/header @editorjs/quote @editorjs/raw @editorjs/simple-image  @editorjs/list @editorjs/embed @editorjs/paragraph @editorjs/table @editorjs/code @editorjs/underline @editorjs/delimiter @editorjs/inline-code&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Configure EasyAdmin for use the new Webpack entry and a custom form template, in Dashboard Controller, add this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;# src/Controller/Admin/Dashboard.php&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;configureCrud&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Crud&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Crud&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setFormThemes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'form/custom_types.html.twig'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'@EasyAdmin/crud/form_theme.html.twig'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;configureAssets&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Assets&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Assets&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addWebpackEncoreEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'easyadmin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the custom form template file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="c"&gt;{# templates/form/custom_types.html.twig #}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;editorjs_row&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;ea_crud_form.ea_field.columns&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;form_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;form&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"editorjs"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"editorjs"&lt;/span&gt; &lt;span class="na"&gt;data-field-id=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;full_name&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;form_errors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;form&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex-fill"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can use new Field type in a crud controller :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="mf"&gt;...&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Admin\Field\Editorjs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="mf"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;configureFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$pageName&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;iterable&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="mf"&gt;...&lt;/span&gt;
            &lt;span class="nc"&gt;Editorjs&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// content is a json (array) properties of a doctrine entity&lt;/span&gt;
                &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hideOnIndex&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="mf"&gt;...&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>symfony</category>
      <category>easyadmin</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
