{"id":27579,"date":"2021-05-19T13:20:00","date_gmt":"2021-05-19T10:20:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=27579"},"modified":"2021-10-18T04:11:06","modified_gmt":"2021-10-18T01:11:06","slug":"como-criar-um-blog-com-o-laravel","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pt-pt\/como-criar-um-blog-com-o-laravel\/","title":{"rendered":"Como criar um blog com o Laravel"},"content":{"rendered":"<p>Laravel \u00e9 o framework PHP mais popular. Todos n\u00f3s sabemos que as pessoas preferem essa estrutura para construir seus aplicativos da web. E enquanto constr\u00f3i um site com o Laravel, voc\u00ea provavelmente deseja construir um blog em seu site. Em geral, o Laravel n\u00e3o \u00e9 uma plataforma de blog como o WordPress, onde voc\u00ea obt\u00e9m todo o back-end pronto para gerenciar os artigos do seu blog. E construir o sistema de blog do zero \u00e9 um trabalho que consome muito tempo. Gra\u00e7as ao <a href=\"https:\/\/cnvs.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Canvas,<\/a> que facilita a vida dos desenvolvedores do Laravel ao construir uma plataforma de publica\u00e7\u00e3o legal para o Laravel.<\/p>\n<p>Usando o pacote Canvas, podemos construir facilmente nosso blog no Laravel em apenas alguns minutos. O Canvas j\u00e1 fez um trabalho \u00e1rduo para gerenciar o back-end do blog. Tudo o que voc\u00ea precisa fazer \u00e9 obter os dados e exibi-los no frontend que combinem com o seu design.<\/p>\n<p>Dito isso, vamos dar uma olhada em como criar um blog com o Laravel usando o pacote Canvas.<\/p>\n<h3>Come\u00e7ando<\/h3>\n<p>Para come\u00e7ar a usar o Canvas, voc\u00ea precisa primeiro satisfazer o requisito b\u00e1sico do Canvas, que \u00e9 a autentica\u00e7\u00e3o do usu\u00e1rio. O Laravel torna a implementa\u00e7\u00e3o da autentica\u00e7\u00e3o realmente simples. Se voc\u00ea j\u00e1 instalou a autentica\u00e7\u00e3o do Laravel, pule este passo. Caso contr\u00e1rio, em seu terminal, execute os comandos abaixo um por um para configurar a autentica\u00e7\u00e3o do Laravel.<\/p>\n<pre><code>composer require laravel\/ui --dev\nphp artisan ui vue --auth\nnpm install &amp;&amp; npm run dev\n<\/code><\/pre>\n<h3>Crie um blog com o Laravel usando o pacote Canvas<\/h3>\n<p>Quando a autentica\u00e7\u00e3o estiver no local, voc\u00ea pode instalar o Canvas executando o comando abaixo:<\/p>\n<pre><code>composer require cnvs\/canvas<\/code><\/pre>\n<p>Ap\u00f3s a instala\u00e7\u00e3o do pacote, voc\u00ea precisa publicar os ativos e o arquivo de configura\u00e7\u00e3o principal. Publique-o usando o comando:<\/p>\n<pre><code>php artisan canvas:install<\/code><\/pre>\n<p>Este comando localizaria o arquivo de configura\u00e7\u00e3o principal em <code>config\/canvas.php<\/code>. Voc\u00ea pode controlar v\u00e1rios aspectos usando este arquivo de configura\u00e7\u00e3o. Mas voc\u00ea raramente precisa tocar neste arquivo, pois todas as coisas j\u00e1 est\u00e3o definidas nos locais.<\/p>\n<p>Ele tamb\u00e9m cria algumas tabelas em seu banco de dados. Este pacote adiciona um prefixo &#8216;canvas_&#8217; a todas essas tabelas rec\u00e9m-criadas.<\/p>\n<p>Quando se trata de blogs, voc\u00ea sempre precisa usar imagens no conte\u00fado. Portanto, crie um link simb\u00f3lico para garantir que os uploads de arquivos sejam acess\u00edveis publicamente na web.<\/p>\n<pre><code>php artisan storage:link<\/code><\/pre>\n<p>Isso significa que voc\u00ea ver\u00e1 suas imagens carregadas dentro do <code>public\/storage<\/code>diret\u00f3rio.<\/p>\n<p>Agora, se voc\u00ea executar a URL <a href=\"http:\/\/localhost:8000\/canvas\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http: \/\/ localhost: 8000 \/ canvas,<\/a> ir\u00e1 redirecionar para a p\u00e1gina de estat\u00edsticas. Voc\u00ea pode redirecionar para a p\u00e1gina de login se voc\u00ea n\u00e3o estiver logado. Aqui eu uso o localhost, voc\u00ea pode ajustar este URL.<\/p>\n<p>Na p\u00e1gina de estat\u00edsticas, voc\u00ea obter\u00e1 an\u00e1lises b\u00e1sicas do seu blog, como o n\u00famero de visualiza\u00e7\u00f5es, visitantes, a tend\u00eancia de cada artigo, etc.<\/p>\n<p>Na se\u00e7\u00e3o de cabe\u00e7alho, voc\u00ea pode obter os menus para criar postagens, tags, t\u00f3picos, configura\u00e7\u00f5es, etc. Voc\u00ea deve brincar com todos esses menus. \u00c9 simples e f\u00e1cil de entender.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20562-6082053455c32.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20562-6082053455c32.png\" alt=\"Como criar um blog com o Laravel\" ><\/a><\/p>\n<p>Ao clicar no bot\u00e3o &#8216;Novo Post&#8217;, voc\u00ea ser\u00e1 redirecionado para uma p\u00e1gina onde poder\u00e1 adicionar o seu artigo. Voc\u00ea tamb\u00e9m pode adicionar imagens em destaque, configura\u00e7\u00f5es de SEO, tags e t\u00f3picos ao artigo. Observe os tr\u00eas pontos pr\u00f3ximos ao bot\u00e3o Publicar. Ao clicar nesses pontos, voc\u00ea obt\u00e9m todas essas op\u00e7\u00f5es.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20562-608205351f558.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20562-608205351f558.png\" alt=\"Como criar um blog com o Laravel\" ><\/a><\/p>\n<p>Captura de tela acima mostrando a cor de fundo conforme eu defino o modo escuro. No seu caso, voc\u00ea pode ver o fundo branco. Portanto, n\u00e3o se confunda com isso. O usu\u00e1rio pode encontrar esse recurso de modo escuro na p\u00e1gina Configura\u00e7\u00f5es.<\/p>\n<p>O Canvas possui um recurso de salvamento autom\u00e1tico para que voc\u00ea n\u00e3o perca seu trabalho.<\/p>\n<p>A interface deste pacote \u00e9 direta. Voc\u00ea pode se familiarizar facilmente com ele em nenhum momento. A pr\u00f3xima coisa que precisamos ver \u00e9 a exibi\u00e7\u00e3o de seus artigos no front end.<\/p>\n<h4>Publica\u00e7\u00e3o de artigos no site<\/h4>\n<p>Quando terminar de usar o back-end, voc\u00ea precisar\u00e1 exibir seus artigos no front end. Requer a defini\u00e7\u00e3o de algumas rotas e m\u00e9todos no arquivo do controlador. A biblioteca Canvas fez esse trabalho \u00e1rduo para voc\u00ea. Na p\u00e1gina GitHub desta biblioteca, voc\u00ea obter\u00e1 o c\u00f3digo para ela. Adicione as rotas abaixo em seu <code>routes\/web.php<\/code>arquivo.<\/p>\n<pre><code>\/\/ Get all published posts\nRoute::get('blog', 'BlogController@getPosts');\n\u00a0\n\/\/ Get posts for a given tag\nRoute::get('tag\/{slug}', 'BlogController@getPostsByTag');\n\u00a0\n\/\/ Get posts for a given topic\nRoute::get('topic\/{slug}', 'BlogController@getPostsByTopic');\n\u00a0\n\/\/ Find a single post\nRoute::middleware('CanvasHttpMiddlewareSession')-&gt;get('{slug}', 'BlogController@findPostBySlug');<\/code><\/pre>\n<p>Crie um controlador BlogController usando o comando:<\/p>\n<pre><code>php artisan make:controller BlogController<\/code><\/pre>\n<p>Voc\u00ea <code>BlogController.php<\/code>ter\u00e1 o c\u00f3digo abaixo.<\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppHttpControllers;\n\u00a0\nuse IlluminateHttpRequest;\n\u00a0\nclass BlogController extends Controller\n{\n\u00a0\u00a0\u00a0\u00a0public function getPosts()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$data = [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'posts' =&gt; CanvasPost::published()-&gt;orderByDesc('published_at')-&gt;simplePaginate(10),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('blog.index', compact('data'));\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function getPostsByTag(string $slug)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (CanvasTag::where('slug', $slug)-&gt;first()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$data = [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'posts' =&gt; CanvasPost::whereHas('tags', function ($query) use ($slug) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$query-&gt;where('slug', $slug);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})-&gt;published()-&gt;orderByDesc('published_at')-&gt;simplePaginate(10),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('blog.index', compact('data'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0abort(404);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function getPostsByTopic(string $slug)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (CanvasTopic::where('slug', $slug)-&gt;first()) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$data = [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'posts' =&gt; CanvasPost::whereHas('topic', function ($query) use ($slug) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$query-&gt;where('slug', $slug);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})-&gt;published()-&gt;orderByDesc('published_at')-&gt;simplePaginate(10),\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('blog.index', compact('data'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0abort(404);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public function findPostBySlug(string $slug)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$posts = CanvasPost::with('tags', 'topic')-&gt;published()-&gt;get();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$post = $posts-&gt;firstWhere('slug', $slug);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (optional($post)-&gt;published) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$data = [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'author' =&gt; $post-&gt;user,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'post'\u00a0\u00a0 =&gt; $post,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'meta'\u00a0\u00a0 =&gt; $post-&gt;meta,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0];\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ IMPORTANT: This event must be called for tracking visitor\/view traffic\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0event(new CanvasEventsPostViewed($post));\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('blog.show', compact('data'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0abort(404);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<h4>Criar arquivos blade<\/h4>\n<p>Conforme definido no controlador, vamos criar um arquivo blade <code>blog\/index.blade.php<\/code>e <code>blog\/show.blade.php<\/code>. Neste tutorial, n\u00e3o vou criar uma lista de blog e uma p\u00e1gina de detalhes. Como cada um de voc\u00eas tem um design separado. Vou imprimir artigos no arquivo blade. Voc\u00ea pode aplicar a correspond\u00eancia de design com o seu site.<\/p>\n<p><strong>blog \/ index.blade.php<\/strong><\/p>\n<pre><code>&lt;ul&gt;\n\u00a0\u00a0\u00a0\u00a0@foreach($data['posts'] as $d)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;li&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h2&gt;&lt;a href=\"{{url($d['slug'])}}\"&gt;{{ $d['title'] }}&lt;\/a&gt;&lt;\/h2&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;{!! $d['body'] !!}&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/li&gt;\n\u00a0\u00a0\u00a0\u00a0@endforeach\n&lt;\/ul&gt;<\/code><\/pre>\n<p><strong>blog \/ show.blade.php<\/strong><\/p>\n<pre><code>@if($data['post']['featured_image'])\n\u00a0\u00a0\u00a0\u00a0&lt;img src=\"{{ url($data['post']['featured_image']) }}\" alt=\"{{ $data['post']['featured_image_caption'] }}\" \/&gt;\n@endif\n&lt;h2&gt;{{ $data['post']['title'] }}&lt;\/h2&gt;\n{!! $data['post']['body'] !!}<\/code><\/pre>\n<p>Eu sugeriria imprimir a <code>$data<\/code>vari\u00e1vel e verificar todas as informa\u00e7\u00f5es que essa vari\u00e1vel cont\u00e9m. Voc\u00ea provavelmente deseja usar outros detalhes tamb\u00e9m desta vari\u00e1vel.<\/p>\n<p>Espero que voc\u00ea entenda como criar um blog com o Laravel usando um pacote Canvas. Voc\u00ea pode aprender mais sobre este pacote em <a href=\"https:\/\/github.com\/cnvs\/canvas\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cnvs \/ canvas<\/a>.<\/p>\n<h4>Artigos relacionados<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/como-criar-honeypot-para-combate-com-formulario-de-spam-no-laravel\/\" title=\"Como Criar Honeypot para Combate com Formul\u00e1rio de Spam no Laravel\">Como Criar Honeypot para Combate com Formul\u00e1rio de Spam no Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pt-pt\/faca-backup-do-aplicativo-laravel-no-dropbox\/\" title=\"Fa\u00e7a backup do aplicativo Laravel no Dropbox\">Fa\u00e7a backup do aplicativo Laravel no Dropbox<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em seu aplicativo, voc\u00ea pode querer integrar uma p\u00e1gina de blog. Neste artigo, mostro como um t\u00e1xi cria um blog com o Laravel. O usu\u00e1rio pode usar a tela<\/p>\n","protected":false},"author":1,"featured_media":20563,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[502],"tags":[848],"class_list":["post-27579","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/27579","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/comments?post=27579"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/posts\/27579\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media\/20563"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/media?parent=27579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/categories?post=27579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pt-pt\/wp-json\/wp\/v2\/tags?post=27579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}