<?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: Yoichi Dan</title>
    <description>The latest articles on DEV Community by Yoichi Dan (@dany1468).</description>
    <link>https://dev.to/dany1468</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%2F649640%2Fc4ded460-b6b3-43cf-a42b-5c4651d20ba3.png</url>
      <title>DEV Community: Yoichi Dan</title>
      <link>https://dev.to/dany1468</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dany1468"/>
    <language>en</language>
    <item>
      <title>mautic の plugin の reload 処理をみる 02</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Sat, 07 Aug 2021 23:26:27 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-plugin-reload-02-46g3</link>
      <guid>https://dev.to/dany1468/mautic-plugin-reload-02-46g3</guid>
      <description>&lt;h2&gt;
  
  
  ReloadFacade#reloadPlugins
&lt;/h2&gt;

&lt;p&gt;reload の実態となるメソッドを見ていきます。&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;reloadPlugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$plugins&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAllPluginsConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$pluginMetadata&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPlugins&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getInstalledPlugins&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPluginTables&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getInstalledPluginTables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPluginsSchemas&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;createPluginSchemas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$installedPluginTables&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$disabledPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;disableMissingPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$enabledPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enableFoundPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$updatedPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;updatePlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;installPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$persist&lt;/span&gt;                 &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$disabledPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$enabledPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$updatedPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&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="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persist&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;saveEntities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persist&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;h3&gt;
  
  
  PluginModel
&lt;/h3&gt;

&lt;p&gt;以降では内部を理解するために細かく実行しているが、 &lt;code&gt;PluginModel&lt;/code&gt; 自体をpsysh で取得しておけば自由に試せる。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$container&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;'mautic.plugin.model.plugin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  pluginModel-&amp;gt;getAllPluginsConfig();
&lt;/h3&gt;

&lt;p&gt;ここは内部的には &lt;code&gt;BundleHelper&lt;/code&gt; を見ているため、一つ前の記事で見た通りで &lt;code&gt;%mautic.plugin.bundles%&lt;/code&gt; のパラメータを参照している。&lt;/p&gt;

&lt;h3&gt;
  
  
  pluginModel-&amp;gt;getPluginsMetadata()
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PluginModel&lt;/code&gt; は以下のようになっている。&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$allMetadata&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;em&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMetadataFactory&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;getAllMetadata&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$pluginsMetadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$allMetadata&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$namespace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;namespace&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;false&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nb"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$namespace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'MauticPlugin'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$bundleName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;preg_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/\\\Entity$/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$namespace&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="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$pluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nv"&gt;$pluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$meta&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;return&lt;/span&gt; &lt;span class="nv"&gt;$pluginsMetadata&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;最初に取得している &lt;code&gt;Metadata&lt;/code&gt; は以下で psysh で取得できる。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$em&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$container&lt;/span&gt;-&amp;gt;get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'doctrine'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;-&amp;gt;getManager&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$em&lt;/span&gt;-&amp;gt;getMetadataFactory&lt;span class="o"&gt;()&lt;/span&gt;-&amp;gt;getAllMetadata&lt;span class="o"&gt;()&lt;/span&gt;
   &lt;span class="o"&gt;[&lt;/span&gt;
     Doctrine&lt;span class="se"&gt;\O&lt;/span&gt;RM&lt;span class="se"&gt;\M&lt;/span&gt;apping&lt;span class="se"&gt;\C&lt;/span&gt;lassMetadata &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#5392&lt;/span&gt;
       +name: &lt;span class="s2"&gt;"Mautic&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;luginBundle&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;ntity&lt;/span&gt;&lt;span class="se"&gt;\I&lt;/span&gt;&lt;span class="s2"&gt;ntegrationEntity"&lt;/span&gt;,
       +namespace: &lt;span class="s2"&gt;"Mautic&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;luginBundle&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;ntity"&lt;/span&gt;,
       +rootEntityName: &lt;span class="s2"&gt;"Mautic&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;luginBundle&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;ntity&lt;/span&gt;&lt;span class="se"&gt;\I&lt;/span&gt;&lt;span class="s2"&gt;ntegrationEntity"&lt;/span&gt;,
       +customGeneratorDefinition: null,
       +customRepositoryClassName: &lt;span class="s2"&gt;"Mautic&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;luginBundle&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;&lt;span class="s2"&gt;ntity&lt;/span&gt;&lt;span class="se"&gt;\I&lt;/span&gt;&lt;span class="s2"&gt;ntegrationEntityRepository"&lt;/span&gt;,
       +isMappedSuperclass: &lt;span class="nb"&gt;false&lt;/span&gt;,
       +isEmbeddedClass: &lt;span class="nb"&gt;false&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上記の通りで、&lt;code&gt;Doctrine\ORM\Mapping\ClassMetadata&lt;/code&gt; の一覧が大量に取得できる。（ &lt;code&gt;count&lt;/code&gt; したら 101 ありました）&lt;/p&gt;

&lt;p&gt;取得した Metadata から namespace に &lt;code&gt;MauticPlugin&lt;/code&gt; が入っているものだけを取得し、末尾の &lt;code&gt;\Entity&lt;/code&gt; を除外したものを集めている。&lt;/p&gt;

&lt;h3&gt;
  
  
  pluginModel-&amp;gt;getInstalledPlugins()
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PluginModel&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormModel&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;getInstalledPlugins&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getEntities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'bundle'&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;getRepository&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MauticPluginBundle:Plugin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// FormModel の親クラスが AbstractCommonModel&lt;/span&gt;
&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AbstractCommonModel&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;getEntities&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;$args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//set the translator&lt;/span&gt;
        &lt;span class="nv"&gt;$repo&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="nf"&gt;getRepository&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="nv"&gt;$repo&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;CommonRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$repo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setTranslator&lt;/span&gt;&lt;span class="p"&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;translator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$repo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setCurrentUser&lt;/span&gt;&lt;span class="p"&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;userHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$repo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getEntities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$args&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;getEntities&lt;/code&gt; 内で呼ばれる &lt;code&gt;getRepository&lt;/code&gt; は &lt;code&gt;PluginModel#getRepository&lt;/code&gt; なので、 &lt;code&gt;PluginBundle\Entity\PluginRepository&lt;/code&gt; が使われる。これは &lt;code&gt;CommonRepository&lt;/code&gt; を継承しているので、&lt;code&gt;instanceof&lt;/code&gt; も問題ない。&lt;/p&gt;

&lt;p&gt;実行すると以下のように取得できる。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$em&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MauticPluginBundle:Plugin'&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;getEntities&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'bundle'&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="s2"&gt;"MauticCitrixBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4605},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticClearbitBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4653},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticCloudStorageBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4634},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticCrmBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4662},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticEmailMarketingBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4657},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticFullContactBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4603},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticGmailBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4593},&lt;/span&gt;
     &lt;span class="s2"&gt;"GrapesJsBuilderBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4621},&lt;/span&gt;
     &lt;span class="s2"&gt;"HelloWorldBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4573},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticFocusBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4613},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticTagManagerBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4616},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticOutlookBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4665},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticSocialBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4681},&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticZapierBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Entity\Plugin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#4678},&lt;/span&gt;
   &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  getAllPluginsConfig と getInstalledPlugins
&lt;/h4&gt;

&lt;p&gt;名前の通りではあるが、&lt;code&gt;getAllPluginsConfig&lt;/code&gt; はあくまで設定情報として取得しているものであって、実際に mautic にインストールされているかは分からないものも含まれている。&lt;/p&gt;

&lt;p&gt;逆に &lt;code&gt;getInstalledPlugins&lt;/code&gt; はインストールされているかを DB から抽出している。&lt;/p&gt;

&lt;h3&gt;
  
  
  pluginModel-&amp;gt;getInstalledPluginTables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getInstalledPluginTables&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;$pluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$currentSchema&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;em&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getConnection&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;getSchemaManager&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;createSchema&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPluginsTables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginsMetadata&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$bundleName&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getTableName&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="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$installedPluginsTables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$installedPluginsTables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$currentSchema&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hasTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nv"&gt;$installedPluginsTables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;][]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$currentSchema&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$table&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;return&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginsTables&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;&lt;code&gt;$pluginsMetadata&lt;/code&gt; はすでに取得しているが、一つ例をあげておくと以下のようになる。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;array_key_first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle"&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="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Doctrine\ORM\Mapping\ClassMetadata&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#5750&lt;/span&gt;
       &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;array_key_first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Doctrine\ORM\Mapping\ClassMetadata&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#5658&lt;/span&gt;
     &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;rootEntityName&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"MauticPlugin\HelloWorldBundle\Entity\World"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mf"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getTableName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"hello_world"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;後は &lt;code&gt;$currentSchema&lt;/code&gt; に入っている情報と突き合わせて、テーブル情報を収集している。&lt;/p&gt;

&lt;p&gt;インストール直後とかだとそれほど数は多くない。 (HelloWorldBundle は追加で入れているもの）&lt;br&gt;
テーブルを複数使っているプラグインがあることも分かる。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginTables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getInstalledPluginTables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginMetadata&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="s2"&gt;"MauticPlugin\HelloWorldBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#11257},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\MauticTagManagerBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#11724},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\MauticCitrixBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#12562},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\MauticSocialBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#12089},&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#12032},&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#13314},&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#13260},&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#12066},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\MauticCrmBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#12576},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\GrapesJsBuilderBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#6726},&lt;/span&gt;
     &lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;"MauticPlugin\MauticFocusBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#11069},&lt;/span&gt;
       &lt;span class="nc"&gt;Doctrine\DBAL\Schema\Table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c1"&gt;#11101},&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;h3&gt;
  
  
  pluginModel-&amp;gt;createPluginSchemas
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PluginModel&lt;/code&gt; はこれが最後。&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;createPluginSchemas&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;$installedPluginsTables&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$installedPluginsTables&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$bundleName&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$tables&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$bundleName&lt;/span&gt;&lt;span class="p"&gt;]&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;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tables&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="nv"&gt;$installedPluginsSchemas&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;メソッド名が &lt;code&gt;create&lt;/code&gt; になっているが、このメソッドで DB にデータを作成する訳ではない。&lt;br&gt;
単純に &lt;code&gt;$installedPluginsTables&lt;/code&gt; のマッピングを変えているだけで値を &lt;code&gt;Schema&lt;/code&gt; のオブジェクトに変更している。&lt;/p&gt;

