Olá galera,
Nesse último vídeo, vamos adicionar o filtro de ACL a nossa aplicação. Como nos vídeos anteriores, recomendo que a visualização do vídeo seja feita em alta resolução, de preferência em HD, por conta dos códigos exibidos.
Os arquivos que foram gerados podem ser baixados aqui. Fiquem a vontade para enviar dúvidas ou sugestões.
Um grande abraço a todos e até a próxima.
Muito obrigado pelos posts!!!
ResponderExcluirAcompanhei todos de autenticação e era exatamente o que eu precisava! Parabéns!
Olá João,
ExcluirMuito obrigado pelas felicitações e por acompanhar o blog.
Um abraço
Olá! parabéns seus videos são otimos.
ResponderExcluirEstou trabalhando com laravel autenticacao, porem esta gerando erro na seguinte linha "->with('info', Util::message('MSG008'));"
Veja a mensagem:
1. Symfony\Component\Debug\Exception\FatalErrorException
…/app/controllers/UsuariosController.php38
Redirect::to('welcome')
->with('info', Util::message('MSG008'));
}
Segui rigorosamente suas aulas, o que pode ser?
nelsonss63@hotmail.com
Olá Nelson, obrigado !!!
ExcluirAs outras mensagens flash estão sendo exibidas ?! Nessa parte só é feita a leitura do message.json que se encontra dentro da pasta public. A função que faz isso está na pasta app/library/util.php.
Olá! PROFESSOR!!!
ExcluirResolvido
Só acrescentei a pasta library no diretorio app/start/global.php e depois executei o comando composer update e tudo esta funcionando corretamente.
Quando termina uma aplicação é bom executar o comando composer update?
Vou refazer, pois estou com muita 'fome' de aprender...
ExcluirAlém do seu tutorial vc poderia me indicar mar alguns que possui video e codigo fonte para eu praticar?
Valeu pelos videos ...
Olá Nelson,
ExcluirÓtimo que o problema tenha sido resolvido. Não é necessário utilizar o composer não.
Você chegou a ver a outra série publicada em setembro de 2013 ?! Eu sempre dou uma olhada no Youtube e no site http://www.laravel.com.br/. O pessoal sempre posta várias dicas úteis.
Um abraço
ola amigo... parabens pelos videos... sao de otima qualidade! estou com um problema... na verdade é mais questao do wamp(acredito). ao enviar a imagem o laravel ta dando esse erro "Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)". vi q tem algo haver com o modulo php_fileinfo.. fui no wamp e habilitei o mesmo(tanto pelo sistema como direto pela pasta) habilitei tbm o mesmo modulo q fica dentro do php do apache... nao obtive resultado positivo. vc sabe me dizer se pode ser outra coisa? aguardo resposta...
ResponderExcluirOlá Marcilio,
ExcluirMuito obrigado pelos elogios. Como estamos fazendo a manipulação de imagem, utilizo o recurso da GD. Ela está habilitada ?! Aqui eu não tenho esse problema porque eu faço a instalação do PHP, Apache e MySQL manualmente.
Um abraço
Muito bom sesus vídeos, posta o código fonte no github acho que ficará mais simples para pegar. Eu baixei o código do primeiro curso de laravel e não veio por completo.
ResponderExcluirOlá Waib,
ExcluirObrigado pelos elogios. Estarei postando no github nos próximos tutoriais. De qualquer forma, o código base usado na primeira série do vídeo pode ser baixado pelo link https://docs.google.com/file/d/0B__Rg9h09RtfU3BvNFlILXRlSmM/edit. A partir daí basta você ir baixando somente os arquivos alterados conforme os vídeos.
Um abraço
Obrigado!
ExcluirCara parabéns pelos seus videos.. Gostei bastante só tenho uma dúvida como configurar na rota para que seja possível cadastrar usuário na própria tela de login .. tirei o UsuarioController do grupo de rota que filtra a autenticação e mesmo assim n deu certo.. Estarei a espera de sua resposta..
ResponderExcluirOlá Rodrigo,
ExcluirPrimeiramente você vai precisar criar duas rotas. Uma GET e uma POST de forma similar ao que tem nas rotas para o login. Lembrando que elas devem estar fora do Route::group. Aí agora é implementar os dois metódos dentro do controller de usuário.
Próximo passo é alterar a tela de login e acrescentar a chamada ao metódo GET que você criou que vai permitir o cadastro do usuário.
Caso você queria utilizar o metódo de adicionar que já existe para o cadastro de usuário será necessário escrever todas as rotas manualmente sem utilizar o Route::resource para usuários. Fora que você terá de mexer no formulário de cadastro para não deixar o usuário escolher o perfil dele e tratar o redirecionamento.
Qualquer dúvida é só postar aí
Abraço
Tá certo. Outra duvida que tenho é o seguinte quero pegar o id do usuário que está logado e jogar dentro de um campo de uma tabela no banco de dados, isso sem um combobox, fazer de forma automática no momento em que o usuário estiver logado. Sei que posso resolver isso utilizando Sessão, porém minha pergunta é tem uma forma mais simples de fazer isso utilizando daquele modelo que tu fez para desenvolvimento da autenticação no laravel?
ResponderExcluirOlá Rodrigo,
ExcluirNa minha visão, a forma mais simples é utilizar o próprio Auth do Laravel. Assim a qualquer momento você pode persistir o id do usuário logado na aplicação. Você pode experimentar printar Auth::user()->id e verificar se é o resultado que você deseja.
Um abraço
Tentei fazer isso cara .Coloquei no controller dai ele deu erro de inserção por este campo ser required.. Criei até um campo no create.blade mas quando coloco a variavel user_id diz que não tem no foreach.. Como seria?
ResponderExcluirVocê pode adicionar um campo antes do validador.
Excluir$input = Input::all();
$input['user_id'] = Auth::user()->id;
Estou partindo do princípio que seu campo no banco de dados seja user_id. Acredito que com isso deva funcionar.
Abraço
Ola Benicio, gostaria de te parabenizar pelo conteudo em seu site. Acompanhei todas aulas sobre autenticaçao e acl, era o que eu estava precisando.
ResponderExcluirQueria ver contigo o seguinte no arquivo de cache teria como deixar ele criptografado para nao ficar exposto as informaçoes dos metodos e do usuario??
E tambem queria ver contigo o seguinte: uma suposiçao se o usuario nao tem permissao de acessar veiculos teria como nao mostrar no menu o link de veiculos?
Se tiver como mostrar como fazer eu iria agradecer muito.
Abraçao.
Olá Tiago,
ExcluirMuito obrigado por acompanhar o blog.
Respondendo a primeira pergunta. Se você observar eu guardo um array no cache. Você poderia utilizar um serialize e base64_encode para ofuscá-lo, mas se você quiser mais segurança recomendo usar o mcrypt. Vou ressaltar que não testei na prática mas acredito que deve funcionar.
Respondendo a segunda pergunta. Eu montei uma macro que monta o menu verificando se o cara tem permissão. Poderia colar aqui no blog mas fica um tanto confuso. Basicamente eu monto o menu com um foreach e faço a checagem com a permissão do usuário logado. Caso você não consiga eu posso te mandar por e-mail ou então eu faço um post para ficar mais organizado.
Um abraço
Cara se puder postar aqui ou manda essa solução por email pra mim fico interessado nessa proposta (rodrigo-demolidor@hotmail.com). E fica a pergunta, vai projetar novas video aulas relacionado a laravel? Aguardo'
ExcluirOlá Rodrigo,
ExcluirTerminei de enviar para seu e-mail uma macro que eu criei para o menu. No momento estou enrolado com alguns projetos mas em breve devo postar novas vídeo aulas sobre o Laravel.
Abraço
E gostaria sim brother. valew. Podes mandar para tiago@hospedashop.com .
ExcluirAbraço.
Cara seguinte no laravel atualmente to executo localhost/nome_diretorio/public como deixo só localhost/nome_diretorio? Lembrando que to usando windows
ResponderExcluirOlá Rodrigo,
ExcluirEu uso sempre VirtualHost então não passo por esse problema, mas acredito que você está procurando uma solução como a desse tutorial http://creolab.hr/2013/03/removing-the-public-segment-in-a-laravel-4-app/
Abraço
Opa bom dia..Quando voltam os vídeos? Vi que você curte muito sobre mapas geolocalização e etc. Quando der poderia disponibilizar uns tutoriais disso no laravel? Tipo um sisteminha de geolocalização usando o PostGis por exemplo. Curtiria bastante um exemplo destes, se puder um dia acatar essa ideia.
ResponderExcluirOlá Rodrigo,
ExcluirAcredito que na segunda metade de agosto agora vou estar fazendo novos vídeos. Inclusive está na lista um vídeo de Geo com Laravel. Pode deixar que a idéia já está acatada.
Grande abraço
Cara desculpa novamente incomodar.. Surgiu uma dúvida .. Num de suas aulas você faz uma máscara para preço usando o data-mask. Tentei usar esse data-mask para máscara de cpf e telefone porém o resultado não foi como esperado. Como seria criar estas máscaras? Ou então atribuir um id a um campo e fazer via jQuery. Fazer a máscara eu sei, mas não consegui atribuir id a um campo naquela maneira diferente de se construir formulários com o blade
ExcluirOlá Rodrigo,
ExcluirSem problemas cara. Incomodo nenhum. A máscara para CPF seria algo assim {{ Form::text('cpf', Input::old('cpf'), array('data-mask' => '000.000.000-00', 'data-mask-reverse' => 'true')) }}, já a do telefone seria assim {{ Form::text('telefone', Input::old('telefone'), array('data-mask' => '(00) 0000-0000', 'data-mask-reverse' => 'true')) }}
Gosto de escrever assim porque evita ficar escrevendo Javascript.
Grande abraço
Opa queria agradecer pela ajuda, pois consegui solucionar o problema. To com outra dúvidas quero implantar uma funcionalidade no sistema, exatamente a do google maps. http://www.princiweb.com.br/demos/google-maps-api-v3-busca-endereco-autocomplete/
ResponderExcluirNesse link já está rodando o projeto. Peguei o projeto no github e importei pro meu no laravel. O problema é que a view index nao foi construída utilizando princípios do blade. Daí quando vou jogar no projeto está dando erro. Há a necessidade de se ter um controller só para mostrar essa página no sistema? Visto que os arquivos de origem desta funcionalidade é apenas js css e html, nada de banco de dados, nem de linguagem server side.
Olá Rodrigo,
ExcluirA criação do controller nesse caso é opcional. Você pode criar a rota e colocar a chamada diretamente na rota. A criação da rota é obrigatória.
Opa blz? Estou desenvolvendo um software e ao tentar implantar esta solução de autenticação com acl, porém não está dando certo. O erro está na variável 'actions' que diz não estar definida. Já copiei o codigo do model e controller de Usuário e o de filtro, bem como adicionei na rota o filtro auth e acl.. O erro da variável está quando é jogado para o arquivo de cache as ações que o usuário logado tem acesso. Variável indefinida: actions.
ResponderExcluirOlá Rodrigo,
ExcluirTerminei de rodar o código do exemplo e não consegui reproduzir o erro. Pelo que eu pude notar o erro ocorre no método 'welcome' correto? Você pode declarar a variável $actions como um array vazio no inicio do método.
Pois é tinha feito esse exemplo em outra oportunidade e deu certo. Declarei esse array vazio e realmente deu certo. Muito Obrigado. Só outra dúvida, no método de ações sei que é salvo as 5 operações que precedem manipulação de uma tabela. Porém como a aplicação entende que por ex: perfil.index, perfil.create, etc. Se trata da tabela de perfis no banco de dados? Por que mapeei aqui na minha aplicação e algumas funcionalidades não estão sendo reconhecidas..
ResponderExcluirOlá Rodrigo,
ExcluirEste são os nomes das rotas que o próprio framework gera quando vc utilizar o resource. Para saber quais nomes são gerados, você pode acessar a pasta do projeto pelo terminar e executar o comando php artisan routes
Opa muito obrigado aí.. Lembra nesse projeto é criado um campo na tabela de usuário pra saber se ele estar ativo ou não..Partindo do pressuposto q 0 não tá ativo e 1 tá ativo como faria para que na tela de listagem, ou index de usuários mostrasse apenas os usuários que estão ativos?
ResponderExcluirOlé Rodrigo,
ExcluirAdicione uma condição "where" na query que monta a listagem.
Abraço
Boa noite Benicio,
ResponderExcluirPrimeiramente parabéns pelo blog e pelas vídeo aulas, faça mais de laravel por favor rsrs.
Uma dúvida no acl, estou implementando ele aqui, e após algumas alterações surgiu um 'bug', quando o usuário loga na aplicação é carregado no cache do laravel as actions que ele tem permissão, supondo que ele tenha acesso a veiculos.index, porém se esse usuário logado for lá em usuários e alterar o perfil dele pra outro perfil que não tenha acesso a veiculos.index, e tentar acessar essa rota ele vai conseguir, visto que a action ainda está em cache, como faria para ao alterar um usuário no método edit do controller UsuariosController, dar um 'refresh' no cache que o acl monta no momento do login ?
Olá Juliano,
ExcluirO que poderíamos fazer na alteração do usuário (método update no UsuariosController) é verificar se o perfil que ele selecionou é igual ao perfil atual. Se esse perfil for diferente, poderiamos matar o cache atual e gravar um novo cache seguindo a idéia do vídeo. Ou poderiamos fazer o que a maioria dos sistemas fazem que eu considero mais seguro, fazer o logout e pedir que o usuário faça o login novamente.
Um abraço
Olá Benicio, obrigado pela resposta, consegui fazer aqui, vou deixar a solução aqui pra caso mais alguém precise.
ExcluirPara o usuário não ter que relogar fiz da seguinte forma, após o update no UsuariosController, adicionei a linha de código abaixo para esquecer o cache daquele usuário que está sendo alterado
$cache = Cache::forget('actions' . $id);
e no filters.php, no filtro acl, adicionei logo após entrar no filter acl as linhas de codigo abaixo, que são as mesmas welcome do UsuariosController, que verifica se tem o cache e cria o mesmo caso não tenha
if(!Cache::has('actions' . Auth::user()->id)) {
foreach (Auth::user()->perfil->acoes as $acao) {
$actions[] = $acao->metodo;
}
Cache::put('actions' . Auth::user()->id, $actions, 120);
}
Abraços !
Olá Juliano,
ExcluirMuito bom. Valeu aí por compartilhar o seu conhecimento.
Grande abraço
Opa blz? Sobre o upload de fotos em Laravel, que você implementou no sistema Filmoteca, existe alguma biblioteca no Laravel que permita redimensionar aquela imagem num tamanho para celular. Daí no caso criaria outro campo na tabela para armazenar essa img menor.. Preciso desta funcionalidade pois criarei uma app mobile.. Se puder ajudar ae
ResponderExcluirOlá Rodrigo,
ExcluirVocê pode utilizar a mesma biblioteca que eu utilizei para gerar imagens de tamanhos diferentes. O nome dela é Intervention Image e você ler a documentação no link http://image.intervention.io.
Lá tem exemplos de como redimensionar, cortar e aplicar efeitos e filtros na imagem.
Abraço
Opa blz.. Instalei o intervention image no meu projeto, chamei a biblioteca conforme está na documentação dentro do arquivo config/app.php. Porém está dando erro em pegar a propriedade getClientOriginalName() do poster ou foto. Estou me baseando no Controller de Filmes onde teve essa funcionalidade de upload de imagens. Outra duvida que tive é: Onde é definido que a imagem vai ser guardada em public/assets/upload ? Por que lá no controller tem sobre o path. Mas onde que o path está setado para este diretório?
ResponderExcluirOlá Rodrigo,
ResponderExcluirO getClientOriginalName é do próprio input file do Laravel e não tem ligação com o Intervention Image. Você já tentou printar a variável do input file?
Isso. Vai ser salva no public/assets/upload. Na linha 12 do arquivo FilmesController, eu passo o caminho.
Abraço
Deu certo, o erro estava em faltar especificar o 'files'=true no form de create e edit. DAquele jeito em que está no upload de imagens, pegar somente o nome da imagem e extensão, quando for criado um web service e consumido numa app, ele vai retornar a imagem? To com uma duvida nisso, pois estarei desenvolvendo a app mobile a partir dos dados da web, o web service já está até criado.
ResponderExcluirOlá Rodrigo,
ExcluirAlém do nome e da extensão, você vai precisar passar o caminho onde a imagem está.
Abraço
Opa blz? Cara estou tendo dificuldades para hospedar uma app laravel 4 no servidor compartilhado hostinger. Já fiz configuração do banco de dados, do .htacess e outras, porém estou com o seguinte erro:
ResponderExcluirThere was an error with your request.500
Se ja tiver tido uma experiência compartilhado para hospedar app laravel 4 ou qualquer outro servidor fala aí ..
Olá Rodrigo,
ExcluirCara eu não conheço em hosting. Já hospedei algumas aplicações na KingHost utilizando .htacess. No link http://www.codegeo.com.br/2013/03/utilizando-htaccess-para-hospedar-uma.html, eu mostro qual o procedimento.
Abraço
Hospedando minha aplicação laravel encontrei alguns erros. Como por exemplo num arquivo em que carrega um arquivo de mensagem json. Na url pega o public_path(). '/message.json'. Em ambiente local roda tranquilo, porém em ambiente de producao no servidor ele não reconhece dai tenho q alterar isso linha a linha sempre que acontecer. Teria uma forma de setar o public_path() com um endereço remoto, que não fosse local?
ResponderExcluirOlá Rodrigo,
ExcluirNunca vi esse problema ocorrer. O public_path é um helper do Laravel que faz referência a pasta public. Se for o caso você pode criar seu próprio helper ou somente fazer a alteração no arquivo util.php que contém o método message. Dessa forma você faz a alteração em um único lugar.
Abraço
Consegui hospedar a app no hostinger. Me tire uma duvidas em relação a upload de imagens. Tenho 2 campos numa tabela, devem armazenar a mesma image porém uma redimensionada para 120x 120 e outra 300x300. A parte do controller tudo bem, mas por se tratarem de dois registros diferentes numa tabela, como fazer para indexar o mesmo campo file na view para os 2? tem como? Hoje tá so assim no meu Form::file('poster') o nome do outro registro e posterGrande. Teria como fazer isso utilizando apenas um campo de up para os dois registros ou só criando um pra cada registro mesmo?
ResponderExcluirOlá Rodrigo,
ExcluirNa minha visão, seria necessário somente um campo no banco de dados onde eu guardaria o nome gerado para o arquivo. E geraria as imagens (utilizando o Intervention Image) com os tamanhos 120 e 300 e concatenaria no nome do arquivo.
Dessa forma na hora de exibir a imagem bastaria chamar $poster . '_120.png' ou $poster . '300.png'
Essa é somente uma das idéias de como fazer o que você está pensando.
Abraço
Pois é, só que tenho a necessidade de ter também um campo na tabela que anexe a img grande. Pois estou criando app em jQuery Mobile, daí em momento de listagem dos dados peegaria a img de 120, e em detalhamento dos dados, pegaria a img de 300. Isso pode ser feito com um único componente File? Por que as imagens serão cadastradas inicialmente as mesmas, a unica diferença é que em em dimensões e em campos de registros diferentes na tabela, foi isso que fiquei um pouco confuso. Mas se não tiver como, ou se tiver e for meio complicado, sem problemas eu faço criando outro campo mesmo..
ExcluirOlá Rodrigo,
ExcluirA idéia é utilizar somente um input file e uma coluna no banco de dados. Nessa coluna, eu vou guardar somente o nome gerado da imagem sem a dimensão.
Agora eu iria utilizar esse nome para gerar as duas imagens com as respectivas dimensões.
Supondo que foi feito o upload da imagem que gerou o nome fictício 'a2b3rt'. Com o Intervention Image, será gerado dois arquivos a2b3rt_120.png e a2b3rt_300.png. Note que o que foi salvo no banco de dados foi somente a2b3rt que será o valor atribuído a uma variável. Dessa forma você pode chamar as duas imagens com um único registro no banco de dados ($poster . '_120.png' ou $poster . '_300.png');
Abraço
Excelente...
ResponderExcluirObrigado de Portugal
Abração....
Olá amigo,
ExcluirEu que agradeço por acompanhar nosso blog.
Grande abraço
Achei muito útil e bem fácil de implementar sua ACL, gostaria de saber como fazer para dar "forget" no cache após a sessão do usuário expirar. Obrigado!
ResponderExcluirOlá Carlos,
ExcluirVocê pode verificar se a sessão ainda está ativa com Auth::check(). Caso ela tenha expirado, basta chamar Cache::forget('actions' . Auth::user()->id) e Session::flush()
Abraço
Olá Benicio,
ResponderExcluirObrigado pela atenção, estarei vendo, parabéns novamente pelo tutorial.
Olá Benicio, boa tarde! Sou eu novamente!
ResponderExcluirQUando tento adcionar uma rota que não pertence ao resource (index, show, create e etc.) tipo a rota, veiculos.search ele não reconhece nas permissões, mesmo cadastrado para o perfil, só consigo acessála como aadmin. Sabe o que poderia ser?
Olá Carlos,
ExcluirVocê deu uma alias para essa rota? Para rotas "manuais" é necessário incluir um alias. Ex:
Route::get('veiculo/search', array('uses' => 'VeiculosController@search', 'as' => 'veiculo.search'));
Lembrando que deve-se adicionar os novos alias no banco de dados.
Abraço
Opa! Não conhecia essa opção. Funcionou certinho. Obrigado mais uma vez.
ExcluirBoa noite, tem com eu seguir a ideia e implantar isso no laravel 5.1? Você tem algum tutorial que explique isso no 5.1? Grato
ResponderExcluirBom dia Rodrigo,
ExcluirInfelizmente ainda não refiz o tutorial com Laravel 5.1. Em breve devo lançar um novo tutorial falando do Laravel 5.1
Abraço
Boa noite, mas eu seguindo esse tutorial no 4 eu consigo pegar a ideia dele e implantar no 5.1?
ExcluirBoa tarde Rodrigo,
ExcluirCom a idéia principal sim. A diferença é que no Laravel 5.1 você vai precisar construir um Middleware para fazer o ACL. Recomendo você dar uma lida no link http://laravel.com/docs/5.1/middleware
Boa tarde, obrigado, com sua dica consegui encontrar um tutorial em ingles, e consegui fazer o acl, agora so to finalizando a parte dinamica, mas os teste que fiz funcionou. Se permitir depois posso colocar o link de onde eu tirei o tutorial.Grato
ExcluirBoa tarde Rodrigo,
ExcluirFique a vontade, pode compartilhar sem problemas.
Um abraço
Olá Benicio, tenho um sistema ainda em Laravel 4.2 no qual uso seu modelo de ACL, porém, agora está havendo um problema de sessions, quando clico em um link, automaticamente ele muda para outro usuário que está logado, pegando a session de outro usuário. Faz alguma ideia do que pode estar ocorrendo?
ResponderExcluirOlá Carlos,
ExcluirTeve alguma alteração no código ou alguma atualização? Não era pra estar ocorrendo isso já que o arquivo que contém as sessões é criado individualmente para cada usuário conforme o vídeo.
Abraço
Obrigado pela atenção Benicio, não houve alteração, mas pelo que averiguei aqui só ocorre na rede específica da empresa, parece mais algo ligado ao firewall ou servidor de internet. Quando passo para uma rede diferente o erro não ocorre. Valeu!
ResponderExcluirOlá Carlos,
ExcluirQuem gerencia essa sessão é o servidor de aplicação mesmo. Seria bom verificar com o pessoal da infra se eles fazem algum tipo de manipulação.
Abraço