CasadoCódigo “Atudoquetenhodemaisimportantenessavida,minhaesposaJordanae nossaprimeirafilha,Clara.” –RodrigoTurini i CasadoCódigo Agradecimentos Por mais que eu queira e tente muito, nenhum conjunto de palavras será o suficienteparaexpressarmeueternoagradecimentoàminhaesposaJordana enossafamília,queagoraestámaiorcomachegadadapequenaClara. GostariatambémdeagradeceraoDanielTurini,quesempreinfluenciou emmeucrescimentopessoaleprofissional. Foielequemdeumeuprimeiro computadoremeencaminhouaomundodaCiênciadacomputaçãoerecen- tementeaosdiversosprojetosemPHPquedesenvolvemosjuntos. Agradeço também às equipes da Caelum, Alura e Casa do Código, que sãoempresassensacionaisconstituídasporprofissionaisextraordinários.Em especialameusamigosPauloeGuilhermeSilveira,VictorHarada,Maurício AnicheeLuizCorteReal. iii CasadoCódigo Prefácio ApesardeserintimamenteligadoaoJava,umaoutralinguagemdeprograma- ção,hápoucomaisdeumanorecebiodesafiodemanteraaplicaçãointerna deumaempresaamericana,totalmenteescritaemPHP.Nocomeço,otraba- lhofoibemmaisdifícildoqueeuesperava, jáquesetratavadeumprojeto legado,nemumpoucoorientadoaobjetosemuitíssimocomplicadodeman- ter. Depois de um tempo, vimos que a solução mais simples para esse caso seriareescrevertodooprojeto,utilizandoboaspráticas,testesautomatizados easpossibilidadesmaisatuaisdalinguagem.ÉaíqueentraoLaravel. Eujáhaviatidoalgumcontatocomesseframeworkquandoestavatraba- lhandonoconteúdotécnicodocursodePHPdaCaelum,masaoestudá-loa fundoenquantoviabilizavaasopçõesatuais,tiveasensaçãodequeseriauma excelenteescolha.Hoje,eutenhocerteza. OobjetivodesselivroserámostrarporqueoLaraveléaapostadomer- cadoatualeminhaprimeiraopçãodeframeworkMVCemPHP.Criarapli- caçõeselegantesempoucotemponuncafoitãofácil. v CasadoCódigo Sumário Sumário 1 Introdução 1 1.1 Oprojetoeastecnologias . . . . . . . . . . . . . . . . . . . . . 1 1.2 Oqueveremosduranteolivro . . . . . . . . . . . . . . . . . . 3 1.3 DownloaddoLaravel . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 Acesseocódigodesselivro . . . . . . . . . . . . . . . . . . . . 5 1.5 Aproveitandoaomáximooconteúdo . . . . . . . . . . . . . . 5 1.6 Tirandosuasdúvidas . . . . . . . . . . . . . . . . . . . . . . . 5 2 NovoprojetocomLaravel 7 2.1 Comocriarcincotelasdeumaaplicaçãoweb? . . . . . . . . . 7 2.2 Framework,praquetequero? . . . . . . . . . . . . . . . . . . 7 2.3 Novoprojeto:Umaappdecontroledeestoque . . . . . . . . 9 2.4 Entendendoaestruturadepastas . . . . . . . . . . . . . . . . 12 2.5 AlterandoonamespacepadrãocomArtisan . . . . . . . . . . 13 2.6 Criandonossaprimeiralógica . . . . . . . . . . . . . . . . . . 14 2.7 ConflitoentrerotasdoLaravel . . . . . . . . . . . . . . . . . . 17 2.8 Antesdecontinuar. . . . . . . . . . . . . . . . . . . . . . . . . 18 3 MVCeconexãocombancodedados 19 3.1 Model-View-Controller . . . . . . . . . . . . . . . . . . . . . . 19 3.2 ColocandoMVCemprática . . . . . . . . . . . . . . . . . . . 21 3.3 Trabalhandocombancodedados . . . . . . . . . . . . . . . . 23 3.4 ConfiguraçãoeconexãocomMySQL . . . . . . . . . . . . . . 27 3.5 Parasabermais:Environment . . . . . . . . . . . . . . . . . . 30 3.6 Aondechegamoseparaondequeremosir . . . . . . . . . . . 32 vii Sumário CasadoCódigo 4 Camadademodelo,migrationseseeds 33 4.1 OmodeloProduto . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2 Trabalhandocommigrations. . . . . . . . . . . . . . . . . . . 35 4.3 Apagandoatabelaprodutos . . . . . . . . . . . . . . . . . . . 38 4.4 Executandomigrações . . . . . . . . . . . . . . . . . . . . . . 38 4.5 Inserindodadosnatabelaprodutos . . . . . . . . . . . . . . . 39 5 TrabalhandocomaView 45 5.1 Cadacoisaemseulugar:camadaView . . . . . . . . . . . . . 46 5.2 Consultandoosarquivosdelogdoframework . . . . . . . . 49 5.3 Incluindoparâmetrosnaview . . . . . . . . . . . . . . . . . . 52 5.4 Algunsdetalhesecuriosidades. . . . . . . . . . . . . . . . . . 53 5.5 Melhorandoaaparênciadanossalistagem . . . . . . . . . . . 55 5.6 Aondechegamoseparaondequeremosir . . . . . . . . . . . 60 6 ParâmetrosdarequesteURL 61 6.1 Exibindodetalhesdoproduto . . . . . . . . . . . . . . . . . . 61 6.2 Enviandoparâmetrosnarequest. . . . . . . . . . . . . . . . . 67 6.3 Recuperandoparâmetrosdarequest . . . . . . . . . . . . . . 68 6.4 ConhecendoumpoucomaisdaRequest . . . . . . . . . . . . 71 6.5 URLsmaissemânticas . . . . . . . . . . . . . . . . . . . . . . 72 6.6 RecuperandoparâmetrosdaURL . . . . . . . . . . . . . . . . 73 6.7 Algunscuidadosnecessários . . . . . . . . . . . . . . . . . . . 76 7 Viewsmaisflexíveisepoderosas 79 7.1 Blade,atemplateenginedoLaravel . . . . . . . . . . . . . . . 81 7.2 Variáveiscomblade . . . . . . . . . . . . . . . . . . . . . . . . 87 7.3 MigrandoalistagemparaBlade . . . . . . . . . . . . . . . . . 89 7.4 Loopingsemaisloopings . . . . . . . . . . . . . . . . . . . . . 90 7.5 Adicionandocondiçõesnaview . . . . . . . . . . . . . . . . . 92 7.6 Marcandoprodutosemfaltanoestoque . . . . . . . . . . . . 95 7.7 Organizandonossasviews . . . . . . . . . . . . . . . . . . . . 99 7.8 Estilizandootemplateprincipal . . . . . . . . . . . . . . . . . 103 viii CasadoCódigo Sumário 8 RequestemétodosHTTP 109 8.1 Criandoformuláriodenovosprodutos . . . . . . . . . . . . . 109 8.2 Criandoométodoadiciona . . . . . . . . . . . . . . . . . . . 113 8.3 InserindoosprodutosnoBD. . . . . . . . . . . . . . . . . . . 118 8.4 Retornandoumaviewdeconfirmação . . . . . . . . . . . . . 118 8.5 UtilizandoosmétodosdoHTTP . . . . . . . . . . . . . . . . 123 8.6 MaismétodosHTTPequandoutilizá-los . . . . . . . . . . . 128 9 Osdiferentestiposderesposta 129 9.1 Redirecionandoparaoutraslógicas . . . . . . . . . . . . . . . 129 9.2 Maseamensagemdeconfirmação?. . . . . . . . . . . . . . . 132 9.3 Recuperandovaloresdarequisiçãoanterior . . . . . . . . . . 134 9.4 Escolhendoquaisvaloresmanter . . . . . . . . . . . . . . . . 136 9.5 Outrostiposderedirect . . . . . . . . . . . . . . . . . . . . . . 137 9.6 Parasabermais:rotasnomeadas. . . . . . . . . . . . . . . . . 138 9.7 Outrostiposderesposta . . . . . . . . . . . . . . . . . . . . . 140 10 EloquentORM 143 10.1 Conheçaasolução:ORM . . . . . . . . . . . . . . . . . . . . . 144 10.2 TudomaissimplescomEloquent . . . . . . . . . . . . . . . . 145 10.3 BuscandopeloIDcomEloquent. . . . . . . . . . . . . . . . . 147 10.4 Migrandoainserçãodeprodutos . . . . . . . . . . . . . . . . 149 10.5 Funçãoderemoverprodutos . . . . . . . . . . . . . . . . . . . 153 10.6 CódigofinaldoProdutoController . . . . . . . . . . . . . . . 155 11 Validandoosdadosdeentrada 159 11.1 ValidaçãocomLaravel . . . . . . . . . . . . . . . . . . . . . . 161 11.2 ValidandocomFormRequests . . . . . . . . . . . . . . . . . . 165 11.3 UsandoFormRequestaoadicionar . . . . . . . . . . . . . . . 169 11.4 Exibindoerrorsdevalidação . . . . . . . . . . . . . . . . . . . 171 11.5 Customizandoasmensagens . . . . . . . . . . . . . . . . . . . 176 11.6 Customizandomensagensdeumcampoespecífico . . . . . . 178 11.7 Boaprática:experiênciadeuso . . . . . . . . . . . . . . . . . 180 ix
Description: