Tutorial Laravel para iniciantes

โšก Resumo Inteligente

Laravel รฉ um framework PHP MVC de cรณdigo aberto criado por Taylor Otwell para construir aplicaรงรตes web de forma rรกpida e organizada. Este tutorial explica o que รฉ Laravel, como instalรก-lo com o Composer e constrรณi um aplicativo funcional de upload de arquivos usando rotas, controladores, validaรงรฃo de formulรกrios e templates Blade.

  • ๐ŸŽ‚ O que รฉ Laravel: Laravel รฉ um framework PHP MVC moderno com gerenciador de pacotes, ferramentas de banco de dados e sintaxe expressiva para desenvolvimento rรกpido.
  • ๐Ÿ“ฆ Instalaรงรฃo do Composer: O Composer instala o Laravel; o comando `laravel new` cria uma nova aplicaรงรฃo com sua estrutura de diretรณrios completa.
  • ๐Ÿงญ Rotas: As rotas em routes/web.php mapeiam um URI e um verbo HTTP para um mรฉtodo do controlador e podem receber nomes fรกceis de lembrar.
  • ๐ŸŽ›๏ธ Controladores: Um controlador recebe a solicitaรงรฃo e retorna uma resposta, mantenhaping A lรณgica de aรงรฃo รฉ separada das definiรงรตes de rota.
  • โœ… Solicitaรงรตes de formulรกrio: Uma classe de requisiรงรฃo de formulรกrio contรฉm regras de validaรงรฃo, de modo que dados invรกlidos sejam rejeitados antes de chegarem ao controlador.
  • ๐Ÿ–ผ๏ธ Modelos de lรขminas: O Blade renderiza HTML com diretivas como @csrf e route(), aqui combinadas com jQuery para uploads assรญncronos.
  • ๐Ÿค– Assistรชncia de IA: Ferramentas de IA podem criar a estrutura bรกsica de um aplicativo CRUD em Laravel e ajudar a atualizar um projeto antigo para a versรฃo atual do Laravel.

Tutorial do Laravel

O que รฉ o Laravel?

Laravel รฉ uma estrutura MVC da web de cรณdigo aberto para PHP. Laravel รฉ uma estrutura robusta que fornece fรกcil desenvolvimento de aplicaรงรตes web PHP com recursos como um sistema de empacotamento modular com um gerenciador de dependรชncias dedicado, acesso a bancos de dados relacionais e outros utilitรกrios para implantaรงรฃo e manutenรงรฃo de aplicaรงรตes.

O Laravel foi criado por Taylor Otwell. Desde seu lanรงamento inicial em junho de 2011 (versรฃo 1), ele tem crescido de forma constante e cada vez mais popular no setor de frameworks PHP da indรบstria de desenvolvimento web. Grande parte dessa popularidade pode ser atribuรญda aos muitos recursos voltados para desenvolvedores que ele oferece por padrรฃo.

Por que Laravel?

Por volta de 2000, a maior parte Cรณdigo PHP era processual e podia ser encontrado na forma de โ€œscriptsโ€ que teriam uma confusรฃo emaranhada de cรณdigo espaguete. Mesmo as pรกginas mais simples nรฃo tinham separaรงรฃo de preocupaรงรตesAssim, era bastante fรกcil para uma aplicaรงรฃo se transformar rapidamente em um pesadelo de manutenรงรฃo. O mundo precisava de algo melhor. Surgiram entรฃo o PHP versรฃo 5 e uma variedade de frameworks PHP, que buscavam trazer a estrutura tรฃo necessรกria e melhores soluรงรตes para diversas questรตes relacionadas a aplicaรงรตes web.

Desde entรฃo, vimos o lanรงamento de muitos frameworks que pavimentaram o caminho para os frameworks populares usados โ€‹โ€‹hoje. Atualmente, os trรชs principais (na nossa opiniรฃo) sรฃo Zend Framework, Symfony e, claro, Laravel. Embora cada um desses frameworks tenha sido fundado em princรญpios semelhantes e seja voltado para a resoluรงรฃo (basicamente) dos mesmos problemas comuns, suas principais diferenรงas residem em suas implementaรงรตes. Cada um tem suas prรณprias peculiaridades sobre como abordar a resoluรงรฃo de problemas. Ao analisar o cรณdigo produzido por cada um deles, vocรช perceberรก que existe uma linha bastante clara que os separa. Na nossa humilde opiniรฃo, o framework Laravel รฉ o melhor.

Saiba mais sobre o diferenรงa entre Laravel e CodeIgnorar.

Como baixar e instalar o Laravel com Composer

Observaรงรฃo: Este tutorial foi escrito para o Laravel 5.8, mas os conceitos de roteamento, controlador, requisiรงรฃo e Blade permanecem os mesmos nas versรตes atuais. Em 2026, a versรฃo mais recente รฉ o Laravel 13 (lanรงado em marรงo de 2026), que requer PHP 8.3 ou posterior, enquanto o Laravel 12 requer PHP 8.2.

