{"id":10051,"date":"2020-10-06T11:16:40","date_gmt":"2020-10-06T14:16:40","guid":{"rendered":"https:\/\/www.dialhost.com.br\/blog\/?p=10051"},"modified":"2020-10-08T12:44:14","modified_gmt":"2020-10-08T15:44:14","slug":"laravel-8-melhorias-novidades-lancamento","status":"publish","type":"post","link":"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/","title":{"rendered":"Laravel 8 &#8211; O lan\u00e7amento da nova vers\u00e3o cheia de novidades!"},"content":{"rendered":"<p>Setembro de 2020 marcou a chegada de uma das mais aguardadas atualiza\u00e7\u00f5es dentro da comunidade de desenvolvimento: o Laravel 8 o lan\u00e7amento da nova vers\u00e3o cheia de novidades!<\/p>\n<p dir=\"auto\" data-sourcepos=\"10:1-10:211\">O Laravel \u00e9 um framework de aplica\u00e7\u00e3o web e sua base \u00e9 o PHP. Como principal fun\u00e7\u00e3o buscar facilitar as tarefas comuns usadas na maioria dos projetos web, como <a href=\"https:\/\/www.dialhost.com.br\/blog\/middlewares-no-laravel\/\">autentica\u00e7\u00e3o<\/a>, roteamento, sess\u00f5es e cache.<\/p>\n<p dir=\"auto\" data-sourcepos=\"12:1-12:232\">Tornar o processo de desenvolvimento agrad\u00e1vel para o desenvolvedor sem sacrificar a funcionalidade do aplicativo \u00e9 m\u00fasica aos ouvidos, tanto para quem est\u00e1 come\u00e7ando como para quem j\u00e1 domina as tarefas do lado backend da Web.<\/p>\n<p dir=\"auto\" data-sourcepos=\"14:1-14:293\">O Laravel 8 continua com as melhorias feitas no Laravel 7.x, introduzindo Laravel Jetstream, classes de model factory, migration squashing para seus arquivos de migra\u00e7\u00e3o, uma nova funcionalidade de Job Batching al\u00e9m de uma variedade de outras corre\u00e7\u00f5es de bugs e melhorias de usabilidade.<\/p>\n<div id=\"toc_container\" class=\"have_bullets\"><p class=\"toc_title\">T&oacute;picos<\/p><ul class=\"toc_list\"><li><a href=\"#laravel-jetstream\">Laravel JetStream<\/a><\/li><li><a href=\"#models-agora-organizados-dentro-de-pastas\">Models agora organizados dentro de pastas<\/a><\/li><li><a href=\"#classes-de-model-factory\">Classes de Model Factory<\/a><\/li><li><a href=\"#migration-squashing\">Migration Squashing<\/a><\/li><li><a href=\"#job-batching\">Job Batching<\/a><\/li><li><a href=\"#modo-de-manutencao\">Modo de manuten\u00e7\u00e3o<\/a><\/li><li><a href=\"#pre-renderizacao-do-modo-de-manutencao\">Pr\u00e9 renderiza\u00e7\u00e3o do Modo de manuten\u00e7\u00e3o<\/a><\/li><li><a href=\"#ajudantes-de-teste-de-tempo\">Ajudantes de teste de tempo<\/a><\/li><li><a href=\"#melhorias-no-comando-artisan-serve\">Melhorias no Comando Artisan Serve<\/a><\/li><li><a href=\"#isualizacoes-de-paginacao-do-tailwind-css\">isualiza\u00e7\u00f5es de pagina\u00e7\u00e3o do Tailwind CSS<\/a><\/li><li><a href=\"#roteamento-de-atualizacoes-de-namespace\">Roteamento de atualiza\u00e7\u00f5es de namespace<\/a><\/li><li><a href=\"#instalacao\">Instala\u00e7\u00e3o<\/a><\/li><li><a href=\"#composer\">Composer<\/a><\/li><\/ul><\/div>\n<h2 dir=\"auto\" data-sourcepos=\"16:1-16:20\"><span id=\"laravel-jetstream\">Laravel JetStream<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"18:1-18:288\">O <a href=\"https:\/\/github.com\/laravel\/jetstream\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">Jetstream<\/a> fornece o ponto de partida perfeito para seu pr\u00f3ximo projeto incluindo login, registro, verifica\u00e7\u00e3o de e-mail, autentica\u00e7\u00e3o de dois fatores, gerenciamento de sess\u00e3o, suporte de API via Laravel Sanctum e gerenciamento de usu\u00e1rios.<\/p>\n<p dir=\"auto\" data-sourcepos=\"20:1-20:255\">Este pacote ir\u00e1 aprimorar e substituir a estrutura de template base de autentica\u00e7\u00e3o do usu\u00e1rio das vers\u00f5es anteriores do Laravel, entregando mais seguran\u00e7a e facilidade. O Jetstream \u00e9 projetado utilizando o Tailwind <a href=\"https:\/\/tailwindcss.com\/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">CSS<\/a>.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"22:1-22:44\"><span id=\"models-agora-organizados-dentro-de-pastas\">Models agora organizados dentro de pastas<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"24:1-24:262\">\u00c9 isso mesmo o que voc\u00ea leu! Agora todos os desenvolvedores que sofriam com a organiza\u00e7\u00e3o das Models tiveram seus problemas encerrados. Se antes as models ficavam por padr\u00e3o na pasta raiz de app, agora elas possuem uma pasta para chamar de sua: app\/Models.<\/p>\n<p dir=\"auto\" data-sourcepos=\"26:1-26:317\">Todos os comandos relevantes do gerador foram atualizados para assumir que os modelos existem no diret\u00f3rio app\/Models. O desenvolvedor ainda tem a liberdade de colocar suas models dentro do diret\u00f3rio raiz da pasta app sem maiores problemas. O que vale s\u00e3o as possibilidades para a organiza\u00e7\u00e3o de sua aplica\u00e7\u00e3o.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"28:1-28:27\"><span id=\"classes-de-model-factory\">Classes de Model Factory<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"30:1-30:176\">As model factories foram inteiramente reescritas e aprimoradas para serem utilizadas como classes. Por exemplo, a UserFactory inclu\u00edda no Laravel \u00e9 escrita da seguinte forma.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">&lt;?php<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">namespace Database\\Factories;<\/span>\r\n<span id=\"LC4\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC5\" class=\"line\" lang=\"plaintext\">use App\\Models\\User;<\/span>\r\n<span id=\"LC6\" class=\"line\" lang=\"plaintext\">use Illuminate\\Database\\Eloquent\\Factories\\Factory;<\/span>\r\n<span id=\"LC7\" class=\"line\" lang=\"plaintext\">use Illuminate\\Support\\Str;<\/span>\r\n<span id=\"LC8\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC9\" class=\"line\" lang=\"plaintext\">class UserFactory extends Factory<\/span>\r\n<span id=\"LC10\" class=\"line\" lang=\"plaintext\">{<\/span>\r\n<span id=\"LC11\" class=\"line\" lang=\"plaintext\">    \/**<\/span>\r\n<span id=\"LC12\" class=\"line\" lang=\"plaintext\">     * The name of the factory's corresponding model.<\/span>\r\n<span id=\"LC13\" class=\"line\" lang=\"plaintext\">     *<\/span>\r\n<span id=\"LC14\" class=\"line\" lang=\"plaintext\">     * @var string<\/span>\r\n<span id=\"LC15\" class=\"line\" lang=\"plaintext\">     *\/<\/span>\r\n<span id=\"LC16\" class=\"line\" lang=\"plaintext\">    protected $model = User::class;<\/span>\r\n<span id=\"LC17\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC18\" class=\"line\" lang=\"plaintext\">    \/**<\/span>\r\n<span id=\"LC19\" class=\"line\" lang=\"plaintext\">     * Define the model's default state.<\/span>\r\n<span id=\"LC20\" class=\"line\" lang=\"plaintext\">     *<\/span>\r\n<span id=\"LC21\" class=\"line\" lang=\"plaintext\">     * @return array<\/span>\r\n<span id=\"LC22\" class=\"line\" lang=\"plaintext\">     *\/<\/span>\r\n<span id=\"LC23\" class=\"line\" lang=\"plaintext\">    public function definition()<\/span>\r\n<span id=\"LC24\" class=\"line\" lang=\"plaintext\">    {<\/span>\r\n<span id=\"LC25\" class=\"line\" lang=\"plaintext\">        return [<\/span>\r\n<span id=\"LC26\" class=\"line\" lang=\"plaintext\">            'name' =&gt; $this-&gt;faker-&gt;name,<\/span>\r\n<span id=\"LC27\" class=\"line\" lang=\"plaintext\">            'email' =&gt; $this-&gt;faker-&gt;unique()-&gt;safeEmail,<\/span>\r\n<span id=\"LC28\" class=\"line\" lang=\"plaintext\">            'email_verified_at' =&gt; now(),<\/span>\r\n<span id=\"LC29\" class=\"line\" lang=\"plaintext\">            'password' =&gt; '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC\/.og\/at2.uheWG\/igi', \/\/ password<\/span>\r\n<span id=\"LC30\" class=\"line\" lang=\"plaintext\">            'remember_token' =&gt; Str::random(10),<\/span>\r\n<span id=\"LC31\" class=\"line\" lang=\"plaintext\">        ];<\/span>\r\n<span id=\"LC32\" class=\"line\" lang=\"plaintext\">    }<\/span>\r\n<span id=\"LC33\" class=\"line\" lang=\"plaintext\">}<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"68:1-68:150\">Gra\u00e7as ao novo trait HasFactory pode ser verificada a exist\u00eancia do factory dispon\u00edvel nos modelos gerados, sendo utilizada como descrito a seguir.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">use App\\Models\\User;<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">User::factory()-&gt;count(50)-&gt;create();<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"76:1-76:368\">Como as Model Factory agora s\u00e3o classes PHP simples, as transforma\u00e7\u00f5es de estado podem ser escritas como m\u00e9todos de classe, o que traz facilidade para adicionar outras classes auxiliares dentro dos seus Modelos. Exemplos completos dessa funcionalidade est\u00e3o na <a href=\"https:\/\/laravel.com\/docs\/8.x\/database-testing#creating-factories\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">documenta\u00e7\u00e3o oficial<\/a> do Laravel.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"78:1-78:22\"><span id=\"migration-squashing\">Migration Squashing<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"80:1-80:383\">Sua aplica\u00e7\u00e3o j\u00e1 passou por v\u00e1rias vers\u00f5es, podendo ter acumulado mais e mais arquivos de <a href=\"https:\/\/www.dialhost.com.br\/blog\/migrations-relacionando-tabelas-laravel\/\">migrations<\/a> ao longo do tempo. Isso pode fazer com que seu diret\u00f3rio de migra\u00e7\u00e3o fique um tanto quanto inchado. Pensando nisso, se sua aplica\u00e7\u00e3o estiver usando MySQL ou PostgreSQL, agora voc\u00ea pode &#8220;esmagar&#8221; suas migra\u00e7\u00f5es em um \u00fanico arquivo SQL. Para come\u00e7ar, execute o comando.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">schema: dump:<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"86:1-86:408\">Quando voc\u00ea executa este comando, o Laravel escrever\u00e1 um arquivo &#8220;schema&#8221; na sua pasta database\/schema . Agora, quando voc\u00ea tentar migrar seu banco de dados e nenhuma outra migra\u00e7\u00e3o for executada, o Laravel executar\u00e1 o SQL do arquivo de schema primeiro. Ap\u00f3s rodar os comandos do arquivo de schema, o Laravel executar\u00e1 todas as migrations restantes que n\u00e3o fizeram parte do arquivo de schema criado.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"88:1-88:15\"><span id=\"job-batching\">Job Batching<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"90:1-90:185\">O recurso de Job Batching do Laravel permite que voc\u00ea execute facilmente um lote de Jobs (trabalhos) e em seguida, execute alguma a\u00e7\u00e3o quando o lote tiver conclu\u00eddo sua opera\u00e7\u00e3o.<\/p>\n<p dir=\"auto\" data-sourcepos=\"92:1-92:292\">O novo m\u00e9todo Batch do facade bus pode ser usado para despachar um lote de trabalhos. O envio em lote \u00e9 \u00fatil principalmente quando combinado com retornos de chamada de conclus\u00e3o. Portanto, voc\u00ea pode usar os m\u00e9todos then, catch e finally para definir retornos de conclus\u00e3o para o lote.<\/p>\n<p dir=\"auto\" data-sourcepos=\"94:1-94:103\">Cada um desses retornos de chamada receber\u00e1 uma inst\u00e2ncia Illuminate\\Bus\\Batch quando forem chamados.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">use App\\Jobs\\ProcessPodcast;<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\">use App\\Podcast;<\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">use Illuminate\\Bus\\Batch;<\/span>\r\n<span id=\"LC4\" class=\"line\" lang=\"plaintext\">use Illuminate\\Support\\Facades\\Bus;<\/span>\r\n<span id=\"LC5\" class=\"line\" lang=\"plaintext\">use Throwable;<\/span>\r\n<span id=\"LC6\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC7\" class=\"line\" lang=\"plaintext\">$batch = Bus::batch([<\/span>\r\n<span id=\"LC8\" class=\"line\" lang=\"plaintext\">    new ProcessPodcast(Podcast::find(1)),<\/span>\r\n<span id=\"LC9\" class=\"line\" lang=\"plaintext\">    new ProcessPodcast(Podcast::find(2)),<\/span>\r\n<span id=\"LC10\" class=\"line\" lang=\"plaintext\">    new ProcessPodcast(Podcast::find(3)),<\/span>\r\n<span id=\"LC11\" class=\"line\" lang=\"plaintext\">    new ProcessPodcast(Podcast::find(4)),<\/span>\r\n<span id=\"LC12\" class=\"line\" lang=\"plaintext\">    new ProcessPodcast(Podcast::find(5)),<\/span>\r\n<span id=\"LC13\" class=\"line\" lang=\"plaintext\">])-&gt;then(function (Batch $batch) {<\/span>\r\n<span id=\"LC14\" class=\"line\" lang=\"plaintext\">    \/\/ All jobs completed successfully...<\/span>\r\n<span id=\"LC15\" class=\"line\" lang=\"plaintext\">})-&gt;catch(function (Batch $batch, Throwable $e) {<\/span>\r\n<span id=\"LC16\" class=\"line\" lang=\"plaintext\">    \/\/ First batch job failure detected...<\/span>\r\n<span id=\"LC17\" class=\"line\" lang=\"plaintext\">})-&gt;finally(function (Batch $batch) {<\/span>\r\n<span id=\"LC18\" class=\"line\" lang=\"plaintext\">    \/\/ The batch has finished executing...<\/span>\r\n<span id=\"LC19\" class=\"line\" lang=\"plaintext\">})-&gt;dispatch();<\/span>\r\n<span id=\"LC20\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC21\" class=\"line\" lang=\"plaintext\">return $batch-&gt;id;<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"120:1-120:243\">Executar os trabalhos e ter o retorno das a\u00e7\u00f5es ajuda muito na tarefa de debug. Para saber mais sobre Job Batching, acesse a <a href=\"https:\/\/laravel.com\/docs\/8.x\/queues#job-batching\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">documenta\u00e7\u00e3o completa<\/a>, pois ela possui uma s\u00e9rie de exemplos.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"122:1-122:23\"><span id=\"modo-de-manutencao\">Modo de manuten\u00e7\u00e3o<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"124:1-124:347\">Em vers\u00f5es anteriores do Laravel, o recurso do modo de manuten\u00e7\u00e3o do php artisan podia ser contornado usando uma &#8220;lista de permiss\u00e3o&#8221; de endere\u00e7os IP que tinham autoriza\u00e7\u00e3o para acessar o aplicativo. Este recurso foi removido em favor de uma solu\u00e7\u00e3o mais simples \u2013 secret \u2013 em que uma senha \u00e9 criada para se ter acesso a aplica\u00e7\u00e3o.<\/p>\n<p dir=\"auto\" data-sourcepos=\"126:1-126:21\">Confira esse exemplo abaixo.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">php artisan down --secret=\"1630542a-246b-4b66-afa1-dd72a4c43515\"<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"132:1-132:160\">Ap\u00f3s esse comando ser executado, a aplica\u00e7\u00e3o ou site em &#8220;segredo&#8221; poder\u00e1 ser acessada por meio de uma combina\u00e7\u00e3o de endere\u00e7o + senha criada, desta forma.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">https:\/\/example.com\/1630542a-246b-4b66-afa1-dd72a4c43515<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"138:1-138:289\">Isso acontece porque o Laravel emitir\u00e1 um cookie de desvio de modo de manuten\u00e7\u00e3o para o seu navegador web, podendo ent\u00e3o navegar normalmente como se aplicativo ou site n\u00e3o estivesse em modo de manuten\u00e7\u00e3o. Pense em como esse recurso poder\u00e1 ajudar a exibir seu projeto nas reuni\u00f5es!<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"140:1-140:46\"><span id=\"pre-renderizacao-do-modo-de-manutencao\">Pr\u00e9 renderiza\u00e7\u00e3o do Modo de manuten\u00e7\u00e3o<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"142:1-142:243\">Se voc\u00ea utilizar o comando php artisan down durante a implanta\u00e7\u00e3o, seus usu\u00e1rios ainda podem encontrar erros se acessarem o aplicativo enquanto as depend\u00eancias do Composer ou outros componentes de infraestrutura est\u00e3o sendo atualizados.<\/p>\n<p dir=\"auto\" data-sourcepos=\"144:1-144:228\">Isso ocorre porque uma parte significativa do framework Laravel deve inicializar para determinar se sua aplica\u00e7\u00e3o est\u00e1 em modo de manuten\u00e7\u00e3o e renderizar a visualiza\u00e7\u00e3o do modo de manuten\u00e7\u00e3o usando o motor de templates.<\/p>\n<p dir=\"auto\" data-sourcepos=\"146:1-146:277\">Por esta raz\u00e3o, o Laravel agora permite que voc\u00ea pr\u00e9-renderize uma visualiza\u00e7\u00e3o do modo de manuten\u00e7\u00e3o que ser\u00e1 retornada no in\u00edcio do ciclo de solicita\u00e7\u00e3o. Esta visualiza\u00e7\u00e3o \u00e9 renderizada antes que qualquer uma das depend\u00eancias do seu aplicativo seja carregada.<\/p>\n<p dir=\"auto\" data-sourcepos=\"148:1-148:109\">Voc\u00ea pode pr\u00e9-renderizar um modelo de sua escolha usando a op\u00e7\u00e3o de renderiza\u00e7\u00e3o do comando abaixo.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">php artisan down --render=\"errors::503\"<\/span><\/code><\/pre>\n<h2 dir=\"auto\" data-sourcepos=\"154:1-154:30\"><span id=\"ajudantes-de-teste-de-tempo\">Ajudantes de teste de tempo<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"156:1-156:168\">Ao realizar os testes em sua aplica\u00e7\u00e3o, voc\u00ea pode ocasionalmente precisar modificar o tempo retornado por ajudantes como now ou Illuminate\\Support\\ Carbon :: now ().<\/p>\n<p dir=\"auto\" data-sourcepos=\"158:1-158:118\">A classe de teste de recursos b\u00e1sicos do Laravel agora inclui ajudantes que permitem a voc\u00ea manipular o tempo atual.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">public function testTimeCanBeManipulated()<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\">{<\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">    \/\/ Travel into the future...<\/span>\r\n<span id=\"LC4\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;milliseconds();<\/span>\r\n<span id=\"LC5\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;seconds();<\/span>\r\n<span id=\"LC6\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;minutes();<\/span>\r\n<span id=\"LC7\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;hours();<\/span>\r\n<span id=\"LC8\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;days();<\/span>\r\n<span id=\"LC9\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;weeks();<\/span>\r\n<span id=\"LC10\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(5)-&gt;years();<\/span>\r\n<span id=\"LC11\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC12\" class=\"line\" lang=\"plaintext\">    \/\/ Travel into the past...<\/span>\r\n<span id=\"LC13\" class=\"line\" lang=\"plaintext\">    $this-&gt;travel(-5)-&gt;hours();<\/span>\r\n<span id=\"LC14\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC15\" class=\"line\" lang=\"plaintext\">    \/\/ Travel to an explicit time...<\/span>\r\n<span id=\"LC16\" class=\"line\" lang=\"plaintext\">    $this-&gt;travelTo(now()-&gt;subHours(6));<\/span>\r\n<span id=\"LC17\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC18\" class=\"line\" lang=\"plaintext\">    \/\/ Return back to the present time...<\/span>\r\n<span id=\"LC19\" class=\"line\" lang=\"plaintext\">    $this-&gt;travelBack();<\/span>\r\n<span id=\"LC20\" class=\"line\" lang=\"plaintext\">}<\/span><\/code><\/pre>\n<h2 dir=\"auto\" data-sourcepos=\"183:1-183:37\"><span id=\"melhorias-no-comando-artisan-serve\">Melhorias no Comando Artisan Serve<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"185:1-185:276\">O comando Artisan <code>serve<\/code> foi aprimorado. Agora ele conta com o recurso autom\u00e1tico de recarregar quando mudan\u00e7as de vari\u00e1veis s\u00e3o detectadas em seu arquivo <code>.env<\/code> local. Anteriormente, as altera\u00e7\u00f5es seriam carregadas somente reiniciando manualmente o servidor.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"187:1-187:49\"><span id=\"isualizacoes-de-paginacao-do-tailwind-css\">isualiza\u00e7\u00f5es de pagina\u00e7\u00e3o do Tailwind CSS<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"189:1-189:419\">O paginador do Laravel foi atualizado, agora por padr\u00e3o ele utilizar\u00e1 o framework CSS do Tailwind. O <a href=\"https:\/\/tailwindcss.com\/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">Tailwind CSS<\/a> \u00e9 uma estrutura CSS de baixo n\u00edvel altamente personaliz\u00e1vel que fornece todos os blocos de constru\u00e7\u00e3o de que voc\u00ea precisa para criar designs sob medida, sem nenhum estilo opinativo irritante. Claro, as visualiza\u00e7\u00f5es do Bootstrap 3 e 4 tamb\u00e9m permanecem dispon\u00edveis.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"191:1-191:44\"><span id=\"roteamento-de-atualizacoes-de-namespace\">Roteamento de atualiza\u00e7\u00f5es de namespace<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"193:1-193:249\">Em vers\u00f5es anteriores do Laravel, o RouteServiceProvider continha uma propriedade $namespace. O valor desta propriedade seria automaticamente prefixado nas defini\u00e7\u00f5es de rota do controlador e chamadas para o action helper \/ URL :: action method.<\/p>\n<p dir=\"auto\" data-sourcepos=\"195:1-195:285\">No Laravel 8.x, esta propriedade \u00e9 nula por padr\u00e3o. Isso significa que nenhum prefixo de namespace autom\u00e1tico ser\u00e1 feito pelo Laravel. Portanto, em novos aplicativos Laravel 8.x, as defini\u00e7\u00f5es de rota do controlador devem ser definidas usando a sintaxe padr\u00e3o de chamada do PHP.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">use App\\Http\\Controllers\\UserController;<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">Route::get('\/users', [UserController::class, 'index']);<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"203:1-203:100\">As chamadas para os m\u00e9todos relacionados \u00e0 a\u00e7\u00e3o devem usar a mesma sintaxe que pode ser chamada.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">action([UserController::class, 'index']);<\/span>\r\n<span id=\"LC2\" class=\"line\" lang=\"plaintext\"><\/span>\r\n<span id=\"LC3\" class=\"line\" lang=\"plaintext\">return Redirect::action([UserController::class, 'index']);<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"211:1-211:372\">Se voc\u00ea preferir o prefixo de rota do controlador no estilo Laravel 7.x, pode simplesmente adicionar a propriedade $namespace no RouteServiceProvider de sua aplica\u00e7\u00e3o. \u00c9 importante ressaltar que esta mudan\u00e7a afeta apenas os novos aplicativos do Laravel 8.x. Os aplicativos atualizados do Laravel 7.x ainda ter\u00e3o a propriedade $ namespace em seu RouteServiceProvider.<\/p>\n<h2 dir=\"auto\" data-sourcepos=\"213:1-213:15\"><span id=\"instalacao\">Instala\u00e7\u00e3o<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"215:1-215:177\">Se voc\u00ea j\u00e1 utiliza um servidor remoto, seja numa nuvem, VPS ou mesmo em um plano de hospedagem compartilhada, \u00e9 seu dever checar os requisitos de sistema para a instala\u00e7\u00e3o.<\/p>\n<ul dir=\"auto\" data-sourcepos=\"217:1-227:0\">\n<li data-sourcepos=\"217:1-217:32\">PHP na vers\u00e3o 7.3 ou superior<\/li>\n<li data-sourcepos=\"218:1-218:28\">BCMath PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"219:1-219:27\">Ctype PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"220:1-220:30\">Fileinfo PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"221:1-221:26\">JSON PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"222:1-222:30\">Mbstring PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"223:1-223:29\">OpenSSL PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"224:1-224:25\">PDO PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"225:1-225:31\">Tokenizer PHP Extens\u00e3o ativa<\/li>\n<li data-sourcepos=\"226:1-227:0\">XML PHP Extens\u00e3o ativa<\/li>\n<\/ul>\n<h2 dir=\"auto\" data-sourcepos=\"228:1-228:11\"><span id=\"composer\">Composer<\/span><\/h2>\n<p dir=\"auto\" data-sourcepos=\"230:1-230:157\">O Laravel utiliza o Composer para gerenciar suas depend\u00eancias. Portanto, antes de usar o Laravel, certifique-se de ter o Composer instalado em sua m\u00e1quina.<\/p>\n<p dir=\"auto\" data-sourcepos=\"232:1-232:81\">Caso voc\u00ea n\u00e3o tenha, primeiro, baixe o instalador do Laravel usando o Composer.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">composer global require laravel\/installer<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"238:1-238:282\">Certifique-se de colocar o diret\u00f3rio bin do Composer em seu $PATH para que o execut\u00e1vel Laravel possa ser localizado por seu sistema. Este diret\u00f3rio existe em diferentes locais com base em seu sistema operacional. No entanto, alguns locais comuns incluem os diret\u00f3rios a seguir.<\/p>\n<ul dir=\"auto\" data-sourcepos=\"240:1-243:0\">\n<li data-sourcepos=\"240:1-240:37\">macOS: <code>$HOME\/.composer\/vendor\/bin<\/code><\/li>\n<li data-sourcepos=\"241:1-241:62\">Windows: <code>%USERPROFILE%\\AppData\\Roaming\\Composer\\vendor\\bin<\/code><\/li>\n<li data-sourcepos=\"242:1-243:0\">GNU \/ Linux Distributions: <code>$HOME\/.config\/composer\/vendor\/bin<\/code> or <code>$HOME\/.composer\/vendor\/bin<\/code><\/li>\n<\/ul>\n<p dir=\"auto\" data-sourcepos=\"244:1-244:276\">Uma vez instalado, o comando laravel new criar\u00e1 uma nova instala\u00e7\u00e3o do Laravel no diret\u00f3rio que voc\u00ea especificar. Por exemplo, &#8220;laravel new blog&#8221; criar\u00e1 um diret\u00f3rio chamado &#8220;blog&#8221; contendo uma nova instala\u00e7\u00e3o do Laravel com todas as depend\u00eancias do j\u00e1 instaladas.<\/p>\n<pre class=\"code highlight js-syntax-highlight plaintext white\" lang=\"plaintext\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">laravel new blog<\/span><\/code><\/pre>\n<p dir=\"auto\" data-sourcepos=\"250:1-250:520\">O Laravel 8 agora tambem serve como marco, pois partindo do seu lan\u00e7amento ele agora segue oficialmente a nomenclatura de versionamento sem\u00e2ntico de vers\u00f5es. A cada 6 meses \u00e9 lan\u00e7ado uma major version. A vers\u00e3o 8 atual ter\u00e1 suporte oficial at\u00e9 Setembro de 2021. Existe muito mais sobre o Laravel 8 e que podem ser acessadas pela <a href=\"https:\/\/laravel.com\/docs\/8.x\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">p\u00e1gina oficial<\/a> do lan\u00e7amento. Vale conferir tamb\u00e9m o GitHub do excelent\u00edssimo <a href=\"https:\/\/github.com\/taylorotwell\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">Taylor Otwell<\/a>, criador do Laravel.<\/p>\n<p dir=\"auto\" data-sourcepos=\"252:1-252:133\">Voc\u00ea j\u00e1 utiliza o Laravel? Conte-nos um pouco mais sobre os seus projetos e como esta nova vers\u00e3o poder\u00e1 otimizar sua produ\u00e7\u00e3o!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste artigo, voc\u00ea aprender\u00e1 sobre as novidades do lan\u00e7amento do Framework Laravel 8. Com melhorias de seguran\u00e7a e autentica\u00e7\u00e3o al\u00e9m uma variedade de outras corre\u00e7\u00f5es de bugs e melhorias de usabilidade.<\/p>\n","protected":false},"author":1,"featured_media":10075,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[17,3,23,24,12],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Laravel 8 - O lan\u00e7amento da nova vers\u00e3o cheia de novidades! Laravel -<\/title>\n<meta name=\"description\" content=\"O Laravel 8 traz uma variedade de otimiza\u00e7\u00f5es, corre\u00e7\u00f5es de bugs e melhorias de usabilidade e seguran\u00e7a para toda a comunidade PHP. Laravel\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel 8 - O lan\u00e7amento da nova vers\u00e3o cheia de novidades! Laravel -\" \/>\n<meta property=\"og:description\" content=\"O Laravel 8 traz uma variedade de otimiza\u00e7\u00f5es, corre\u00e7\u00f5es de bugs e melhorias de usabilidade e seguran\u00e7a para toda a comunidade PHP. Laravel\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog DialHost\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-06T14:16:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-08T15:44:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2020\/10\/laravel8.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1400\" \/>\n\t<meta property=\"og:image:height\" content=\"708\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dialhost\" \/>\n<meta name=\"twitter:site\" content=\"@dialhost\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\",\"name\":\"DialHost Internet\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"sameAs\":[\"http:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\",\"https:\/\/twitter.com\/dialhost\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/03\/marca-dialhost.png\",\"width\":81,\"height\":81,\"caption\":\"DialHost Internet\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"name\":\"Blog DialHost\",\"description\":\"Os melhores conte\\u00fados sobre Desenvolvimento Web, Marketing e Neg\\u00f3cios\",\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/www.dialhost.com.br\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2020\/10\/laravel8.jpg\",\"width\":1400,\"height\":708,\"caption\":\"Laravek news\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#webpage\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\",\"name\":\"Laravel 8 - O lan\\u00e7amento da nova vers\\u00e3o cheia de novidades! Laravel -\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#primaryimage\"},\"datePublished\":\"2020-10-06T14:16:40+00:00\",\"dateModified\":\"2020-10-08T15:44:14+00:00\",\"description\":\"O Laravel 8 traz uma variedade de otimiza\\u00e7\\u00f5es, corre\\u00e7\\u00f5es de bugs e melhorias de usabilidade e seguran\\u00e7a para toda a comunidade PHP. Laravel\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"\/blog\/\",\"url\":\"\/blog\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/\",\"name\":\"Laravel 8 &#8211; O lan\\u00e7amento da nova vers\\u00e3o cheia de novidades!\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\"},\"headline\":\"Laravel 8 &#8211; O lan\\u00e7amento da nova vers\\u00e3o cheia de novidades!\",\"datePublished\":\"2020-10-06T14:16:40+00:00\",\"dateModified\":\"2020-10-08T15:44:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#webpage\"},\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#primaryimage\"},\"articleSection\":\"Desenvolvimento,Dicas e Not\\u00edcias,Laravel,PHP,Tecnologias\",\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dialhost.com.br\/blog\/laravel-8-melhorias-novidades-lancamento\/#respond\"]}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\",\"name\":\"DialHost Internet\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/05feec2f99aef1c42b09aeaa637ee66f?s=96&r=g\",\"caption\":\"DialHost Internet\"},\"description\":\"H\\u00e1 mais de 18 anos proporcionando um servi\\u00e7o de hospedagem de sites voltado 100% na Experi\\u00eancia e Sucesso do Cliente, prezando a qualidade, transpar\\u00eancia e seguran\\u00e7a.\",\"sameAs\":[\"https:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/twitter.com\/dialhost\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/10051"}],"collection":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/comments?post=10051"}],"version-history":[{"count":3,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/10051\/revisions"}],"predecessor-version":[{"id":10089,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/10051\/revisions\/10089"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media\/10075"}],"wp:attachment":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media?parent=10051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/categories?post=10051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/tags?post=10051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}