&lt;p&gt;ここまでで &lt;code&gt;PluginModel&lt;/code&gt; を使ったプラグイン情報の収集部分を見た。&lt;br&gt;
次回は &lt;code&gt;ReloadHelper&lt;/code&gt; でのプラグインの更新処理を確認していく。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>mautic の plugin の reload 処理をみる 01</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Thu, 08 Jul 2021 23:08:15 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-plugin-reload-01-5ee4</link>
      <guid>https://dev.to/dany1468/mautic-plugin-reload-01-5ee4</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pGiKSx6q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrca3xy3trkuxpajkla2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pGiKSx6q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrca3xy3trkuxpajkla2.png" alt="2021-07-09_07h08_18"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;まず、上記の処理を追っていく。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&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;"std-toolbar btn-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;data-toggle=&lt;/span&gt;&lt;span class="s"&gt;"ajax"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/s/plugins/reload"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-default"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt;
            &lt;span class="na"&gt;data-toggle=&lt;/span&gt;&lt;span class="s"&gt;"tooltip"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;data-placement=&lt;/span&gt;&lt;span class="s"&gt;"left"&lt;/span&gt;
            &lt;span class="na"&gt;data-original-title=&lt;/span&gt;&lt;span class="s"&gt;"Upload the plugin via FTP or some other protocol to the plugins directory then click this button to install/upgrade."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fa fa-cubes"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hidden-xs hidden-sm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install/Upgrade Plugins&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ブラウザの開発者ツールを見ると上記のようになっていた。 &lt;code&gt;/s/plugins/reload&lt;/code&gt; が紐付けられているため、このボタンの機能は plugin の reload 機能だと推測できる。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app/bundles/PluginBundle/Config/config.php&lt;/code&gt; の routes 定義にも以下が存在した。&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="s1"&gt;'mautic_plugin_reload'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'path'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'/plugins/reload'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'controller'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'MauticPluginBundle:Plugin:reload'&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;&lt;code&gt;reload&lt;/code&gt; のアクションはそれほど大きくない。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/PluginBundle/Controller/PluginController.php#L418-L444"&gt;https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/PluginBundle/Controller/PluginController.php#L418-L444&lt;/a&gt;&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="cd"&gt;/**
