Lucas Teixeira

@lucastex

Como acessar uma taglib de dentro de um service

com 4 comentários

Uma situação que acontece muito, é a reutilização das funções de taglibs dentro dos controllers de sua aplicação grails. Isso é muito fácil de se fazer, basta chamar o método usando o objeto com o nome do namespace da taglib.
Ou seja, para usar dentro do controller a função de formatação de números, definida pela função formatNumber (taglib já no core do grails), é só fazer a chamada assim:

def myAction = {
render g.formatNumber([number:5000.234, type: "number", maxFractionDigits: 2])
}

Esta função é equivalente a chamar a taglib de dentro de um gsp da seguinte maneira:

<g:formatNumber number="5000.234" type="number" maxFractionDigits="2" />

Mas quando precisamos fazer isto, por exemplo, dentro de um service, encontramos um probleminha chato, as taglibs não são injetadas automaticamente. Para contornar essa “situação“, temos que buscar a taglib manualmente, da seguinte maneira:

def myTag = grailsApplication.mainContext.
            getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')
def value = myTag.formatNumber([number:5000.234, type: "number", maxFractionDigits: 2])

Ahhh, para isso não se esqueca de injetar o objeto da grailsApplication da seguinte maneira

class MeuService {
   def grailsApplication
   (...)
}

Bin-go.

Postado por Lucas Teixeira

February 3rd, 2010 at 10:35 pm

Postado em Grails

Com as tags , , , , ,

4 Respostas a 'Como acessar uma taglib de dentro de um service'

Receber novos comentários por RSS or TrackBack to 'Como acessar uma taglib de dentro de um service'.

  1. Olá, Lucas

    É meu primeiro comentário em seu blog, então gostaria de, primeiramente, lhe parabenizar. Há um excelente conteúdo aqui!

    Sobre o post: é uma forma bem engenhosa de se utilizar uma TagLib dentro de um Service. No entanto, sabemos que não é uma boa prática por ferir os princípios do MVC. Acho interessante destacar aos “novatos” que isso não é recomendado.

    Na própria documentação do Grails encontramos: A tag library fulfills role of “view helper” in the Model View Controller (MVC) pattern and is responsible aiding GSP rendering.

    Abraços!

    Lauro Becker

    21 Aug 10 at 08:59

  2. Oi Lauro!

    Perfeito seu comentário, você está coberto de razão!
    Não podemos ‘incentivar’ esta abordagem das taglibs, porém, muitas vezes as pessoas acabam implementando lógicas, como vc disse, ‘helpers’ nas taglibs, mesmo sem o foco de view.

    Acho que a abordagem mais adequada, seria ter a funcionalidade ‘helper’ isolada em classes dentro de src/groovy por exemplo, fazer sua declaração como um bean do spring através do resources.groovy e injetá-la tanto em uma taglib, ou no service, o que acha?

    Um abraço!

    Lucas Teixeira

    21 Aug 10 at 15:06

  3. É o que realmente me parece mais interessante!

    Talvez declará-la como bean seja um pouco demais, se for somente uma classe com alguns métodos utilitários. Eu não faria tuuuddooo isso, hehe. Mas fica a critério do desenvolvedor.

    Abraços!

    Lauro Becker

    21 Aug 10 at 17:26

  4. Oi Lauro!

    Bom, declará-la como um bean, imho, traz outras facilidades, como por ex. a injeção de dependências dos outros beans e o controle do ciclo de vida do componente pelo spring.
    Mas como vc disse, cada contexto é um contexto, cada caso é um caso. :)

    Obrigado !

    Lucas Teixeira

    21 Aug 10 at 23:18

Deixe um comentário

Get Adobe Flash playerPlugin by wpburn.com wordpress themes