Observaรงรฃo: Presume-se que vocรช jรก tenha uma cรณpia do PHP instalada em seu sistema local. Caso contrรกrio, vocรช pode ler como instalรก-la. aqui..

Composer รฉ um gerenciador de pacotes e dependรชncias. Para instalรก-lo, abra um terminal e faรงa cd em um novo diretรณrio. Execute este comando:

curl -Ss getcomposer.org/installer | php

Os resultados deste comando serรฃo assim:

Baixe e instale o Laravel com Composer

Observaรงรฃo: Para obter instruรงรตes mais detalhadas sobre como configurar o Laravel, consulte a documentaรงรฃo do Laravel. aqui..

Vocรช verรก o script composer.phar sendo baixado e compilado, que รฉ o que usamos para instalar o Laravel. Embora existam vรกrias maneiras de configurar um novo aplicativo Laravel, faremos isso usando o script composer do Laravel. Para instalar este script, execute:

composer global require laravel/installer

Que serรก parecido com isto:

Baixe e instale o Laravel com Composer

Isso farรก o download e a instalaรงรฃo de todos os arquivos do framework, bem como de todas as dependรชncias necessรกrias. Os pacotes serรฃo salvos no diretรณrio vendor. Depois de baixados e instalados, basta executar o seguinte comando:

laravel new uploadApp

Vocรช verรก algo como a seguinte saรญda:

Baixe e instale o Laravel com Composer

O Composer estรก instalando todos os pacotes que o Laravel precisa para funcionar. Isso pode levar alguns minutos, entรฃo tenha paciรชncia. Apรณs a conclusรฃo, execute o comando `ls -al` para verificar o que foi instalado.

Aqui estรก uma breve anรกlise dos diretรณrios em um aplicativo Laravel comum:

  • aplicativo/ : Esta รฉ a pasta de origem onde reside o cรณdigo da nossa aplicaรงรฃo. Todos os controladores, polรญticas e modelos estรฃo dentro desta pasta.
  • inicializaรงรฃo/ : Contรฉm o script de inicializaรงรฃo do aplicativo e alguns arquivos de mapa de classes.
  • configuraรงรฃo/ : Contรฉm os arquivos de configuraรงรฃo do aplicativo. Normalmente, esses arquivos nรฃo sรฃo modificados diretamente, mas dependem dos valores definidos no arquivo .env (ambiente) na raiz do aplicativo.
  • base de dados/ : Armazena os arquivos do banco de dados, incluindo migraรงรตes, seeds e fรกbricas de teste.
  • pรบblico/ : Pasta de acesso pรบblico contendo os arquivos compilados e, claro, um arquivo index.php.
  • recursos/ : Contรฉm recursos de front-end, como: JavaArquivos de script, arquivos de idioma, arquivos CSS/SASS e todos os modelos usados โ€‹โ€‹no aplicativo (chamados de modelos Blade).
  • rotas/ : Todas as rotas da aplicaรงรฃo estรฃo dentro deste arquivo. Existem alguns "escopos" diferentes de rotas, mas o que abordaremos aqui รฉ o arquivo web.php.
  • armazenar/ : Todos os arquivos de cache temporรกrios usados โ€‹โ€‹pelo aplicativo, arquivos de sessรฃo, scripts de visualizaรงรฃo compilados e arquivos de log.
  • testes/ : Contรฉm arquivos de teste para o aplicativo, como testes unitรกrios e testes funcionais.
  • fornecedor/ : Todos os pacotes de dependรชncia instalados com o Composer.

Agora, vamos construir o restante do aplicativo e executรก-lo com um comando Artisan especรญfico (para evitar o trabalho de instalar e configurar um servidor web como o Apache ou o Nginx). O arquivo .env contรฉm todos os valores de configuraรงรฃo que os arquivos no diretรณrio /config usam para configurar o aplicativo.

Design do aplicativo: um rรกpido resumo de nossos requisitos

Neste tutorial online do Laravel, estaremos construindo um aplicativo muito simples que farรก apenas duas coisas:

  1. lidar com uploads de arquivos de um formulรกrio da web
  2. Exibir os arquivos previamente carregados em uma pรกgina diferente.

Para este projeto, nossa aplicaรงรฃo serรก somente para escrita, o que significa que o usuรกrio poderรก apenas escrever arquivos e visualizar a lista de arquivos que carregou. Esta aplicaรงรฃo รฉ extremamente bรกsica, mas deve servir como um bom exercรญcio para vocรช comeรงar a desenvolver suas habilidades e conhecimentos em Laravel. Observe que, por uma questรฃo de brevidade, excluรญmos qualquer modelagem de banco de dados, migraรงรตes e autenticaรงรฃo, mas em uma aplicaรงรฃo real, esses sรฃo aspectos adicionais que vocรช precisarรก considerar.

