ToDoVel [Parte 04]: Hello World – Routes

Observação: Este tutorial refere-se ao Laravel-4-BETA, estando totalmente DESATUALIZADO para a versão atual. Muita coisa mudou no framework…

Dando continuidade ao Hello World do ToDoVel, vamos dar uma olhadinha rápida em como as rotas (routes) funcionam no Laravel 4.
E ai, no próximo post, falaremos um pouco sobre os controles (controllers) do Laravel 4.
Se prepare para achar tudo muito fácil!

Rotas

As rotas, urls que são aceitas pela aplicação, são escritas no arquivo routes.php, dentro da pasta app/.
Vamos dar uma rápida dissecada no que fizemos no post anterior:

Route::get('/', function()
{
	return View::make('hello');
});

As rotas no Laravel 4 são definidas seguindo esse padrão:
Route::tipo_de_requisição(url, closure).
No nosso caso, desejamos pegar as requisições do tipo get na home do site, e definimos uma “função anônima” (closure, clausura) que será executada.

E se na nossa página inicial desejassemos receber tanto requisições do tipo GET quanto do tipo POST?
Simples, basta alterar o Route::get para Route::any.

Variáveis das Rotas

Vamos criar uma nova rota, para uma url que saúde o usuário (que exemplo de n00b).

Route::any('ola/{usuario}', function($usuario)
{
	return View::make('hello');
});

Na url defini ola/{usuario}, que diz que a url é ola/algumacoisa e esse “algumacoisa” é nomeado como $usuario e passado para o closure definido para essa rota.
Que tal testar no navegador?
Acesse “seuambiente”/ola e depois “seuambiente”/ola/eu.
No primeiro caso, PAU!, no segundo caso funcionou, mas o CSS sumiu =/
O caso do CSS a gente vai ver mais para frente.
O caso do PAU! é simples: marcamos a url para receber OBRIGATORIAMENTE o parametro usuário.
Para fazer com que esse parâmetro seja opcional, basta alterar a url definida para a rota:

Route::any('ola/{usuario?}', function($usuario = null)
{
	return View::make('hello');
});

A interrogação marca as variáveis como opcionais na rota.
Porém, devemos fazer uma pequena alteração na função anônima, para que ela tenha um valor padrão para a variável que ela está esperando receber, se não: PAU!

Passando Dados Para a View

Já temos uma url, e uma rota, para receber um “olá usuário”, precisamos criar uma view.
Já aprendemos no post anterior como criar uma view.
Então, criei uma view chamada ola.blade.php (copie o hello.blade.php e renomeei a cópia :D).
Quero passar valores para a minha view.
Mas como?

O Laravel 4 possui duas formas, igualmente simples. Porém, uma é ‘mais bonita’ que a outra.
A primeira forma é passando um array com os valores para o view::make, ficando assim:

Route::any('ola/{usuario?}', function($usuario = null)
{
	return View::make('ola', array('usuario'=> $usuario));
});

A segunda forma, e mais bacanuda, é utilizando o método with num encadeamento de chamadas:

Route::any('ola/{usuario?}', function($usuario = null)
{
	return View::make('ola')->with("usuario", $usuario);
});

Por fim, basta ir lá na view e mandar o blade imprimir a variável.
Como?

@extends('template')

@section('conteudo')
    
    <div class="jumbotron">
        <h1>Hello {{ $usuario }}!</h1>
    </div>
@stop

Molesa demais…

23 thoughts on “ToDoVel [Parte 04]: Hello World – Routes

  1. Mais um artigo muito bom, como os outros que já ficaram para trás.

    Até aqui “quase” tudo certo. Já estou conseguindo testar o que esta rolando, mas tenho duas duvidas:
    vou começar pela segunda que é algo desse post, por acaso quando vc passa Route::any(‘ola/{usuario?} não deveria chamar return View::make(‘ola’) as invés de ser como passou com ‘hello’?

    A primeira já não é tanta dúvida em si do framwork, mas eu tenho aqui no meu /var/www uma pasta laravel dai no browser eu tenho que rodar localhost/laravel/public para que eu consiga rodar, esta certo isso ou tem alguma forma melhor de eu fazer isso?

    Valew

    1. Marcelo,
      no começo do artigo eu quis mostrar como podemos construir novas urls sem muito esforço.
      Para isso, criei o Route::any(‘ola/{usuario?} que é um copia e cola da rota Route::get(‘/’ – apenas mudei a rota, mas o conteúdo é o mesmo.
      Aproveitei para mostrar como passar parametros na url.
      Posteriormente, na parte chamada Passando Dados Para a View, criei o novo template para exibir o conteúdo passado na url.

      No outro artigo você comentou que está usando o Ubuntu, e aparentemente está usando o Apache.
      O que você fez foi colocar os arquivos do Laravel direto na pasta do Apache. Sem broncas.
      Você pode tem duas opções:
      A MAIS SIMPLES – criar um arquivo .htaccess que redireciona todas as chamadas de execução para a pasta public.

      <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{REQUEST_URI} !^public
      RewriteRule ^(.*)$ public/$1 [L]
      </IfModule>

      OU

      Você pode criar um diretório virtual(VHOST) no Apache, que é um pouquinho mais chatinho.
      Dá uma olhada no Google que voce acha muita coisa.
      Se não conseguir, me avisa que eu explico como faz.

      1. Olá Frenetic,

        obrigado pelas respostas e só uma coisa, no .htaccess que me disse que eu poderia fazer não foi possível pois deu redirecionamento inválido, provavelmente por causa do .htaccess que tem no public https://github.com/laravel/laravel/blob/develop/public/.htaccess e quanto a criar um vhost eu já tinha feito uma vez antes até de comecar a ver seus posts e tinha conseguido, mas tinha dado uns problemas, mas só eu fazer uma pesquisa que devo conseguir.

        Obrigado por tudo mesmo.

        []’s

  2. Frenetic,

    consegui fazer tudo direitinho. Muito bom tutorial por sinal.

    Só dando um feedback, ficou meio ambiguo sobre qual view você estava se referindo no final.

    Você diz que criou uma view ola.blade.php (copiada do hello.blade.php) , e continua referenciando o View::make(‘hello’) … Ficou meio vago se vc queria mesmo fazer isso ou se queria se referenciar ao View::make(‘ola’)

    Só pro pessoal não se perder.

    Vou continuar acompanhando seu tutorial e recomendarei para amigos, fato. Meus parabéns.

  3. Muito bom os artigos!

    Mais estou tendo problemas com routes.php

    Route::any(‘ola/{usuario}’, function($usuario)
    {
    return View::make(‘hello’);
    });

    Não consigo acessar.

    1. Estou com o mesmo problema:

      acesso meuendereco/public/ola/eu por exemplo e da Not Found.

      Estou usando localmente através do Wamp

  4. Cara muito bom, primeiro agradecer por estar repassando conhecimento…

    Queria saber como lidar com router no caso para criar um backend… queria que minha url ficasse “{base_url}backend/user/add”..

    E uma outra duvida, a cada controller/action que criar, vou ter que adicionar no arquivo routes.php?

    Não tem nenhuma convenção de url como no ZF 1 ??

    Vlw

    1. Olá Marcos o/
      Vamos as suas dúvidas:

      1 – quanto ao backend
      Você pode criar o back-end explicitamente, como você fez nesse comentário, ou pode dar uma olhada nos RESOURCE CONTROLLERS que o Laravel oferece: http://laravel.com/docs/controllers#resource-controllers
      Eles podem abstrair o que você está precisando.

      2 – Quanto a adicionar entradas no arquivo routes.php
      Laravel tem em suas filosofias a filosofia de “explícito é melhor que implicito”.
      Isso significa dizer que Laravel prefere que você escreve mais do que menos, no intuito de deixar a informação bem mais clara do que subentendida.
      No caso, Laravel opta que você escreva todas as tuas URLs para que outras pessoas que vão pegar no teu projeto possam entedê-lo sem grandes dificuldades.
      Porém, Laravel também é flexível.
      Você pode tentar fazer algo nesse estilo ZF utilizando RESTFULL CONTROLLERS: http://laravel.com/docs/controllers#restful-controllers

  5. Olá Frenetic, primeiramente gostaria de agradecer por compartilhar seu conhecimento com os demais!

    Agora preciso de uma ajuda…
    Estou tentando acessar o arquivo ola.blade.php com a seguinte rota

    Route::any(‘ola/{usuario?}’, ‘HomeController@ola’);

    O arquivo ola.blade.php está assim:

    Hello {{ $usuario }}!

    O arquivo HomeController está assim:

    public function ola($usuario = ‘tiago’)
    {
    return View::make(‘template’)->with(‘usuario’, $usuario);
    }

    Quando tento acessar a página, aparece o seguinte erro:

    Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException

  6. Ótimo artigo, estou adorando, esta sendo meu primeiro contato com o Laravel e estou gostando muito.

    Só estou com um probleminha rs, quando acesso na url: http://localhost/laravel/public/ola/eu

    Da a seguinte mensagem:
    Not Found

    The requested URL /laravel/public/ola/eu was not found on this server.

    Meu arquivo routes.php:
    Route::any(‘ola/{usuario?}’, function($usuario = NULL)
    {
    return View::make(‘ola’)->with(“usuario”, $usuario);
    });

    Meu arquivo ola.blade.php:
    @extends(‘template’)

    @section(‘conteudo’)

    Hello {{ $usuario }}!

    @stop

  7. Olá FReNeTiC, muito legal seu tutorial, porem estou tendo um problema, ja tentei varias coisas mas da erro.
    Segue parte do erro.

    ErrorException (E_UNKNOWN)

    Undefined variable: usuario (View: C:\xampp\htdocs\paginas\todovel\app\views\hello.blade.php)

    Open: C:\xampp\htdocs\paginas\todovel\bootstrap\compiled.php
    9793. {
    9794. $obLevel = ob_get_level();
    9795. ob_start();
    9796. extract($__data);
    9797. try {
    9798. include $__path;
    9799. } catch (\Exception $e) {
    9800. $this->handleViewException($e, $obLevel);
    9801. }
    9802. return ltrim(ob_get_clean());

    No comments for this stack frame.

    Server/Request Data

    DOCUMENT_ROOT C:\xampp\htdocs\paginas\todovel\public
    REMOTE_ADDR ::1
    REMOTE_PORT 57691
    SERVER_SOFTWARE PHP 5.5.15 Development Server
    SERVER_PROTOCOL HTTP/1.1
    SERVER_NAME localhost
    SERVER_PORT 8000
    REQUEST_URI /ola/usuario
    REQUEST_METHOD GET
    SCRIPT_NAME /index.php
    SCRIPT_FILENAME C:\xampp\htdocs\paginas\todovel\public\index.php
    PATH_INFO /ola/usuario
    PHP_SELF /index.php/ola/usuario

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *