{"id":175,"date":"2026-03-13T14:50:17","date_gmt":"2026-03-13T17:50:17","guid":{"rendered":"https:\/\/rdconsolo.com.br\/?p=175"},"modified":"2026-04-07T16:13:16","modified_gmt":"2026-04-07T19:13:16","slug":"gerenciando-assets-do-bootstrap-no-codeigniter-4-com-composer","status":"publish","type":"post","link":"https:\/\/rdconsolo.com.br\/?p=175","title":{"rendered":"Gerenciando Assets do Bootstrap no CodeIgniter 4 com Composer"},"content":{"rendered":"\n<p>Ao desenvolver aplica\u00e7\u00f5es web com CodeIgniter 4 e gerenciar depend\u00eancias de frontend como o Bootstrap via Composer, surge a necessidade de disponibilizar esses arquivos (CSS, JavaScript, fontes, etc.) para acesso p\u00fablico atrav\u00e9s das views. A pasta <code>vendor<\/code>, onde o Composer instala as depend\u00eancias, n\u00e3o deve ser diretamente acess\u00edvel pela web por quest\u00f5es de seguran\u00e7a e organiza\u00e7\u00e3o. A melhor pr\u00e1tica para lidar com isso no CodeIgniter 4 \u00e9 utilizando a biblioteca <strong>Publisher<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que usar a Biblioteca Publisher?<\/h2>\n\n\n\n<p>A biblioteca Publisher do CodeIgniter 4 [1] foi projetada especificamente para resolver o desafio de copiar arquivos de bibliotecas instaladas via Composer (ou de qualquer outra origem) para um diret\u00f3rio acess\u00edvel publicamente, como a pasta <code>public<\/code> do seu projeto. Suas principais vantagens incluem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gerenciamento de Vers\u00f5es<\/strong>: Facilita a atualiza\u00e7\u00e3o de depend\u00eancias, pois voc\u00ea pode simplesmente reexecutar o comando de publica\u00e7\u00e3o ap\u00f3s uma atualiza\u00e7\u00e3o do Composer.<\/li>\n\n\n\n<li><strong>Organiza\u00e7\u00e3o e Seguran\u00e7a<\/strong>: Mant\u00e9m a pasta <code>vendor<\/code> protegida e garante que apenas os assets necess\u00e1rios sejam expostos publicamente.<\/li>\n\n\n\n<li><strong>Automa\u00e7\u00e3o<\/strong>: Permite automatizar o processo de c\u00f3pia de arquivos, integrando-o ao fluxo de trabalho de desenvolvimento e deploy.<\/li>\n\n\n\n<li><strong>Flexibilidade<\/strong>: Oferece controle granular sobre quais arquivos e diret\u00f3rios devem ser copiados e para onde.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Implementa\u00e7\u00e3o com a Biblioteca Publisher<\/h2>\n\n\n\n<p>A seguir, detalhamos os passos para integrar o Bootstrap 5.3.8, instalado via Composer, em suas views do CodeIgniter 4 usando a biblioteca Publisher.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Criar uma Classe Publisher Personalizada<\/h3>\n\n\n\n<p>\u00c9 recomend\u00e1vel criar uma classe Publisher personalizada para o Bootstrap. Isso permite que voc\u00ea defina a origem e o destino dos arquivos de forma organizada. Crie um novo arquivo, por exemplo, <code>app\/Publishers\/BootstrapPublisher.php<\/code>:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>&lt;?php\n\nnamespace App\\Publishers;\n\nuse CodeIgniter\\Publisher\\Publisher;\n\nclass BootstrapPublisher extends Publisher\n{\n    \/**\n     * Define o caminho de origem dos assets do Bootstrap.\n     * Normalmente, \u00e9 o diret\u00f3rio `vendor\/twbs\/bootstrap`.\n     *\n     * @var string\n     *\/\n    protected $source = ROOTPATH . &#39;vendor\/twbs\/bootstrap&#39;;\n\n    \/**\n     * Define o caminho de destino dos assets do Bootstrap.\n     * Normalmente, \u00e9 o diret\u00f3rio `public\/assets\/bootstrap`.\n     *\n     * @var string\n     *\/\n    protected $destination = FCPATH . &#39;assets\/bootstrap&#39;;\n\n    public function publish(): bool\n    {\n        return $this\n            -&gt;addPath(&#39;dist&#39;) \/\/ Copia todo o conte\u00fado da pasta &#39;dist&#39; do Bootstrap\n            -&gt;merge(true); \/\/ Mescla os arquivos, sobrescrevendo se existirem\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p><strong>Explica\u00e7\u00e3o:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>$source<\/code>: Aponta para o diret\u00f3rio raiz do pacote Bootstrap dentro da pasta <code>vendor<\/code>.<\/li>\n\n\n\n<li><code>$destination<\/code>: Define o diret\u00f3rio onde os arquivos do Bootstrap ser\u00e3o copiados dentro da sua pasta <code>public<\/code>. Recomenda-se <code>public\/assets\/bootstrap<\/code> para manter a organiza\u00e7\u00e3o.<\/li>\n\n\n\n<li><code>publish()<\/code>: Este m\u00e9todo \u00e9 onde voc\u00ea define quais arquivos ou diret\u00f3rios ser\u00e3o copiados. No exemplo, <code>addPath('dist')<\/code> instrui o Publisher a copiar todo o conte\u00fado da pasta <code>dist<\/code> do Bootstrap (que cont\u00e9m CSS, JS, etc.). <code>merge(true)<\/code> garante que os arquivos sejam mesclados e sobrescritos se j\u00e1 existirem, o que \u00e9 \u00fatil para atualiza\u00e7\u00f5es.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. Executar o Comando Spark Publish<\/h3>\n\n\n\n<p>Ap\u00f3s criar a classe Publisher, voc\u00ea pode executar o comando <code>spark publish<\/code> no terminal para copiar os assets. O CodeIgniter 4 ir\u00e1 descobrir automaticamente sua classe <code>BootstrapPublisher<\/code>.<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>php spark publish<\/code><\/pre><\/div>\n\n\n\n<p>Este comando copiar\u00e1 os arquivos do Bootstrap da pasta <code>vendor\/twbs\/bootstrap\/dist<\/code> para <code>public\/assets\/bootstrap\/dist<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Incluir os Assets nas Views<\/h3>\n\n\n\n<p>Com os arquivos do Bootstrap agora dispon\u00edveis na pasta <code>public\/assets\/bootstrap\/dist<\/code>, voc\u00ea pode inclu\u00ed-los em suas views (por exemplo, <code>app\/Views\/layout.php<\/code> ou <code>app\/Views\/welcome_message.php<\/code>) da seguinte forma:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-html\" data-lang=\"HTML\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;pt-br&quot;&gt;\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;title&gt;Minha Aplica\u00e7\u00e3o CI4 com Bootstrap&lt;\/title&gt;\n    &lt;!-- Bootstrap CSS --&gt;\n    &lt;link href=&quot;&lt;?= base_url(&#39;assets\/bootstrap\/dist\/css\/bootstrap.min.css&#39;) ?&gt;&quot; rel=&quot;stylesheet&quot;&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=&quot;container&quot;&gt;\n        &lt;h1&gt;Ol\u00e1, Bootstrap no CodeIgniter 4!&lt;\/h1&gt;\n        &lt;button class=&quot;btn btn-primary&quot;&gt;Bot\u00e3o de Exemplo&lt;\/button&gt;\n    &lt;\/div&gt;\n\n    &lt;!-- Bootstrap JS e depend\u00eancias (Popper.js) --&gt;\n    &lt;script src=&quot;&lt;?= base_url(&#39;assets\/bootstrap\/dist\/js\/bootstrap.bundle.min.js&#39;) ?&gt;&quot;&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre><\/div>\n\n\n\n<p>Utilize a fun\u00e7\u00e3o <code>base_url()<\/code> do CodeIgniter para gerar os caminhos corretos para seus assets, garantindo que eles funcionem independentemente da URL base da sua aplica\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alternativas (Menos Recomendadas)<\/h2>\n\n\n\n<p>Embora existam outras maneiras de lidar com assets de bibliotecas, elas s\u00e3o geralmente menos recomendadas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Symlinks (Links Simb\u00f3licos)<\/strong>: Criar links simb\u00f3licos da pasta <code>vendor<\/code> para <code>public<\/code> pode funcionar, mas pode ser problem\u00e1tico em alguns ambientes de hospedagem e menos port\u00e1vel.<\/li>\n\n\n\n<li><strong>Acesso Direto (via .htaccess)<\/strong>: Tentar configurar o servidor web para acessar diretamente a pasta <code>vendor<\/code> \u00e9 uma m\u00e1 pr\u00e1tica de seguran\u00e7a e n\u00e3o \u00e9 recomendado.<\/li>\n\n\n\n<li><strong>C\u00f3pia Manual<\/strong>: Copiar os arquivos manualmente \u00e9 propenso a erros e invi\u00e1vel para projetos com muitas depend\u00eancias ou atualiza\u00e7\u00f5es frequentes.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>A biblioteca Publisher \u00e9 a solu\u00e7\u00e3o mais robusta e recomendada pelo CodeIgniter 4 para gerenciar assets de bibliotecas instaladas via Composer. Ela oferece uma abordagem automatizada, segura e organizada para disponibilizar seus arquivos de frontend, como o Bootstrap, em suas views, seguindo as melhores pr\u00e1ticas do framework.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refer\u00eancias<\/h2>\n\n\n\n<p>[1] <a href=\"https:\/\/codeigniter4.github.io\/userguide\/libraries\/publisher.html\">Publisher \u2014 CodeIgniter 4.7.0 documentation<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao desenvolver aplica\u00e7\u00f5es web com CodeIgniter 4 e gerenciar depend\u00eancias de frontend como o Bootstrap via Composer, surge a necessidade de disponibilizar esses arquivos (CSS, JavaScript, fontes, etc.) para acesso p\u00fablico atrav\u00e9s das views. A pasta vendor, onde o Composer instala as depend\u00eancias, n\u00e3o deve ser diretamente acess\u00edvel pela web por quest\u00f5es de seguran\u00e7a e &hellip; <a href=\"https:\/\/rdconsolo.com.br\/?p=175\" class=\"more-link\">Continue lendo<span class=\"screen-reader-text\"> &#8220;Gerenciando Assets do Bootstrap no CodeIgniter 4 com Composer&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[23],"class_list":["post-175","post","type-post","status-publish","format-standard","hentry","category-developer","tag-codeigniter"],"_links":{"self":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=175"}],"version-history":[{"count":3,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/175\/revisions"}],"predecessor-version":[{"id":187,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/175\/revisions\/187"}],"wp:attachment":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}