Aqui estรก uma lista de componentes que precisaremos para fazer o aplicativo funcionar conforme o esperado:

  • A estrada Isso permitirรก que o mundo externo (internet) utilize o aplicativo, alรฉm de especificar o ponto de extremidade que apontarรก para onde estรก localizada a lรณgica para salvar o arquivo carregado.
  • A controlador que gerencia o fluxo de requisiรงรฃo para resposta.
  • A modelo que serรก usado para exibir uma lista de arquivos enviados anteriormente e o prรณprio formulรกrio de upload.
  • A solicitar que o controlador usarรก para validar os dados passados โ€‹โ€‹pelo formulรกrio web.

O que รฉ uma rota?

Uma rota no Laravel รฉ basicamente um endpoint especificado por uma URI que funciona como um "ponteiro" para alguma funcionalidade oferecida pela aplicaรงรฃo. Normalmente, uma rota simplesmente aponta para um mรฉtodo em um controlador e tambรฉm define quais mรฉtodos HTTP podem acessar essa URI. Uma rota nรฃo significa necessariamente um mรฉtodo de controlador; ela pode simplesmente delegar a execuรงรฃo da aplicaรงรฃo a um Closure definido ou a uma funรงรฃo anรดnima.

Por que usar uma rota?

As rotas sรฃo armazenadas em arquivos na pasta /routes dentro do diretรณrio raiz do projeto. Por padrรฃo, existem alguns arquivos diferentes correspondentes aos diferentes โ€œladosโ€ da aplicaรงรฃo (โ€œladosโ€ vem da metodologia de arquitetura hexagonal). Eles incluem:

  • web.php: as rotas pรบblicas baseadas no navegador. Estas sรฃo as mais comuns e sรฃo as que sรฃo acessadas pelo navegador web. Elas sรฃo executadas pelo grupo de middleware web e tambรฉm contรชm recursos para Proteรงรฃo CSRF (o que ajuda a defender contra ataques maliciosos baseados em formulรกrios) e geralmente contรชm um certo grau de "estado" (com isso queremos dizer que utilizam sessรตes).
  • api.php: rotas que correspondem a um grupo de API e, portanto, tรชm o middleware da API ativado por padrรฃo. Essas rotas sรฃo sem estado e nรฃo possuem sessรตes ou memรณria entre requisiรงรตes (uma requisiรงรฃo nรฃo compartilha dados ou memรณria com nenhuma outra requisiรงรฃo; cada uma รฉ autoencapsulada).
  • console.php: essas rotas correspondem a comandos artsan personalizados que vocรช criou para seu aplicativo.
  • channels.php: registra rotas para transmissรฃo de eventos.

O arquivo principal com o qual devemos nos preocupar neste momento รฉ o especรญfico do navegador, web.php. Jรก existe uma rota definida por padrรฃo, que รฉ aquela que vocรช acessa ao navegar para a raiz da web do seu aplicativo (a raiz da web estรก no diretรณrio pรบblico). Precisaremos de trรชs rotas diferentes para que nosso aplicativo de upload funcione:

  • /upload: este serรก o URI da pรกgina principal que exibirรก nosso formulรกrio web para envio de arquivos.
  • /process: este serรก o local para onde o formulรกrio localizado no URI /upload enviarรก os dados submetidos (a "aรงรฃo" do formulรกrio).
  • /list: este comando listarรก todos os arquivos enviados para o site.

Observaรงรฃo: O endpoint /list pode nรฃo ser necessรกrio se quisermos colocar toda a lรณgica para exibir o formulรกrio de upload e a lista de arquivos em uma รบnica pรกgina; no entanto, mantivemos ambos separados por enquanto para adicionar um pouco mais de conteรบdo ao assunto em questรฃo.

//inside routes/web.php
Route::get('/upload', 'UploadController@upload')->name('upload');
Route::get('/download', 'UploadController@download')->name('download');
Route::post('/process', 'UploadController@process')->name('process');
Route::get('/list', 'UploadController@list')->name('list');

Neste tutorial do framework Laravel, para cada rota desejada, iremos listรก-la explicitamente no arquivo de rotas web.php usando um dos mรฉtodos de requisiรงรฃo HTTP disponรญveis (get(), post(), put(), delete(), patch() ou options()). Para uma descriรงรฃo detalhada de cada um deles, consulte [link para a documentaรงรฃo]. esse O que esses mรฉtodos fazem รฉ especificar quais verbos HTTP tรชm permissรฃo para acessar uma determinada rota. Se vocรช precisar que uma rota aceite mais de um verbo HTTP (o que pode acontecer se vocรช estiver usando uma รบnica pรกgina para exibir os dados iniciais e enviar os dados do formulรกrio), vocรช pode usar o mรฉtodo `Route::any()`.

O segundo argumento dos mรฉtodos `Route::get()` e `Route::post()` (e de qualquer outro mรฉtodo relacionado a verbos HTTP na fachada `Route`) รฉ o nome de um controlador especรญfico e o mรฉtodo contido nesse controlador que รฉ executado ao acessar o endpoint da rota com a requisiรงรฃo HTTP permitida (GET, POST, PATCH, etc.). Estamos usando o `UploadController` para todas as rotas e as especificamos da seguinte forma:

O que รฉ uma rota

O รบltimo mรฉtodo que chamamos em cada rota รฉ a sua funรงรฃo `name()`, que aceita uma รบnica string como argumento e รฉ usada para, de certa forma, "etiquetar" uma rota especรญfica com um nome fรกcil de lembrar (em nossos casos, `upload`, `process` e `list`). Pode nรฃo parecer um recurso tรฃo importante dar a cada rota seu prรณprio nome quando... URL Tem exatamente o mesmo nome, mas รฉ muito รบtil quando vocรช tem uma rota especรญfica como /users/profile/dashboard/config, que seria mais fรกcil de lembrar como profile-admin ou user-config.

Uma nota sobre fachadas:

  • As fachadas fornecem uma interface "estรกtica" para as classes disponรญveis no contรชiner de serviรงos da aplicaรงรฃo.
  • Eles fornecem uma sintaxe concisa e memorรกvel que permite usar os recursos do Laravel sem lembrar nomes longos de classes que devem ser injetados ou configurados manualmente.

Nas definiรงรตes de rota acima, usamos o facade Route em vez de instanciar manualmente um novo objeto Illuminate/Routing/Router e chamar os mรฉtodos correspondentes nesse objeto. ร‰ apenas um atalho que economiza tempo.pingFacades sรฃo amplamente utilizadas em todo o framework Laravel; vocรช pode e deve se familiarizar com elas. A documentaรงรฃo sobre Facades pode ser encontrada aqui. aqui..

O que รฉ um Controlador?

Um controlador รฉ o โ€œCโ€ na arquitetura โ€œMVCโ€ (Model-View-Controller), na qual o Laravel รฉ baseado. O trabalho de um controlador pode ser resumido nesta definiรงรฃo simples: Ele recebe a solicitaรงรฃo do cliente e retorna uma resposta para o cliente. Esta รฉ a definiรงรฃo bรกsica e tambรฉm o requisito mรญnimo de qualquer controlador. O que ele faz entre esses dois pontos รฉ geralmente considerado a "aรงรฃo" do controlador (ou a "implementaรงรฃo da rota"). Ele atua como o segundo ponto de entrada para a aplicaรงรฃo (o primeiro sendo a requisiรงรฃo) para o cliente, que envia a carga รบtil da requisiรงรฃo (que veremos a seguir) para a aplicaรงรฃo, esperando algum tipo de resposta (na forma de uma pรกgina de sucesso, redirecionamento, pรกgina de erro ou qualquer outro tipo de resposta HTTP).

Um controlador faz (basicamente) a mesma coisa que uma definiรงรฃo de rota, com uma funรงรฃo anรดnima definida como a "aรงรฃo" quando essa rota รฉ acessada. A diferenรงa รฉ que um controlador mantรฉm bem a separaรงรฃo de responsabilidades, enquanto uma rota รฉ definida diretamente no cรณdigo da rota. URL definiรงรฃo, que basicamente significa que estamos acoplando o URI atribuรญdo ร  rota com a implementaรงรฃo da rota, ou seja, o cรณdigo que รฉ executado quando essa rota รฉ acessada.

Por exemplo, os dois trechos de cรณdigo a seguir alcanรงarรฃo a mesma coisa:

Exemplo #1: Definiรงรฃo e implementaรงรฃo de rota dentro de uma รบnica chamada de mรฉtodo (no arquivo de rotas web.php)

//inside routes/web.php
<?php
Route::get('/hello-world', function(Request $request) {
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
});

Exemplo nยบ 2: A definiรงรฃo da rota estรก dentro de routes/web.php, mas sua implementaรงรฃo reside dentro da classe /app/Http/Controllers/HelloWorldController.

//inside routes/web.php
<?php

Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world');

------------------------------------------------------------------------------------
//inside app/Http/Controllers/HelloWorldController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloWorldController extends Controller
{
public function index(Request $request)
{
$name = $request->name;
return response()->make("<h1>Hello World! This is ".$name, 200);
}
}

