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…
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
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.
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
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.
Você está coberto de razão!
Que vacilo da minha parte.
Corrigindo agora!!!!!
Muito obrigado pelo toque e bom aprendizado!!!!
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.
Você está passando o parâmetro usuário na rota?
http://seuendereço/alo/usuario
Cara estou com o mesmo problema que você, não acessa nada fiz como esta aqui, mas na url quando digito http://laravel-curso.dev/ola/usuario aparece Not Found
The requested URL /ola/usuario was not found on this server.
o que pode ser? eu uso Vhost.
Estou com o mesmo problema:
acesso meuendereco/public/ola/eu por exemplo e da Not Found.
Estou usando localmente através do Wamp
Resolvi o problema trocando o Wamp pelo Xamp, o problema pelo que parece era na reescrita
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
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
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
Dá uma olhada se você não tem duas rotas.
Uma como
ola/
e a outra como
ola/{usuario?}
Isso pode estar dando conflito.
Ó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
Tira o /public/da tua URL que resolve 😀
exemplo: https://localhost/ola/eu
Oi FReNeTiC,
Tentei desse jeito que você mencionou e também não deu certo.
laravel -> É a pastinha no meu servidor, não entendi o porque você disse para tentar apenas assim: https://localhost/ola/eu
No tutorial você cita: “seuambiente”/ola/eu… no meu caso que uso wamp no windows ficaria assim me corrija se eu estiver errado http://localhost/laravel/public/ola/eu
O Arquivo .htaccess localizado na pasta PUBLIC do teu projeto deveria fazer o redirect para a url correta.
Amigo só acessar o Olá assim http://localhost:8000/ola que dá certo.
Galerinha só acessar o Olá assim http://localhost:8000/ola que dá certo.
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