* Scans the addon bundles directly and loads bundles which are not registered to the database.
*
* @return JsonResponse
*/&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;reloadAction&lt;/span&gt;&lt;span class="p"&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="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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mautic.security'&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;isGranted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'plugin:plugins:manage'&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;accessDenied&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&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="nf"&gt;addFlash&lt;/span&gt;&lt;span class="p"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mautic.plugin.facade.reload'&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;reloadPlugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;

   &lt;span class="nv"&gt;$viewParameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="s1"&gt;'page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'session'&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mautic.plugin.page'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
   &lt;span class="p"&gt;];&lt;/span&gt;

   &lt;span class="c1"&gt;// Refresh the index contents&lt;/span&gt;
   &lt;span class="k"&gt;return&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="nf"&gt;postActionRedirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="p"&gt;[&lt;/span&gt;
           &lt;span class="n"&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;h3&gt;
  
  
  mautic.plugin.facade.reload はなんだろう
&lt;/h3&gt;

&lt;p&gt;DI コンテナから取得しているようなので psysh で確認する&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="nv"&gt;$ &lt;/span&gt;bin/console psysh &lt;span class="nt"&gt;--env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$container&lt;/span&gt;-&amp;gt;get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mautic.plugin.facade.reload'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\F&lt;/span&gt;acade&lt;span class="se"&gt;\R&lt;/span&gt;eloadFacade &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4588}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ReloadFacade.php
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/PluginBundle/Facade/ReloadFacade.php"&gt;https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/PluginBundle/Facade/ReloadFacade.php&lt;/a&gt;&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReloadFacade&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$reloadHelper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$translator&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="kt"&gt;PluginModel&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;ReloadHelper&lt;/span&gt; &lt;span class="nv"&gt;$reloadHelper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;TranslatorInterface&lt;/span&gt; &lt;span class="nv"&gt;$translator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&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;pluginModel&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pluginModel&lt;/span&gt;&lt;span class="p"&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;reloadHelper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$reloadHelper&lt;/span&gt;&lt;span class="p"&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;translator&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$translator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * This method finds all plguins that needs to be enabled, disabled, installed and updated
     * and do all those actions.
     *
     * Returns humanly understandable message about its doings.
     *
     * @return string
     */&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;reloadPlugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$plugins&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAllPluginsConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$pluginMetadata&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPluginsMetadata&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$installedPlugins&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getInstalledPlugins&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$installedPluginTables&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getInstalledPluginTables&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$installedPluginsSchemas&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;createPluginSchemas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$installedPluginTables&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$disabledPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;disableMissingPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$enabledPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enableFoundPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$updatedPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;updatePlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$installedPlugins&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;reloadHelper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;installPlugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pluginMetadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$installedPluginsSchemas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$persist&lt;/span&gt;                 &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$disabledPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$enabledPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$updatedPlugins&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$installedPlugins&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="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persist&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&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;pluginModel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;saveEntities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Alert the user to the number of additions&lt;/span&gt;
        &lt;span class="k"&gt;return&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;translator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;trans&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'mautic.plugin.notice.reloaded'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'%added%'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$installedPlugins&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s1"&gt;'%disabled%'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$disabledPlugins&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s1"&gt;'%updated%'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$updatedPlugins&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'flashes'&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;多くの処理が移譲されているので、このクラス自体は大きくない。&lt;/p&gt;

&lt;p&gt;この処理は、私がやったことがあるユースケースでは、新しくプラグインを追加して、それを読み込むために、 cache を clear してから、このボタンを押すというものだ。&lt;br&gt;
今回はその観点を軸にみていく。&lt;/p&gt;
&lt;h3&gt;
  
  
  PluginModel
&lt;/h3&gt;

&lt;p&gt;まず、&lt;code&gt;PluginModel&lt;/code&gt; の登場が多いのでこれが何かみていく。&lt;br&gt;
&lt;a href="https://developer.mautic.org/#models"&gt;MODELS - Mautic Developer Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記の資料に Models に関する解説があり、簡単には Controller と View の間でのデータ処理を受け持つとなっている。これは、単に MVC の Model と考えていいのだろうか？ まだ Symfony の理解が浅く、Entity との関わり方などが頭で整理できていない。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config.php&lt;/code&gt; を見ると以下の定義がある。&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="s1"&gt;'models'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'mautic.plugin.model.plugin'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'class'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;Mautic\PluginBundle\Model\PluginModel&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="s1"&gt;'arguments'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'mautic.lead.model.field'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mautic.helper.core_parameters'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'mautic.helper.bundle'&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="s1"&gt;'mautic.plugin.model.integration_entity'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'class'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Mautic\PluginBundle\Model\IntegrationEntityModel&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;h3&gt;
  
  
  mautic.helper.bundle / BundleHelper
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PluginModel&lt;/code&gt; の constructor に &lt;code&gt;BundleHelper&lt;/code&gt; が指定されているが、これを見ておく。&lt;/p&gt;

&lt;p&gt;これは &lt;code&gt;app/bundles/CoreBundle/Helper/BundleHelper.php&lt;/code&gt; が実態で &lt;code&gt;CoreBundle&lt;/code&gt; の持ち物になっている。&lt;code&gt;PluginBundle&lt;/code&gt; は別途存在するが、 &lt;code&gt;CoreBundle&lt;/code&gt; はプラグインに関してもその全体を把握しているということのようだ。&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BundleHelper&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$coreBundles&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$pluginBundles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$allBundles&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * BundleHelper constructor.
     */&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="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$coreBundles&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;$pluginBundles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&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;coreBundles&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$coreBundles&lt;/span&gt;&lt;span class="p"&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;pluginBundles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pluginBundles&lt;/span&gt;&lt;span class="p"&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;allBundles&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$coreBundles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pluginBundles&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;では、この constructor の 2 つの引数を確認する。&lt;br&gt;
&lt;code&gt;CoreBundle&lt;/code&gt; の &lt;code&gt;config.php&lt;/code&gt; を確認すると以下のようになっている。&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="s1"&gt;'mautic.helper.bundle'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'class'&lt;/span&gt;     &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Mautic\CoreBundle\Helper\BundleHelper'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'arguments'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'%mautic.bundles%'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'%mautic.plugin.bundles%'&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;内容を調べてみると以下のようになっている。&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="nv"&gt;$ &lt;/span&gt;bin/console debug:container &lt;span class="nt"&gt;--parameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mautic.bundles
 &lt;span class="nt"&gt;----------------&lt;/span&gt; &lt;span class="nt"&gt;-----------------------------------------------------------------&lt;/span&gt;
  Parameter        Value
 &lt;span class="nt"&gt;----------------&lt;/span&gt; &lt;span class="nt"&gt;-----------------------------------------------------------------&lt;/span&gt;
  mautic.bundles   &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"MauticCoreBundle"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"isPlugin"&lt;/span&gt;:false,&lt;span class="s2"&gt;"base"&lt;/span&gt;:&lt;span class="s2"&gt;"Core"&lt;/span&gt;,&lt;span class="s2"&gt;"bundle"&lt;/span&gt;...
 &lt;span class="nt"&gt;----------------&lt;/span&gt; &lt;span class="nt"&gt;-----------------------------------------------------------------&lt;/span&gt;

 &lt;span class="nv"&gt;$ &lt;/span&gt;bin/console debug:container &lt;span class="nt"&gt;--parameter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mautic.plugin.bundles
 &lt;span class="nt"&gt;-----------------------&lt;/span&gt; &lt;span class="nt"&gt;-----------------------------------------------------------------&lt;/span&gt;
  Parameter               Value
 &lt;span class="nt"&gt;-----------------------&lt;/span&gt; &lt;span class="nt"&gt;-----------------------------------------------------------------&lt;/span&gt;
  mautic.plugin.bundles   &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"MauticOutlookBundle"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"isPlugin"&lt;/span&gt;:true,&lt;span class="s2"&gt;"base"&lt;/span&gt;:&lt;span class="s2"&gt;"MauticOutloo...
 ----------------------- -----------------------------------------------------------------
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;psysh で &lt;code&gt;$container-&amp;gt;getParameter('mautic.plugin.bundles')&lt;/code&gt; をすれば、より詳細な情報も得られます。&lt;/p&gt;

&lt;p&gt;このパラメータがセットされる箇所は、軽く検索した感じは &lt;code&gt;app/Config/config.php&lt;/code&gt; の以下しかなかったので、ここで設定されたら使われ続けるよう。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/config/config.php#L28-L29"&gt;https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/config/config.php#L28-L29&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;次は &lt;code&gt;ReloadFacade.php&lt;/code&gt; に戻って、 &lt;code&gt;reloadPlugins()&lt;/code&gt; メソッドから見ていきたいと思います。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>mautic の import 機能を少しみてみる</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Wed, 07 Jul 2021 23:25:05 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-import-47ek</link>
      <guid>https://dev.to/dany1468/mautic-import-47ek</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/commit/93813f25837ec83783078193f9b6a7fb68f714fb"&gt;https://github.com/mautic/mautic/commit/93813f25837ec83783078193f9b6a7fb68f714fb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;commits を眺めていると、上記が入っていたので import 機能についてみてみた。&lt;/p&gt;

&lt;p&gt;上記の commit 自体は以下の PR にある通りで、ざっくりこんな感じ。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;これまで &lt;code&gt;companies&lt;/code&gt; と &lt;code&gt;contacts&lt;/code&gt; の 2 つで利用できていた&lt;/li&gt;
&lt;li&gt;DB Schema 視点でいえば他のデータも対応できるはず&lt;/li&gt;
&lt;li&gt;しかし、いくつかハードコードがあって使えてなかったので変更したよ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/pull/7308"&gt;Import events #7308&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  import 機能
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mautic.ddev.site/s/contacts/import/new"&gt;https://mautic.ddev.site/s/contacts/import/new&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mautic.ddev.site/s/companies/import/new"&gt;https://mautic.ddev.site/s/companies/import/new&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上記の 2 箇所ですね。ただ、 routing の定義としては以下のように &lt;code&gt;{object}&lt;/code&gt; をパラメータに取るようになっているので、固定ではないオブジェクトを受け入れられるようになっているようです。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/LeadBundle/Config/config.php#L110-L117"&gt;https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/LeadBundle/Config/config.php#L110-L117&lt;/a&gt;&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="s1"&gt;'mautic_import_index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'path'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'/{object}/import/{page}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'controller'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'MauticLeadBundle:Import:index'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="s1"&gt;'mautic_import_action'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'path'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'/{object}/import/{objectAction}/{objectId}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'controller'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'MauticLeadBundle:Import:execute'&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;h3&gt;
  
  
  new はどこに受け入れられる？
&lt;/h3&gt;

&lt;p&gt;パッと見では上記の routes 定義では &lt;code&gt;new&lt;/code&gt; 少なくとも &lt;code&gt;mautic_import_index&lt;/code&gt; にはマッチしそうにないです。一応確認します。&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="nv"&gt;$ &lt;/span&gt;php bin/console router:match /s/companies/import/new

 Route &lt;span class="s2"&gt;"mautic_import_index"&lt;/span&gt; almost matches but requirement &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;"page"&lt;/span&gt; does not match &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;


 &lt;span class="o"&gt;[&lt;/span&gt;OK] Route &lt;span class="s2"&gt;"mautic_import_action"&lt;/span&gt; matches


+--------------+-----------------------------------------------------------------------------------------------+
| Property     | Value                                                                                         |
+--------------+-----------------------------------------------------------------------------------------------+
| Route Name   | mautic_import_action                                                                          |
| Path         | /s/&lt;span class="o"&gt;{&lt;/span&gt;object&lt;span class="o"&gt;}&lt;/span&gt;/import/&lt;span class="o"&gt;{&lt;/span&gt;objectAction&lt;span class="o"&gt;}&lt;/span&gt;/&lt;span class="o"&gt;{&lt;/span&gt;objectId&lt;span class="o"&gt;}&lt;/span&gt;                                                  |
| Path Regex   | &lt;span class="c"&gt;#^/s/(?P&amp;lt;object&amp;gt;[^/]++)/import/(?P&amp;lt;objectAction&amp;gt;[^/]++)(?:/(?P&amp;lt;objectId&amp;gt;[a-zA-Z0-9_-]+))?$#sD |&lt;/span&gt;
| Host         | ANY                                                                                           |
| Host Regex   |                                                                                               |
| Scheme       | ANY                                                                                           |
| Method       | ANY                                                                                           |
| Requirements | objectId: &lt;span class="o"&gt;[&lt;/span&gt;a-zA-Z0-9_-]+                                                                      |
| Class        | Symfony&lt;span class="se"&gt;\C&lt;/span&gt;omponent&lt;span class="se"&gt;\R&lt;/span&gt;outing&lt;span class="se"&gt;\R&lt;/span&gt;oute                                                               |
| Defaults     | _controller: Mautic&lt;span class="se"&gt;\L&lt;/span&gt;eadBundle&lt;span class="se"&gt;\C&lt;/span&gt;ontroller&lt;span class="se"&gt;\I&lt;/span&gt;mportController::executeAction                     |
|              | objectId: 0                                                                                   |
| Options      | compiler_class: Symfony&lt;span class="se"&gt;\C&lt;/span&gt;omponent&lt;span class="se"&gt;\R&lt;/span&gt;outing&lt;span class="se"&gt;\R&lt;/span&gt;outeCompiler                                       |
+--------------+-----------------------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://developer.mautic.org/#routes"&gt;https://developer.mautic.org/#routes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;やはりマッチしたのは、 &lt;code&gt;mautic_import_action&lt;/code&gt; の方でした。&lt;/p&gt;

&lt;h3&gt;
  
  
  execute はどこ？
&lt;/h3&gt;

&lt;p&gt;継承関係をたどっていくと以下に行き着きました。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/CoreBundle/Controller/CommonController.php#L455-L462"&gt;https://github.com/mautic/mautic/blob/7d4b436891b8ca84b34d2b0f5856bbff2a721c3a/app/bundles/CoreBundle/Controller/CommonController.php#L455-L462&lt;/a&gt;&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;executeAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$objectAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$objectId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$objectSubId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$objectModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;method_exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$objectAction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;Action"&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$objectAction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;Action"&lt;/span&gt;&lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="nv"&gt;$objectId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$objectModel&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;notFound&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;確かに &lt;code&gt;Mautic\LeadBundle\Controller\ImportController.php&lt;/code&gt; には、 &lt;code&gt;newAction&lt;/code&gt; が存在するため、ここにマッチしていることがわかりました。&lt;/p&gt;

&lt;h2&gt;
  
  
  Event
&lt;/h2&gt;

&lt;p&gt;PR を見ていて、特に大きな変更になったのは処理を Event に移譲していた部分ではないかと思います。&lt;/p&gt;

&lt;p&gt;Event 部分の知識が全然なので順を追ってみていきたいと思います。&lt;/p&gt;

&lt;h3&gt;
  
  
  LeadEvents 定数
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/commit/93813f25837ec83783078193f9b6a7fb68f714fb#diff-838ce9c2377d106faf00bf4c65aee930f4c1bf56c0389046c5296cbe214c117eR371-R399"&gt;https://github.com/mautic/mautic/commit/93813f25837ec83783078193f9b6a7fb68f714fb#diff-838ce9c2377d106faf00bf4c65aee930f4c1bf56c0389046c5296cbe214c117eR371-R399&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PR 内で 3 つの &lt;code&gt;LeadEvents&lt;/code&gt; 定数が新たに定義されています。これが Event の key になるものだと思います。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://symfony.com/doc/4.4/event_dispatcher.html#debugging-event-listeners"&gt;Debugging Event Listeners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記のドキュメントから、特定の Event に対する Listeners を取得できるようなので実行してみます。&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="nv"&gt;$ &lt;/span&gt;php bin/console debug:event-dispatcher mautic.lead_import_on_initialize

Registered Listeners &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;"mautic.lead_import_on_initialize"&lt;/span&gt; Event
&lt;span class="o"&gt;=================================================================&lt;/span&gt;

 &lt;span class="nt"&gt;-------&lt;/span&gt; &lt;span class="nt"&gt;-------------------------------------------------------------------------&lt;/span&gt; &lt;span class="nt"&gt;----------&lt;/span&gt;
  Order   Callable                                                                  Priority
 &lt;span class="nt"&gt;-------&lt;/span&gt; &lt;span class="nt"&gt;-------------------------------------------------------------------------&lt;/span&gt; &lt;span class="nt"&gt;----------&lt;/span&gt;
  &lt;span class="c"&gt;#1      Mautic\LeadBundle\EventListener\ImportContactSubscriber::onImportInit()   0&lt;/span&gt;
  &lt;span class="c"&gt;#2      Mautic\LeadBundle\EventListener\ImportCompanySubscriber::onImportInit()   0&lt;/span&gt;
 &lt;span class="nt"&gt;-------&lt;/span&gt; &lt;span class="nt"&gt;-------------------------------------------------------------------------&lt;/span&gt; &lt;span class="nt"&gt;----------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PR にもある 2 つの &lt;code&gt;EventSubscriberInterface&lt;/code&gt; 継承クラスが表示されました。他の 2 つの Event についても調べると同じクラスがメソッド違いで表示されます。&lt;/p&gt;

&lt;p&gt;中を少し除いてみると以下のようになっています。&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="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImportCompanySubscriber&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;EventSubscriberInterface&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;getSubscribedEvents&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nc"&gt;LeadEvents&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;IMPORT_ON_INITIALIZE&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'onImportInit'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="nc"&gt;LeadEvents&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;IMPORT_ON_FIELD_MAPPING&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'onFieldMapping'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="nc"&gt;LeadEvents&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;IMPORT_ON_PROCESS&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'onImportProcess'&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="c1"&gt;// 以下も同じ function を持つ&lt;/span&gt;
&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImportContactSubscriber&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;EventSubscriberInterface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Event に関しては、仕組みに関してもさっぱりなので、もう少し理解を深めていきたいところです。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>mautic を psyph で調べる最初の一歩</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Wed, 30 Jun 2021 02:42:13 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-psyph-2a9g</link>
      <guid>https://dev.to/dany1468/mautic-psyph-2a9g</guid>
      <description>&lt;p&gt;&lt;code&gt;psysh&lt;/code&gt; をそのまま使ってもいいのですが、今回は &lt;code&gt;psysh-bundle&lt;/code&gt; を利用します。&lt;/p&gt;

&lt;p&gt;引き続き環境は ddev です。&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="nv"&gt;$ &lt;/span&gt;ddev composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; theofidry/psysh-bundle:v3.5.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;v3.5.1&lt;/code&gt; を利用しているのは、mautic の 3.3 branch は symfony のバージョンが 3 系のためです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://packagist.org/packages/theofidry/psysh-bundle#v3.5.1"&gt;https://packagist.org/packages/theofidry/psysh-bundle#v3.5.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/theofidry/PsyshBundle/tree/v3.5.1"&gt;https://github.com/theofidry/PsyshBundle/tree/v3.5.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  以前の mautic では入っていた
&lt;/h3&gt;

&lt;p&gt;続いて README にある通り、 &lt;code&gt;app/AppKernel.php&lt;/code&gt; の修正をするのですが、以下のように 3.3 の branch ではコメントアウト状態ですでに入っています。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/3.3/app/AppKernel.php#L208-L209"&gt;https://github.com/mautic/mautic/blob/3.3/app/AppKernel.php#L208-L209&lt;/a&gt;&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;// Removed temporarily for https://github.com/mautic/mautic/pull/9602, can be re-added in Mautic 4+&lt;/span&gt;
&lt;span class="c1"&gt;// $bundles[] = new Fidry\PsyshBundle\PsyshBundle();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;以下の PR で一度入ったようですが、コメントの通り 4 系に向けた作業の中でコメントアウトされたようです。（&lt;del&gt;ただ、&lt;code&gt;feature&lt;/code&gt; branch でもまだコメントアウトされたままです&lt;/del&gt;）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/mautic/mautic/pull/6667"&gt;Add the Psysh REPL for dev usage #6667&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mautic/mautic/pull/9602"&gt;Upgrade to PHPUnit 9 #9602&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mautic/mautic/pull/9409"&gt;Upgrade to Symfony 4 #9409&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;ここで再度入っていました&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  使い方
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ddev ssh
&lt;span class="c"&gt;# ここからはコンテナ内&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bin/console &lt;span class="nt"&gt;--env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev psysh
Psy Shell v0.9.12 &lt;span class="o"&gt;(&lt;/span&gt;PHP 7.4.20 — cli&lt;span class="o"&gt;)&lt;/span&gt; by Justin Hileman
New version is available &lt;span class="o"&gt;(&lt;/span&gt;current: v0.9.12, latest: v0.10.8&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上述の &lt;code&gt;AppKernel&lt;/code&gt; の修正箇所を見てもらうと分かりますが、 &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt; の環境でのみ有効にしているので、コンソールも &lt;code&gt;dev&lt;/code&gt; 環境で起動します。(深追いしてないのですが ddev で起動するとデフォルトが &lt;code&gt;prod&lt;/code&gt; になっていたため）&lt;/p&gt;

&lt;h3&gt;
  
  
  例えば DB からデータを取得する
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;ls
&lt;/span&gt;Variables: &lt;span class="nv"&gt;$container&lt;/span&gt;, &lt;span class="nv"&gt;$kernel&lt;/span&gt;, &lt;span class="nv"&gt;$parameters&lt;/span&gt;, &lt;span class="nv"&gt;$self&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ls&lt;/code&gt; すると、利用可能な変数が一覧できます。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$em&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$container&lt;/span&gt;-&amp;gt;get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'doctrine'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;-&amp;gt;getManager&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Doctrine&lt;span class="se"&gt;\O&lt;/span&gt;RM&lt;span class="se"&gt;\E&lt;/span&gt;ntityManager &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#625}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$em&lt;/span&gt;-&amp;gt;getRepository&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'MauticPluginBundle:Plugin'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;-&amp;gt;findAll&lt;span class="o"&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="o"&gt;[&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4861},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4822},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4825},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4828},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4831},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4834},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4837},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4858},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4855},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4852},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4849},&lt;/span&gt;
     Mautic&lt;span class="se"&gt;\P&lt;/span&gt;luginBundle&lt;span class="se"&gt;\E&lt;/span&gt;ntity&lt;span class="se"&gt;\P&lt;/span&gt;lugin &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#4846},&lt;/span&gt;
   &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dump&lt;/code&gt; するとオブジェクトの内容を確認できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; $plugin = $em-&amp;gt;getRepository('MauticPluginBundle:Plugin')-&amp;gt;find(1);
&amp;gt;&amp;gt;&amp;gt; dump($plugin)
Mautic\PluginBundle\Entity\Plugin {#4861
  -id: 1
  -name: "Outlook"
  -description: "Enables integrations with Outlook for email tracking"
  -primaryDescription: null
  -secondaryDescription: null
  -isMissing: false
  -bundle: "MauticOutlookBundle"
  -version: "1.0"
  -author: "Mautic"
  -integrations: Doctrine\ORM\PersistentCollection {#4860
    -snapshot: []
    -owner: Mautic\PluginBundle\Entity\Plugin {#4861}
    -association: array:16 [ …16]
    -em: Doctrine\ORM\EntityManager {#625 …11}
    -backRefFieldName: "plugin"
    -typeClass: Doctrine\ORM\Mapping\ClassMetadata {#2146 …}
    -isDirty: false
    #collection: Doctrine\Common\Collections\ArrayCollection {#4821
      -elements: []
    }
    #initialized: false
  }
  #changes: []
  #pastChanges: []
}
=&amp;gt; Mautic\PluginBundle\Entity\Plugin {#4861}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bundle 一覧は以下で見れます。&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="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$kernel&lt;/span&gt;-&amp;gt;getBundles&lt;span class="o"&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="o"&gt;[&lt;/span&gt;
     &lt;span class="s2"&gt;"FrameworkBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Symfony&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\F&lt;/span&gt;rameworkBundle&lt;span class="se"&gt;\F&lt;/span&gt;rameworkBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#541},&lt;/span&gt;
     &lt;span class="s2"&gt;"SecurityBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Symfony&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\S&lt;/span&gt;ecurityBundle&lt;span class="se"&gt;\S&lt;/span&gt;ecurityBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#546},&lt;/span&gt;
     &lt;span class="s2"&gt;"MonologBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Symfony&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\M&lt;/span&gt;onologBundle&lt;span class="se"&gt;\M&lt;/span&gt;onologBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#550},&lt;/span&gt;
     &lt;span class="s2"&gt;"SwiftmailerBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Symfony&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\S&lt;/span&gt;wiftmailerBundle&lt;span class="se"&gt;\S&lt;/span&gt;wiftmailerBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#27},&lt;/span&gt;
     &lt;span class="s2"&gt;"DoctrineBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Doctrine&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\D&lt;/span&gt;octrineBundle&lt;span class="se"&gt;\D&lt;/span&gt;octrineBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#74},&lt;/span&gt;
     &lt;span class="s2"&gt;"DoctrineCacheBundle"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Doctrine&lt;span class="se"&gt;\B&lt;/span&gt;undle&lt;span class="se"&gt;\D&lt;/span&gt;octrineCacheBundle&lt;span class="se"&gt;\D&lt;/span&gt;octrineCacheBundle &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="c"&gt;#549},&lt;/span&gt;
....
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>ddev 上 の mautic の dev 環境と debug について</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Fri, 25 Jun 2021 22:56:30 +0000</pubDate>
      <link>https://dev.to/dany1468/ddev-mautic-debug-2ndn</link>
      <guid>https://dev.to/dany1468/ddev-mautic-debug-2ndn</guid>
      <description>&lt;p&gt;そろそろコードを読むだけではキツくなってきたので、動かしながら確認したくなってきた。&lt;/p&gt;

&lt;h2&gt;
  
  
  dev 環境
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mautic.org/#environments" rel="noopener noreferrer"&gt;ENVIRONMENTS - Mautic Developer Documentation&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;dev is used when accessing the site through index_dev.php&lt;br&gt;
上記の通りで &lt;code&gt;index_dev.php&lt;/code&gt; を通すだけで動作します。&lt;br&gt;
例えば &lt;a href="https://mautic.ddev.site/index_dev.php/s/dashboard" rel="noopener noreferrer"&gt;https://mautic.ddev.site/index_dev.php/s/dashboard&lt;/a&gt; のような感じです。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3ba57s6dc5he6a2iljt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3ba57s6dc5he6a2iljt.png" alt="2021-06-26_07h32_41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  どうして Docker を通しているのに dev 環境で動作できるのか？
&lt;/h3&gt;

&lt;p&gt;このドキュメントを読んで最初は ModHeader を入れて、 &lt;code&gt;MAUTIC_DEV_HOSTS&lt;/code&gt; にコンテナからアクセスしている IP を設定して実行してみたのですが、それを ON にしても OFF にしても dev 環境が有効になったので不思議になったのでした。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;コンテナ内の mautic にアクセスしている IP は &lt;code&gt;ddev logs -s web -f&lt;/code&gt; でログから調べました。&lt;br&gt;
&lt;code&gt;docker network inspect ddev_default&lt;/code&gt; あたりで &lt;code&gt;ddev-router&lt;/code&gt; を見てもよいかも。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  dev 環境の IP 判定
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/blob/features/app/middlewares/Dev/IpRestrictMiddleware.php#L58-L65" rel="noopener noreferrer"&gt;https://github.com/mautic/mautic/blob/features/app/middlewares/Dev/IpRestrictMiddleware.php#L58-L65&lt;/a&gt;&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getClientIp&lt;/span&gt;&lt;span class="p"&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;allowedIps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nb"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DDEV_TLD'&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$catch&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;&lt;code&gt;getenv('DDEV_TLD')&lt;/code&gt; がポイントになっていて、 mautic の ddev をセットアップした時に生成される &lt;code&gt;.ddev-docker-compose-*.yaml&lt;/code&gt; の &lt;code&gt;environments&lt;/code&gt; に &lt;code&gt;DDEV_TLD: ddev.site&lt;/code&gt; の記述があります。&lt;/p&gt;

&lt;p&gt;この環境変数は名前の通りで ddev のもので以下の一覧にあります。&lt;br&gt;
&lt;a href="https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/#environment-variables-provided" rel="noopener noreferrer"&gt;https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/#environment-variables-provided&lt;/a&gt;&lt;br&gt;
&lt;code&gt;DDEV_TLD: Top-level domain of project, like "ddev.site"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;どうやら、これだけで通過するようで、mautic の開発環境に ddev を使う人が多いことが伺えます。（まあ、ルートに &lt;code&gt;.ddev&lt;/code&gt; がおいてあるんだから標準なんでしょうけど 😅 )&lt;/p&gt;

&lt;h2&gt;
  
  
  debug
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ddev.readthedocs.io/en/v1.17.6/users/step-debugging/" rel="noopener noreferrer"&gt;Step-debugging with ddev and xdebug - DDEV-Local Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記の ddev のドキュメントがほぼすべてです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ddev xdebug on&lt;/code&gt; を実行&lt;/li&gt;
&lt;li&gt;PhpStorm で break point を追加&lt;/li&gt;
&lt;li&gt;PhpStorm で &lt;code&gt;Start Listening for PHP Debug Connections&lt;/code&gt; をクリック&lt;/li&gt;
&lt;li&gt;ブラウザで mautic のサイトを実行し break point の箇所に遷移&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本当にこれだけでした 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  余談
&lt;/h2&gt;

&lt;p&gt;最初は dev 環境は以下の記事を読んでいたのですが、ここ数年でもまあまあ変わっていることが分かりました。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mautic.org/blog/developer/local-mautic-development-with-ddev" rel="noopener noreferrer"&gt;Local Mautic development with DDEV&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>mautic のテーブル構成を tbls で俯瞰する</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Wed, 23 Jun 2021 22:34:54 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-tbls-58k9</link>
      <guid>https://dev.to/dany1468/mautic-tbls-58k9</guid>
      <description>&lt;p&gt;&lt;code&gt;ddev describe&lt;/code&gt; すると以下のように DB は phpMyAdmin から参照するだけでなくローカルからもアクセスできるようにしてくれている。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MySQL/MariaDB Credentials
-------------------------
Username: "db", Password: "db", Default database: "db"

or use root credentials when needed: Username: "root", Password: "root"

Database hostname and port INSIDE container: db:3306
To connect to db server inside container or in project settings files:
mysql --host=db --user=db --password=db --database=db
Database hostname and port from HOST: 127.0.0.1:55213
To connect to mysql from your host machine,
mysql --host=127.0.0.1 --port=55213 --user=db --password=db --database=db

Other Services
--------------
MailHog (https):        https://mautic.ddev.site:8026
MailHog:                http://mautic.ddev.site:8025
phpMyAdmin (https):     https://mautic.ddev.site:8037
phpMyAdmin:             http://mautic.ddev.site:8036
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;もちろん、DataGrip で見たりもするが、テーブル間の繋がりを見るには図としていつでも見れるようになっていると便利。&lt;/p&gt;

&lt;h2&gt;
  
  
  できたもの
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/dany1468/mautic-tbls" rel="noopener noreferrer"&gt;https://github.com/dany1468/mautic-tbls&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以下の SVG をブラウザで開くといい感じに俯瞰できる。&lt;br&gt;
&lt;a href="https://raw.githubusercontent.com/dany1468/mautic-tbls/main/schema/schema.svg" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/dany1468/mautic-tbls/main/schema/schema.svg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;コメントはほぼ入っていないが、外部キーが貼られているので関連をつかみやすい。&lt;/p&gt;

&lt;h2&gt;
  
  
  プラグイン周りは？
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69oca0ibst10kxz5yuza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69oca0ibst10kxz5yuza.png" alt="2021-06-24_07h23_52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ER図からは、プラグイン周りはこれぐらいしか関連がない。&lt;br&gt;
&lt;code&gt;app/bundles/PluginBundle/Entity&lt;/code&gt; を見ると &lt;code&gt;integration_entity&lt;/code&gt; も関与していそうである。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ahh71ziwho3jis3o1vm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ahh71ziwho3jis3o1vm.png" alt="2021-06-24_07h27_45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  余談
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;app/bundles/PluginBundle/Entity/Plugin.php&lt;/code&gt; を眺めていると、Description は &lt;code&gt;---&lt;/code&gt; 区切りで primary と secondary の説明に分けられると気づいた。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>開発環境の mautic に plugin を入れてみる</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Tue, 22 Jun 2021 23:13:43 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-plugin-4c3c</link>
      <guid>https://dev.to/dany1468/mautic-plugin-4c3c</guid>
      <description>&lt;p&gt;ddev を使い、かつ mautic は 3.3 の branch を使っている。&lt;/p&gt;

&lt;h2&gt;
  
  
  mautic-plugin-creator を使っての新規追加
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/dany1468/composer-autoload-case-sensitive-4pac"&gt;https://dev.to/dany1468/composer-autoload-case-sensitive-4pac&lt;/a&gt;&lt;br&gt;
先日の記事で書いた通り、ddev の環境だとさっと動作しなかった。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; ddev ssh
$ php vendor/aviboy2006/mautic-plugin-creator/src/test.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上記で以下のようなファイルが出来上がる。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ez6L0PhQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6n1sgneacbei3hega1vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ez6L0PhQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6n1sgneacbei3hega1vs.png" alt="2021-06-23_08h08_16"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ php bin/console cache:clear

 // Clearing the cache for the prod environment with debug false


 [OK] Cache for the "prod" environment (debug=false) was successfully cleared.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上記で cache をクリアし、プラグイン画面で「Install/Upgrade Plugins」をクリックすると、一覧に表示される。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q5QJIjoL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuwv67340wddh7g5491h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q5QJIjoL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuwv67340wddh7g5491h.png" alt="2021-06-23_08h09_54"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  mautic/plugin-helloworld を入れてみる
&lt;/h2&gt;

&lt;p&gt;そのまま git で入れる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; git clone git@github.com:mautic/plugin-helloworld.git HelloWorldBundle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;当然ながら以下のようになる。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GUHyMKEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mli7er2ntdgj25xlwt27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GUHyMKEc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mli7er2ntdgj25xlwt27.png" alt="2021-06-23_08h12_08"&gt;&lt;/a&gt;&lt;br&gt;
同様に cache をクリアし、読み込むと一覧に出てくる。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bYcq2GBw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7gh5yv6xcehkt8wdwey8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bYcq2GBw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7gh5yv6xcehkt8wdwey8.png" alt="2021-06-23_08h12_58"&gt;&lt;/a&gt;&lt;br&gt;
次はこの辺の設定画面の作り方とかを見ていきたい。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>composer の autoload の case-sensitive でハマった</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Mon, 21 Jun 2021 23:29:19 +0000</pubDate>
      <link>https://dev.to/dany1468/composer-autoload-case-sensitive-4pac</link>
      <guid>https://dev.to/dany1468/composer-autoload-case-sensitive-4pac</guid>
      <description>&lt;p&gt;mautic を触り始めているが PHP に関しては全然なので初歩的なことにハマった。&lt;/p&gt;

&lt;h2&gt;
  
  
  プラグインを作りたかった
&lt;/h2&gt;

&lt;p&gt;簡単なプラグインを作りたくて以下のリポジトリを使ってみようとしてみました。&lt;br&gt;
&lt;a href="https://github.com/aviboy2006/mautic-plugin-creator"&gt;https://github.com/aviboy2006/mautic-plugin-creator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;README に沿って以下を実行。(ddev で実行している）&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="o"&gt;&amp;gt;&lt;/span&gt; ddev composer require aviboy2006/mautic-plugin-creator
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ddev ssh
&lt;span class="nv"&gt;$ &lt;/span&gt;php vendor/aviboy2006/mautic-plugin-creator/src/test.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;すると、 &lt;code&gt;Fatal error: Uncaught Error: Class 'Aviboy2006\MauticPluginCreator\Plugin' not found&lt;/code&gt; のようになってしまう。&lt;/p&gt;

&lt;h2&gt;
  
  
  原因を探す
&lt;/h2&gt;

&lt;p&gt;実行している &lt;code&gt;test.php&lt;/code&gt; は以下のような簡単なもの。&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="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Aviboy2006\MauticPluginCreator\Plugin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/../../../autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$greeting&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;Plugin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$greeting&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;initAction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$greeting&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;initialiseBundle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;となると、autoload がうまくいっていない可能性が高い。ちなみに PhpStorm 上ではきちんとファイルを認識できていてクラスにジャンプもできている。&lt;/p&gt;

&lt;h3&gt;
  
  
  autoload されている一覧を表示する
&lt;/h3&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="nv"&gt;$autoloader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/../../../autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// 一覧を出す&lt;/span&gt;
&lt;span class="k"&gt;echo&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;$autoloader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPrefixesPsr4&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="no"&gt;JSON_PRETTY_PRINT&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="no"&gt;JSON_UNESCAPED_SLASHES&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ファイルがあるか&lt;/span&gt;
&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$autoloader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Aviboy2006\MauticPluginCreator\Plugin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&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;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;結果としては以下のようになる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 一覧の中に
    "Aviboy2006\\MauticPluginCreator\\": [
        "/var/www/html/vendor/composer/../aviboy2006/mautic-plugin-creator/src"
    ]

// ファイルがあるか
false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;つまり、一覧に名前空間は登録されているが、 &lt;code&gt;Plugin&lt;/code&gt; は取得できていない。&lt;/p&gt;

&lt;p&gt;ちなみにプラグインは以下のようになっている。&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="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Aviboy2006\MauticPluginCreator&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;Plugin&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ここで気づきましたが、 &lt;code&gt;Plugin&lt;/code&gt; class のあるファイル名が &lt;code&gt;plugin.php&lt;/code&gt; になっていました。&lt;/p&gt;

&lt;p&gt;PSR-4 のロードは Class 名は Case-Sensitive であるらしく、今回のケースでいえば&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="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$autoloader&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;findFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Aviboy2006\MauticPluginCreator\plugin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;となる。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.php-fig.org/psr/psr-4/"&gt;PSR-4: Autoloader - PHP-FIG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/KEINOS/items/2924ecde3e4bab0ead7e"&gt;PHP の PSR-0 と PSR-4 で autoloader の違いと名前空間の基礎 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genkiroid.github.io/2016/09/10/about-case-mismatch-composer-classmap/"&gt;ComposerのクラスオートローダはCase Sensitiveである話&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/marks_mac_mk2/items/8bac530757738a374d4c"&gt;phpのautoloadでclassの読み込みができないとき - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/7968/items/1e5c61128fa495358c1f"&gt;【PHP超入門】名前空間（namespace・use）について - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/suin/items/752f3721c4b9084fef4e"&gt;「Fatal error: Class ‘…’ not found｣に陥ったときのチェック5項目 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ksrnnb/items/b6f645e70677042755d8"&gt;初心者がLaravelのindex.phpを読み解いてみた（オートロード編） - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/atwata/items/5ba72d3d881a81227c2a"&gt;PHPのオートロード(autoload) - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gomiba.co/archives/2017/08/883/"&gt;Composer は何者か。あるいは install と update の違い。そしてオートロードの仕組み。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.com/gallu/n/ne1bcb25c412a"&gt;public/index.php の最初の三行(vendor/autoload.php の挙動)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://akamist.com/blog/archives/6"&gt;[PHP]ComposerでAutoload出来ない時の確認方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  optimize することでも動作する
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;composer dump-autoload&lt;/code&gt; に &lt;code&gt;-o&lt;/code&gt; オプションを付けるとマップが作成されるが、そちらは PSR-4 のような名前空間とパスのマップではなく、単純にファイルをリストした上でマップを作成するらしく、上述の名前空間とパス名での case-sensitive の問題は発生しません。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/ArimaRyunosuke/items/b47d87b4ab76c35f4c39"&gt;composer dumpautoload -o はクラスマップを生成する - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getcomposer.org/doc/03-cli.md"&gt;https://getcomposer.org/doc/03-cli.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getcomposer.org/doc/articles/autoloader-optimization.md"&gt;https://getcomposer.org/doc/articles/autoloader-optimization.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lazesoftware.com/blog/210320/"&gt;Composer 再入門（その３：オートローダーの最適化） &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ameblo.jp/itboy/entry-12014177772.html"&gt;[Composer]開発と本番環境を分離する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>mautic で Form と Landing Page をとりあえず作ってみる</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Fri, 18 Jun 2021 23:43:09 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-form-landing-page-3lgb</link>
      <guid>https://dev.to/dany1468/mautic-form-landing-page-3lgb</guid>
      <description>&lt;p&gt;公式ドキュメント的には、最初に Campaign の説明が来るのだけれど、なんらかコンタクト等の取得元が無いと始まらないので、まずは Form と Landing Page を作ってみる。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.mautic.org/en/components/forms"&gt;https://docs.mautic.org/en/components/forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mautic.org/en/components/landing-pages"&gt;https://docs.mautic.org/en/components/landing-pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最初はいきなり Landing Page の方を作ろうとしてみて、入力フォームが無いのに戸惑ってしまったが、なんのことはなく Form は別だというだけだった。&lt;/p&gt;

&lt;h2&gt;
  
  
  Form
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4oMyitS0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bkecc0jjf5bppxme7mjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4oMyitS0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bkecc0jjf5bppxme7mjl.png" alt="2021-06-19_08h25_48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EMqQR2R2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k41a84vor31wqo3l7jc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EMqQR2R2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k41a84vor31wqo3l7jc2.png" alt="2021-06-19_08h26_47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;全体的に雑に作っている、在住は dropdown を作るのが面倒だったので &lt;code&gt;country&lt;/code&gt; に紐付けた。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w1AlM_jV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/noa6umno40srbj1f2kcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w1AlM_jV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/noa6umno40srbj1f2kcx.png" alt="2021-06-19_08h27_26"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;そんなに編集する場所は無いが、「フィールドの HTML 名」はきちんと付けておくほうがよい。空白にすると &lt;code&gt;zai_jyu&lt;/code&gt; みたいになってしまう。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b5_9cF4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl1dbhuaau0dopi3mzhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b5_9cF4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sl1dbhuaau0dopi3mzhi.png" alt="2021-06-19_08h29_00"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;アクションもメールを送信するだけ。ここの &lt;code&gt;{formfield=country}&lt;/code&gt; のところが、先程の「フィールドの HTML 名」になる。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p9iljaER--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96gd897zeky90jhwdfo5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p9iljaER--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96gd897zeky90jhwdfo5.png" alt="2021-06-19_08h31_15"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;「フィールドの HTML 名」とは書いているが、HTML を見ると、form の &lt;code&gt;name&lt;/code&gt; 属性に使われているので POST パラメータにもなっている。&lt;br&gt;
とはいえ、&lt;code&gt;formfield&lt;/code&gt; でのパラメータアクセスのキーにもなるので、明示的な名前にしておく方がいいと思う。（そもそも英語を使うなら自然に設定されるからいんでしょうけど）&lt;/p&gt;

&lt;h2&gt;
  
  
  Landing Page
&lt;/h2&gt;

&lt;p&gt;Blank のテーマを選んで、最初からあるテキストの場所に &lt;code&gt;{form=1}&lt;/code&gt; を入れただけ。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n4ou5Hd5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mc2cc62s0f75ogea7y9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n4ou5Hd5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mc2cc62s0f75ogea7y9m.png" alt="2021-06-19_08h32_54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{form=1}&lt;/code&gt; の &lt;code&gt;1&lt;/code&gt; は Form の ID なので、一覧から探せる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YW_DItOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g43amdbonbhf9cld2b8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YW_DItOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g43amdbonbhf9cld2b8b.png" alt="2021-06-19_08h34_14"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これで終了。&lt;/p&gt;

&lt;h2&gt;
  
  
  表示
&lt;/h2&gt;

&lt;p&gt;Landing Page の画面から publish されたページのリンクがでるので表示してみる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bNUL1XpC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oy9gnh46ljpmh70uqmcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bNUL1XpC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oy9gnh46ljpmh70uqmcw.png" alt="2021-06-19_08h35_34"&gt;&lt;/a&gt;&lt;br&gt;
在住のドロップダウンにも、国の一覧が出てくる。&lt;/p&gt;

&lt;h2&gt;
  
  
  送信
&lt;/h2&gt;

&lt;p&gt;Form の画面の方に結果が出てくる。グラフには反映されない。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--of_kbMxv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1v9h8dgprhvkkbz8ecv9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--of_kbMxv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1v9h8dgprhvkkbz8ecv9.png" alt="2021-06-19_08h37_18"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;メールも送信されている。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P5NcXUb_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajug0sspnrmq2ictudvk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P5NcXUb_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajug0sspnrmq2ictudvk.png" alt="2021-06-19_08h39_45"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>mautic の多言語対応のソースはどこか</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Thu, 17 Jun 2021 23:41:03 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-4bgo</link>
      <guid>https://dev.to/dany1468/mautic-4bgo</guid>
      <description>&lt;p&gt;現時点の mautic は最初から日本語化も簡単にできて導入がしやすい。&lt;br&gt;
いくつか日本語化されていない部分があったので、どこで貢献できるのかと思いプロジェクトを見てみたがパッとは &lt;code&gt;en_US&lt;/code&gt; 以外のファイルが見つからない。&lt;/p&gt;

&lt;h2&gt;
  
  
  LanguageHelper
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CoreBundle&lt;/code&gt; に含まれている。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/features/app/bundles/CoreBundle/Helper/LanguageHelper.php"&gt;https://github.com/mautic/mautic/blob/features/app/bundles/CoreBundle/Helper/LanguageHelper.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記によると、デフォルトの &lt;code&gt;en_US&lt;/code&gt; 以外は remote server から fetch されていることが分かる。&lt;/p&gt;

&lt;h3&gt;
  
  
  言語ファイルの取得
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fetchLanguages&lt;/code&gt; と &lt;code&gt;fetchPackage&lt;/code&gt; 関数を見てもらうと分かるが、以下の 2 箇所からそれぞれ、manifest と言語パック (zip) を取得していることがわかる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/blob/features/app/bundles/CoreBundle/Config/config.php#L1615-L1616"&gt;https://github.com/mautic/mautic/blob/features/app/bundles/CoreBundle/Config/config.php#L1615-L1616&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://language-packs.mautic.com/manifest.json"&gt;https://language-packs.mautic.com/manifest.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://language-packs.mautic.com/ja.zip"&gt;https://language-packs.mautic.com/ja.zip&lt;/a&gt; (日本語の場合)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;ja.zip&lt;/code&gt; を展開すると分かるが、あらゆる Bundle 用の言語ファイルが含まれていることがわかる。&lt;/p&gt;

&lt;p&gt;以下の Github リポジトリが本体のようである。&lt;br&gt;
&lt;a href="https://github.com/mautic/language-packs"&gt;https://github.com/mautic/language-packs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  貢献する場所はどこか
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://language-packs.mautic.com/"&gt;https://language-packs.mautic.com/&lt;/a&gt; にアクセスすると以下が記載されている。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This repository contains Mautic translation packs which are automatically built based on Transifex community translations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.transifex.com/mautic/mautic/"&gt;https://www.transifex.com/mautic/mautic/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記から貢献できることがわかった。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;サインアップしようとすると、なぜか失敗するのでまだサインアップできていない。&lt;br&gt;
-&amp;gt; ソーシャルアカウントでのサインアップは失敗するが、メールアドレスでのサインアップはできた&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Update 2021/06/19
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.mautic.org/en/translations#how-to-translate-mautic"&gt;https://docs.mautic.org/en/translations#how-to-translate-mautic&lt;/a&gt;&lt;br&gt;
そもそも上記の公式にちゃんと書いてあった 😅&lt;br&gt;
&lt;a href="https://developer.mautic.org/"&gt;https://developer.mautic.org/&lt;/a&gt; こっちばっか見てたらだめだな。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>mautic のソースコードを WSL2 で開く</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Wed, 16 Jun 2021 23:29:32 +0000</pubDate>
      <link>https://dev.to/dany1468/mautic-wsl2-14ln</link>
      <guid>https://dev.to/dany1468/mautic-wsl2-14ln</guid>
      <description>&lt;p&gt;最近は Ruby を書くにしても MacBook を開くよりも WSL2 の Linux 環境で済ませることが多くなってきたので、mautic もそちらに clone して開いてみる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS &amp;gt; wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Running         2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;とりあえず clone する。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS &amp;gt; git clone git@github.com:mautic/mautic.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ddev で動作させる
&lt;/h2&gt;

&lt;p&gt;ルートに &lt;code&gt;.ddev/&lt;/code&gt; があるので、そちらに乗ってみる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kb.mautic.org/knowledgebase/development/how-to-install-mautic-using-ddev"&gt;Installing Mautic using DDEV | Grav&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ddev config&lt;/code&gt; は記事通りに全部デフォルトで。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/git/mautic&lt;span class="nv"&gt;$ &lt;/span&gt;ddev config
You are reconfiguring the project at /home/dan/git/mautic.
The existing configuration will be updated and replaced.
Project name &lt;span class="o"&gt;(&lt;/span&gt;mautic&lt;span class="o"&gt;)&lt;/span&gt;:

The docroot is the directory from which your site is served.
This is a relative path from your project root at /home/dan/git/mautic
You may leave this value blank &lt;span class="k"&gt;if &lt;/span&gt;your site files are &lt;span class="k"&gt;in &lt;/span&gt;the project root
Docroot Location &lt;span class="o"&gt;(&lt;/span&gt;current directory&lt;span class="o"&gt;)&lt;/span&gt;:
Found a php codebase at /home/dan/git/mautic.
Project Type &lt;span class="o"&gt;[&lt;/span&gt;backdrop, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress] &lt;span class="o"&gt;(&lt;/span&gt;php&lt;span class="o"&gt;)&lt;/span&gt;:
Project &lt;span class="nb"&gt;type &lt;/span&gt;has no settings paths configured, so not creating settings file.
Configuration complete. You may now run &lt;span class="s1"&gt;'ddev start'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.ddev/config.yaml&lt;/code&gt; は以下を変更。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-router_http_port: "80"
-router_https_port: "443"
&lt;/span&gt;&lt;span class="gi"&gt;+router_http_port: "8081"
+router_https_port: "4431"
+timezone: Asia/Tokyo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;composer_version: "2"&lt;/code&gt; ってのがそのままでいいのか気になりましたが、デフォルトが &lt;code&gt;feature&lt;/code&gt; ブランチだったので、もう 4 系になってるからだと。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ddev start
略
================
Install complete
================
[2021-06-17 07:53:31]
[2021-06-17 07:53:31]  // Warming up the cache for the dev environment with debug true
[2021-06-17 07:53:31]
[2021-06-17 07:53:31]
[2021-06-17 07:53:31]  [OK] Cache for the "dev" environment (debug=true) was successfully warmed.
[2021-06-17 07:53:31]
[2021-06-17 07:53:31]
Enabling plugins...
13 new plugins were installed and 0 updated.
All done! Here's some useful information:
・ The default login is admin/mautic
・ To open the Mautic instance, go to https://mautic.ddev.site in your browser.
・ To open PHPMyAdmin for managing the database, go to https://mautic.ddev.site:8037 in your browser.
・ To open MailHog for seeing all emails that Mautic sent, go to https://mautic.ddev.site:8026 in your browser.
・ Run "ddev exec composer test" to run PHPUnit tests.
・ Run "ddev exec bin/console COMMAND" (like mautic:segments:update) to use the Mautic CLI. For an overview of all available CLI commands, go to https://mau.tc/cli
・ If you want to stop the instance, simply run "ddev stop".
Successfully started mautic
Project can be reached at https://mautic.ddev.site:4431 https://127.0.0.1:55445
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;記事には以下の記述があるので実行しておきます。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you cloned Mautic from GitHub, there is one final step&lt;/strong&gt;: You need to connect to the running DDEV container and then have Composer install all of the Mautic dependencies. This is done by first running &lt;code&gt;ddev ssh&lt;/code&gt; to connect to the container, and then from the project root (which DDEV by default connects you to), run &lt;code&gt;composer install&lt;/code&gt; to install all dependencies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;実行はしてみたものの、&lt;code&gt;Nothing to install&lt;/code&gt; なので実行は不要だったのかも。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/html$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Package misd/phone-number-bundle is abandoned, you should avoid using it. Use odolbeau/phone-number-bundle instead.
Package symfony/inflector is abandoned, you should avoid using it. Use use `EnglishInflector` from the String component instead instead.
Package rector/rector-prefixed is abandoned, you should avoid using it. Use rector/rector instead.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
129 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Symfony recipes are disabled: "symfony/flex" not found in the root composer.json

Executing script php -r "if(file_exists('./.git')&amp;amp;&amp;amp;file_exists('./build/hooks/pre-commit'.(PHP_OS=='WINNT'?'.win':''))){copy('./build/hooks/pre-commit'.(PHP_OS=='WINNT'?'.win':''),'./.git/hooks/pre-commit');} if(file_exists('./.git')&amp;amp;&amp;amp;file_exists('./build/hooks/post-checkout')){copy('./build/hooks/post-checkout','./.git/hooks/post-checkout');}" [OK]
Executing script php -r "if(file_exists('./.git/hooks/pre-commit')&amp;amp;&amp;amp;(PHP_OS!='WINNT')){chmod('./.git/hooks/pre-commit',0755);} if(file_exists('./.git/hooks/post-checkout')&amp;amp;&amp;amp;(PHP_OS!='WINNT')){chmod('./.git/hooks/post-checkout',0755);}" [OK]

&amp;gt; find . -mindepth 2 -type d -name .git | xargs rm -rf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  開いてみる
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mautic.ddev.site:4431"&gt;https://mautic.ddev.site:4431&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;アカウントは先程のログにあったとおり &lt;code&gt;admin/mautic&lt;/code&gt; でログインできます。&lt;/p&gt;

&lt;h3&gt;
  
  
  他のインストールアプリ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ddev describe
NAME    TYPE  LOCATION      URL                            STATUS
mautic  php   ~/git/mautic  https://mautic.ddev.site:4431  running

Project Information
-------------------
PHP version:            7.4
NFS mount enabled:      false
Database type:          mariadb
MariaDB version:        10.3

URLs
----
https://mautic.ddev.site:4431
https://127.0.0.1:55445
http://mautic.ddev.site:8081
http://127.0.0.1:55446

MySQL/MariaDB Credentials
------------------------------
Username: "db", Password: "db", Default database: "db"

or use root credentials when needed: Username: "root", Password: "root"

Database hostname and port INSIDE container: db:3306
To connect to db server inside container or in project settings files:
mysql --host=db --user=db --password=db --database=db
Database hostname and port from HOST: 127.0.0.1:55433
To connect to mysql from your host machine,
mysql --host=127.0.0.1 --port=55433 --user=db --password=db --database=db

Other Services
-------------------
MailHog (https):        https://mautic.ddev.site:8026
MailHog:                http://mautic.ddev.site:8025
phpMyAdmin (https):     https://mautic.ddev.site:8037
phpMyAdmin:             http://mautic.ddev.site:8036

DDEV ROUTER STATUS: healthy
ssh-auth status: healthy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;実はインストール時に &lt;code&gt;8025&lt;/code&gt; が衝突して一度失敗したんですが、なるほどこちらでも &lt;code&gt;MailHog&lt;/code&gt; をインストールしてたんですね。&lt;/p&gt;

&lt;p&gt;上記の URL で問題なくアクセスできました。&lt;/p&gt;

&lt;h2&gt;
  
  
  PhpStorm で開く
&lt;/h2&gt;

&lt;p&gt;JetBrains プロダクトが今年あたりから WSL2 に対応しており、これまで VS Code でやっていたものが一気に便利になりました。（これまでも Windows 側にマウントしたディレクトリに配置していれば開けましたが、たまに変なことになるので待望でした。）&lt;/p&gt;

&lt;p&gt;今回だと &lt;code&gt;\\wsl$\Ubuntu-18.04\home\dan\git\mautic&lt;/code&gt; みたいなパスで開くことができます。（IDE 側で勝手に WSL 側も含めてエクスプローラー開いてくれるので直打ちすることはないですが）&lt;/p&gt;

&lt;h3&gt;
  
  
  ddev の PHP を使う
&lt;/h3&gt;

&lt;p&gt;WSL2 環境には PHP を入れていないので、IDE で使う PHP インタープリタを指定するのに ddev のを使うと楽です。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; すると、ddev で立ち上がっているコンテナが分かります。PHP が入っているのは &lt;code&gt;ddrud/ddev-werbserver&lt;/code&gt; コンテナなのでそれを使います。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker ps
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED          STATUS                    PORTS
                                                NAMES
f1b717ae4601   drud/ddev-router:v1.17.3                               "/app/docker-entrypo…"   11 minutes ago   Up 11 minutes (healthy)   127.0.0.1:4431-&amp;gt;4431/tcp, 127.0.0.1:8025-8026-&amp;gt;8025-8026/tcp, 127.0.0.1:8036-8037-&amp;gt;8 036-8037/tcp, 80/tcp, 127.0.0.1:8081-&amp;gt;8081/tcp   ddev-router
b4e107b098cf   drud/ddev-webserver:v1.17.4-mautic-built               "/start.sh"              11 minutes ago   Up 11 minutes (healthy)   8025/tcp, 127.0.0.1:55446-&amp;gt;80/tcp, 127.0.0.1:55445-&amp;gt;443/tcp
                                                ddev-mautic-web
f61027027880   phpmyadmin:5                                           "/docker-entrypoint.…"   11 minutes ago   Up 11 minutes             0.0.0.0:55444-&amp;gt;80/tcp
                                                 ddev-mautic-dba
3a8e051f958e   drud/ddev-dbserver-mariadb-10.3:v1.17.3-mautic-built   "/docker-entrypoint.…"   11 minutes ago   Up 11 minutes (healthy)   127.0.0.1:55433-&amp;gt;3306/tcp
                                                 ddev-mautic-db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Mkot2Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3wx7l4sedj9stg1rk6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Mkot2Z---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h3wx7l4sedj9stg1rk6r.png" alt="2021-06-17_08h24_37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記のように設定すれば利用できます。今回は &lt;code&gt;Docker&lt;/code&gt; で選びましたが、 &lt;code&gt;docker-compose&lt;/code&gt; も選べたのでそちらの方がいいのかもしれません。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>docker-compose 上の mautic で GeoLite2 の自動更新設定</title>
      <dc:creator>Yoichi Dan</dc:creator>
      <pubDate>Wed, 16 Jun 2021 00:04:40 +0000</pubDate>
      <link>https://dev.to/dany1468/docker-compose-mautic-geolite2-17ln</link>
      <guid>https://dev.to/dany1468/docker-compose-mautic-geolite2-17ln</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/mautic/mautic/issues/8275"&gt;Maxmind IP lookup database cannot be downloaded anonymously anymore - mautic/mautic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記の issue でも触れられていますが、mautic がデフォルトにしている MaxMind の GeoLite2 データセットがライセンスキーを必要とするようになったようです。&lt;/p&gt;

&lt;h2&gt;
  
  
  MaxMind のライセンスを使った設定
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bLeNvR0g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re6nvtid7gfljazp87w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bLeNvR0g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re6nvtid7gfljazp87w4.png" alt="2021-06-16_08h55_07"&gt;&lt;/a&gt;&lt;br&gt;
上記のように &lt;code&gt;account:password&lt;/code&gt; の区切りで設定できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.mautic.org/en/setup/maxmind-license"&gt;Maxmind license | Mautic&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  直接 MaxMind の &lt;code&gt;geoipupdate&lt;/code&gt; を使う
&lt;/h2&gt;

&lt;p&gt;通常行う必要は無いですが、参考までに。&lt;/p&gt;
&lt;h3&gt;
  
  
  対応方法
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mauteam.org/mautic/mautic-admins/solved-maxmind-geolite2-database-not-updating/"&gt;[Solved] Maxmind GeoLite2 &amp;amp; GeoIP Database Auto-Update | 2020.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Issue にも貼られていた上記のページが対応方法になります。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mautic/docker-mautic/issues/171"&gt;[BUG] Bad cron for geoip db #171 mautic/docker-mautic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;上記をさらに docker に適用する方法が上記に提案されています。&lt;br&gt;
今回はこれらをベースにします。&lt;/p&gt;

&lt;p&gt;ディレクトリ構成&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockefile
GetIP.conf # MaxMind からダウンロードしたライセンスファイル
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; mautic/mautic:v3&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget https://github.com/maxmind/geoipupdate/releases/download/v4.6.0/geoipupdate_4.6.0_linux_amd64.deb &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; geoipupdate_4.6.0_linux_amd64.deb &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;geoipupdate_4.6.0_linux_amd64.deb

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; GeoIP.conf /etc/GeoIP.conf&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'/^"$@" &amp;amp;/i mkdir -p /var/www/html/app/cache/ip_data &amp;amp;&amp;amp; geoipupdate -f /etc/GeoIP.conf -d /var/www/html/app/cache/ip_data &amp;amp;&amp;amp; chown www-data.www-data -R /var/www/html/app/cache/ip_data'&lt;/span&gt; /entrypoint.sh

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/iplookup/s/^/#/g'&lt;/span&gt; /etc/cron.d/mautic &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'        0 4 15 * *     www-data  geoipupdate -f /etc/GeoIP.conf -d /var/www/html/app/cache/ip_data &amp;gt; /var/log/cron.pipe 2&amp;gt;&amp;amp;1'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/cron.d/mautic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;geoipupdate&lt;/code&gt; に関しては現在 4.7.1 までリリースされているのでバージョンは指定できるようにした方が良いとは思いますが、ここでは上記の issue に合ったものをそのまま使います。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt; のポイントは以下です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/etc/cron.d/mautic&lt;/code&gt; に &lt;code&gt;geoipupdate&lt;/code&gt; を使ったジョブを追加し、既存の更新処理をコメントアウト&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/entrypoint.sh&lt;/code&gt; の事前処理の最後に、初回の GeoLite2 データセットのダウンロードを実行

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/var/www/html/app&lt;/code&gt; は &lt;code&gt;/entrypoint.sh&lt;/code&gt; 内で構築されるため、&lt;code&gt;Dockerfile&lt;/code&gt; 内で処理はできないため、ここに記述している&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  cache ディレクトリの注意
&lt;/h3&gt;

&lt;p&gt;上記では最終的に &lt;code&gt;ip_data&lt;/code&gt; を入れる先を &lt;code&gt;/var/www/html/app/cache/ip_data&lt;/code&gt; としています。&lt;/p&gt;

&lt;p&gt;これは最終的には以下の場所と同じになる必要があります。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/MaxmindDownloadLookup.php#L29"&gt;https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/MaxmindDownloadLookup.php#L29&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$this-&amp;gt;getDataDir().'/GeoLite2-City.mmdb'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;さらに展開すると以下です。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/AbstractLocalDataLookup.php#L171"&gt;https://github.com/mautic/mautic/blob/7a2875bc16a6de50a1803fbc41b64278ae9b5428/app/bundles/CoreBundle/IpLookup/AbstractLocalDataLookup.php#L171&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$dataDir = $this-&amp;gt;cacheDir.'/../ip_data';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AbstractLocalDataLookup&lt;/code&gt; は &lt;code&gt;AbstractLookup&lt;/code&gt; を継承しており、初期化は以下の設定が反映されます。&lt;br&gt;
&lt;a href="https://github.com/mautic/mautic/blob/de7e701ab2e498e7a8e5129e35a8fa482e1e2ff8/app/bundles/CoreBundle/Config/config.php#L927-L945"&gt;https://github.com/mautic/mautic/blob/de7e701ab2e498e7a8e5129e35a8fa482e1e2ff8/app/bundles/CoreBundle/Config/config.php#L927-L945&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;つまり、&lt;code&gt;cacheDir&lt;/code&gt; は &lt;code&gt;kernel.cache_dir&lt;/code&gt; になります。&lt;br&gt;
例えば私の環境では以下のようになるので、上記の Dockerfile ではここが一致しません。 &lt;code&gt;/var/www/html/var/cache/ip_data&lt;/code&gt; を指定しなければいけません。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# bin/console debug:container --parameter=kernel.cache_dir
 ------------------ ------------------------------
  Parameter          Value
 ------------------ ------------------------------
  kernel.cache_dir   /var/www/html/var/cache/prod
 ------------------ ------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