Embora o exemplo #2 do Laravel pareรงa dar muito mais trabalho (o que nรฃo รฉ verdade, apenas um pouco mais de cรณdigo), observe os benefรญcios que obtemos ao colocar nossa lรณgica de aรงรฃo para a rota "hello-world" dentro de um controlador, em vez de na definiรงรฃo da rota como uma funรงรฃo de retorno de chamada:

  1. Nossa lรณgica estรก claramente separada em sua prรณpria classe (separaรงรฃo de responsabilidades).
  2. Nosso controlador estรก configurado para ser estendido posteriormente, caso precisemos adicionar funcionalidades adicionais. Digamos que quisรฉssemos adicionar um recurso de "adeus, mundo". Nesse caso, renomearรญamos o controlador para um nome mais genรฉrico, como "HelloController", e definirรญamos dois mรฉtodos separados. Olรก() e adeus(). Tambรฉm precisarรญamos definir duas rotas separadas que mapeassem o /olรก e / adeus URIs para seus respectivos mรฉtodos no controlador. Isso รฉ preferรญvel a sobrecarregar um arquivo de rotas com a implementaรงรฃo de cada rota definida como funรงรตes de retorno de chamada.
  3. O Laravel tem a capacidade integrada de armazenar em cache todas as definiรงรตes de rota no aplicativo para acelerar o tempo necessรกrio para encontrar uma determinada rota (aumenta o desempenho do aplicativo); Contudo, Vocรช sรณ poderรก aproveitar essa funcionalidade se todas as rotas definidas dentro do aplicativo estiverem configuradas usando um mapa especรญfico do controlador.pings (veja o Exemplo nยบ 2 acima).

Vamos executar este comando que irรก gerar um novo controlador para nรณs.

// ...inside the project's root directory:
php artisan make:controller UploadController

Basicamente, o que este comando faz รฉ gerar um stub para um controlador chamado "UploadController" dentro do diretรณrio principal de controladores em /app/Http/Controllers/UploadController.php. Sinta-se ร  vontade para abrir esse arquivo e dar uma olhada. ร‰ muito simples, pois รฉ apenas uma versรฃo stub do controlador, com o caminho de namespace correto e as classes necessรกrias das quais ele herda.

Gerando a solicitaรงรฃo

Antes de prosseguirmos neste tutorial de PHP Laravel e fazermos algumas alteraรงรตes no stub gerado do UploadController, farรก mais sentido criar primeiro a classe de requisiรงรฃo. Isso porque o mรฉtodo do controlador que lida com a requisiรงรฃo deve especificar o tipo do objeto de requisiรงรฃo em sua assinatura, permitindo que ele valide automaticamente os dados do formulรกrio recebido (conforme especificado no mรฉtodo rules(); mais sobre isso adiante). Por enquanto, vamos usar o comando artisan novamente para gerar nosso stub de requisiรงรฃo:

php artisan make:request UploadFileRequest

Este comando irรก gerar um arquivo chamado UploadFileRequest dentro de app/Http/Requests/UploadFileRequest. Abra o arquivo e dรช uma olhada. Vocรช verรก que ele รฉ muito simples, contendo apenas dois mรฉtodos: authorize() e rules().

Criando a lรณgica de validaรงรฃo

Vamos modificar o stub de requisiรงรฃo para atender ร s necessidades da nossa aplicaรงรฃo. Modifique o arquivo para que fique assim:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadFileRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'fileName' => 'required|string',
'userFile' => 'required|file'
];
}
}

Nรฃo houve muitas mudanรงas, mas observe que o mรฉtodo `authorize()` agora retorna `true` em vez de `false`. Este mรฉtodo decide se a requisiรงรฃo deve ou nรฃo ser permitida no aplicativo. Se estiver definido como `false`, ele impede que a requisiรงรฃo entre no sistema. Este seria um local muito รบtil para implementar verificaรงรตes de autorizaรงรฃo do usuรกrio ou qualquer outra lรณgica que determine se a requisiรงรฃo pode prosseguir para o controlador. Por enquanto, retornamos `true` para permitir que qualquer coisa utilize a requisiรงรฃo.

O outro mรฉtodo, rules(), รฉ onde toda a mรกgica acontece em relaรงรฃo ร  validaรงรฃo. A ideia รฉ simples: retornar um array contendo um conjunto de regras no formato de:

'formFieldName' => 'constraints this field has separated by pipe characters (|)'

Existem muitas restriรงรตes de validaรงรฃo diferentes que sรฃo suportadas pelo Laravel imediatamente. Para uma lista completa deles, verifique a documentaรงรฃo online aqui.Para nossa aplicaรงรฃo de upload, haverรก dois campos que serรฃo passados โ€‹โ€‹via requisiรงรฃo POST de um formulรกrio no front-end. O parรขmetro `fileName` deve estar presente no corpo do formulรกrio (ou seja, รฉ obrigatรณrio) e serรก usado como o nome do arquivo no armazenamento (isso รฉ feito no controlador; falaremos sobre isso mais adiante). Tambรฉm especificamos que o nome do arquivo deve ser uma string adicionando um caractere de barra vertical (|) e a palavra 'string'. As restriรงรตes sรฃo sempre delimitadas por barras verticais, permitindo que vocรช especifique quaisquer critรฉrios adicionais para o campo em questรฃo em uma รบnica linha.

O segundo parรขmetro, userFile, รฉ o arquivo que o usuรกrio carrega atravรฉs de um formulรกrio em uma pรกgina da web. O parรขmetro userFile tambรฉm รฉ obrigatรณrio e devo ser um arquivo. Observaรงรฃo: Se esperรกssemos que o arquivo enviado fosse uma imagem, usarรญamos a restriรงรฃo de imagem, que limitaria os tipos de arquivo aceitos a um dos tipos de imagem mais populares (jpeg, png, bmp, gif ou svg). Como queremos permitir que o usuรกrio envie qualquer tipo de arquivo, manteremos a restriรงรฃo de validaรงรฃo de arquivo.

Isso resume praticamente tudo o que o objeto de requisiรงรฃo faz. Sua principal funรงรฃo รฉ simplesmente armazenar o conjunto aceitรกvel de critรฉrios (restriรงรตes) que os parรขmetros do corpo do formulรกrio devem satisfazer para que o processo possa prosseguir na aplicaรงรฃo. Outro ponto importante รฉ que esses dois campos (userFile e fileName) tambรฉm devem ser especificados no cรณdigo HTML como campos de entrada (com o nome do campo correspondendo ao nome dentro do objeto de requisiรงรฃo).

Vocรช pode estar se perguntando: isso define as caracterรญsticas do que uma solicitaรงรฃo de formulรกrio deve conter, mas onde a verificaรงรฃo dessas restriรงรตes รฉ feita de fato? Abordaremos isso a seguir.

Modificando o controlador

Abra app/Http/Controllers/UploadController e faรงa as seguintes alteraรงรตes:

<?php

namespace App\Http\Controllers;

use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\Request;
use App\Http\Requests\UploadFileRequest; //our new request class
use Illuminate\Support\Facades\Storage;

class UploadController extends Controller
{
/**
* This is the method that will simply list all the files uploaded by name and provide a
* link to each one so they may be downloaded
*
* @param $request : A standard form request object
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function list(Request $request)
{
$uploads = Storage::allFiles('uploads');

return view('list', ['files' => $uploads]);
}

/**
* @param $file
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
* @throws BindingResolutionException
*/
public function download($file)
{
return response()->download(storage_path('app/'.$file));
}

/**
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
* @throws BindingResolutionException
*/
public function upload()
{
return view('upload');
}

/**
* This method will handle the file uploads. Notice that the parameter's typehint
* is the exact request class we generated in the last step. There is a reason for this!
*
* @param $request : The special form request for our upload application
* @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null
* @throws BindingResolutionException
*/
public function process(UploadFileRequest $request)
{
//At this point, the parameters passed into the $request (from form) are
//valid--they satisfy each of the conditions inside the rules() method

$filename = $request->fileName; //parameters have already been validated
$file = $request->file('userFile'); //so we don't need any additional isset()

$extension = $file->getClientOriginalExtension(); //grab the file extension
$saveAs = $filename . "." . $extension; //filename to save file under

$file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder

return response()->json(['success' => true]); //return a success message
}
}

Portanto, รฉ uma abordagem bastante simples para salvar os arquivos enviados no disco. Aqui estรก uma descriรงรฃo detalhada do mรฉtodo process() acima:

  • Indique o tipo da classe de requisiรงรฃo no mรฉtodo do controlador que executa a funcionalidade principal, para que possamos validar automaticamente os dados recebidos.
  • Obtenha o arquivo do objeto de requisiรงรฃo (agora validado) dentro do mรฉtodo do controlador.
  • Extraia o nome do arquivo da requisiรงรฃo.
  • Gere o nome do arquivo final que serรก usado para salvar o arquivo. O mรฉtodo getClientOriginalExtension() simplesmente captura a extensรฃo original do arquivo carregado.
  • Armazene o arquivo no sistema de arquivos local usando seu mรฉtodo storeAs(), passando o caminho nomeado dentro do diretรณrio /storage como o primeiro argumento e o nome do arquivo para salvรก-lo como o segundo.
  • Retorna uma resposta JSON indicando que a solicitaรงรฃo foi bem-sucedida.

O modelo de lรขmina

A รบltima peรงa fundamental deste quebra-cabeรงa รฉ o modelo Blade, que conterรก todo o HTML, CSS e JavaScript para nossa aplicaรงรฃo simples. Aqui estรก o cรณdigo; explicaremos mais tarde.

<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" enctype="multipart/form-data">
@csrf
<label for="fileName">File Name:</label>
<input type="text" name="fileName" id="fileName" required /><br />
<label for="userFile">Select a File</label>
<input type="file" name="userFile" id="userFile" required />
<button type="submit" name="submit">Submit</button>
</form>
<h2 id="success" style="color:green;display:none">Successfully uploaded file</h2>
<h2 id="error" style="color:red;display:none">Error Submitting File</h2>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$('#uploadForm').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
url: url,
type: "POST",
data: new FormData(this),
processData: false,
contentType: false,
dataType: "JSON",
success: function(data) {
$("#fileName").val("");
$("#userFile").val("");
}
}).done(function() {
$('#success').css('display', 'block');
window.setTimeout(()=>($("#success").css('display', 'none')), 5000);
}).fail(function() {
$('#error').css('display', 'block');
window.setTimeout(()=>($("#error").css('display', 'none')), 5000);
});
});
</script>
</body>
</html>

Aqui estรก o que nosso / Envio pรกgina parece com:

O modelo de lรขmina

Este รฉ um exemplo muito tรญpico de um arquivo blade contendo um formulรกrio HTML e JavaScript/jQuery para adicionar funcionalidade assรญncrona (para que a pรกgina nรฃo seja recarregada). Existe um bรกsico. tag sem atributo method (que explicaremos em breve) e com um curioso atributo action com o valor {{route('process')}}. Em Blade, isso รฉ conhecido como um Directiva. Uma diretiva รฉ apenas um nome sofisticado para uma funรงรฃo; sรฃo funรงรตes especรญficas dos templates Blade que executam diferentes operaรงรตes comuns ร  construรงรฃo de pรกginas e aplicaรงรตes web. Para um melhor entendimento de todas as funcionalidades รบteis do Blade, consulte a documentaรงรฃo. aqui.No caso acima, estamos usando a diretiva de rota para gerar um URL para o envio do nosso formulรกrio.

Lembre-se de que definimos nossas rotas anteriormente no arquivo web.php da aplicaรงรฃo, especificando um nome fรกcil de lembrar para cada uma delas. A diretiva {{route()}} aceita o nome de uma rota, a busca na lista de rotas armazenada em cache internamente e gera uma rota completa. URL com base na definiรงรฃo dessa rota no arquivo web.php. Para este primeiro caso, estamos especificando que queremos que o formulรกrio envie os dados submetidos para /process. URL da nossa aplicaรงรฃo, que รฉ definida como uma POST rota.

A prรณxima coisa que vocรช pode ter notado รฉ a tag `@csrf` logo abaixo da tag de abertura do formulรกrio. No Blade, essa tag gera um parรขmetro `_token` no formulรกrio, que รฉ verificado internamente pela aplicaรงรฃo antes que os dados do formulรกrio possam ser processados. Isso garante que os dados dentro do formulรกrio sejam de origem vรกlida e previne ataques de falsificaรงรฃo de requisiรงรฃo entre sites (CSRF). Para mais informaรงรตes sobre isso, consulte a documentaรงรฃo. docs.

Depois disso, definimos nosso formulรกrio normalmente; no entanto, observe que os nomes dos nossos parรขmetros de formulรกrio, userFile e fileName, sรฃo os mesmos. exatamente o mesmo conforme definido dentro do nosso objeto de requisiรงรฃo. Se nos esquecรชssemos de incluir um valor para um determinado parรขmetro definido no objeto de requisiรงรฃo (ou o digitรกssemos incorretamente), a requisiรงรฃo falharia e um erro seria retornado, impedindo que a requisiรงรฃo original do formulรกrio chegasse ao mรฉtodo do controlador localizado em UploadController@process.

Experimente e envie alguns arquivos para o aplicativo usando este formulรกrio. Depois, acesse o /Lista pรกgina para ver o conteรบdo da pasta de upload, com os arquivos que vocรช enviou listados em uma tabela:

O modelo de lรขmina

The Bigger Picture

Vamos dar um passo atrรกs e analisar o que fizemos neste tutorial de Laravel.

Este diagrama representa a aplicaรงรฃo em seu estado atual (excluindo detalhes de alto nรญvel):

Diagrama do tutorial do Laravel

Vocรช deve se lembrar que o objeto de requisiรงรฃo que construรญmos no inรญcio deste tutorial de Laravel deve ter os mesmos parรขmetros definidos em seu mรฉtodo `rules` que os parรขmetros do formulรกrio no template Blade (caso contrรกrio, releia a seรงรฃo โ€œCriando a Lรณgica de Validaรงรฃoโ€). O usuรกrio preenche o formulรกrio em uma pรกgina web renderizada pelo mecanismo de templates Blade e o envia. O cรณdigo jQuery do template, na parte inferior, impede o envio padrรฃo (que redirecionaria automaticamente para uma pรกgina separada), cria uma requisiรงรฃo AJAX, carrega a requisiรงรฃo com os dados do formulรกrio e o arquivo enviado e envia tudo para a primeira camada da nossa aplicaรงรฃo: a requisiรงรฃo.

O objeto de requisiรงรฃo รฉ preenchido associando os parรขmetros dentro do mรฉtodo `rules()` com os parรขmetros do formulรกrio submetido e, em seguida, valida os dados de acordo com cada regra especificada. Se todas as regras forem satisfeitas, a requisiรงรฃo รฉ encaminhada para o mรฉtodo do controlador correspondente aos valores definidos no arquivo de rotas `web.php`. Neste caso, รฉ o mรฉtodo `process()` do `UploadController` que realiza o trabalho. Ao chegarmos ao controlador, jรก sabemos que a requisiรงรฃo passou pela validaรงรฃo, portanto, nรฃo precisamos verificar novamente se o nome do arquivo fornecido รฉ, de fato, uma string ou se o parรขmetro `userFile` realmente contรฉm algum tipo de arquivo. Podemos prosseguir normalmente.

O mรฉtodo do controlador extrai os parรขmetros validados do objeto de requisiรงรฃo, gera um nome de arquivo completo concatenando o parรขmetro `fileName` passado com a extensรฃo original do arquivo do usuรกrio, armazena o arquivo em um diretรณrio da aplicaรงรฃo e retorna uma resposta simples codificada em JSON, confirmando o sucesso da requisiรงรฃo. A resposta รฉ recebida pela lรณgica do jQuery, que executa algumas tarefas adicionais relacionadas ร  interface do usuรกrio, como exibir a mensagem de sucesso (ou erro) por 5 segundos e, em seguida, ocultรก-la, alรฉm de limpar os campos anteriores do formulรกrio. Isso garante ao usuรกrio que a requisiรงรฃo foi bem-sucedida e permite o envio de outro arquivo, se desejar.

Observe tambรฉm no diagrama acima exatamente onde a linha divisรณria entre o cliente e o servidor รฉ traรงada. Esse conceito รฉ absolutamente crucial para vocรช entender e ajudarรก a resolver problemas e dificuldades que possam surgir no futuro ao lidar, por exemplo, com mรบltiplas requisiรงรตes assรญncronas que podem ocorrer a qualquer momento. A separaรงรฃo ocorre exatamente no limite do objeto de requisiรงรฃo. O prรณprio objeto de requisiรงรฃo pode ser considerado o "portal" para o restante da aplicaรงรฃo. Ele realiza a validaรงรฃo inicial e o registro dos valores do formulรกrio enviados pelo navegador. Se forem considerados vรกlidos, a requisiรงรฃo segue para o controlador. Tudo o que acontece antes disso ocorre no front-end (o "cliente" significa literalmente "no computador do usuรกrio"). A resposta รฉ retornada da aplicaรงรฃo para o lado do cliente, onde nosso cรณdigo jQuery aguarda pacientemente sua chegada e executa algumas tarefas simples de interface do usuรกrio assim que a recebe.

Tambรฉm abordamos muitas perguntas frequentes importantes. Perguntas da entrevista relacionadas ao Laravel e PHP para calouros e tambรฉm para candidatos experientes conseguirem o emprego certo.

Perguntas Frequentes

Eloquent รฉ o mapeador objeto-relacional integrado do Laravel. Cada tabela do banco de dados รฉ mapeada para uma classe de modelo, entรฃo vocรช lรช e grava linhas como objetos PHP, por exemplo User::find(1), em vez de escrever SQL puro para operaรงรตes comuns.

O Artisan รฉ a ferramenta de linha de comando do Laravel. Ele cria a estrutura do cรณdigo com comandos como `make:controller` e `make:request`, executa migraรงรตes, limpa caches e inicia um servidor local com `php artisan serve`, agilizando tarefas comuns de desenvolvimento.

O middleware รฉ uma camada que inspeciona ou filtra as requisiรงรตes HTTP antes que elas cheguem a uma rota, bem como as respostas na saรญda. Ele lida com questรตes transversais como autenticaรงรฃo, proteรงรฃo contra CSRF e registro de logs, aplicadas por rota ou grupo.

Sim. Descreva seu modelo e campos, e a IA poderรก gerar a migraรงรฃo, o modelo Eloquent, o controlador, as requisiรงรตes de formulรกrio, as rotas e as views Blade seguindo as convenรงรตes do Laravel. RevVeja as regras de validaรงรฃo e execute os testes antes do envio.ping.

Sim. A IA consegue identificar mรฉtodos obsoletos, configuraรงรตes e namespaces alterados, alรฉm de requisitos de pacotes atualizados, guiando a atualizaรงรฃo versรฃo por versรฃo. Como a diferenรงa รฉ grande, atualize incrementalmente e teste apรณs cada etapa.

Resuma esta postagem com: