Cursos Magento

Como pegar o Nome da pasta, URL’s e outros caminhos no Magento 2

,

Atualizado em 28 de abril de 2020

Durante o desenvolvimento para Magento 2 é normal precisar obter caminhos de pastas, url’s de imagens, e outros caminhos físicos.

Neste artigo veremos como fazer isso de diversas formas e com vários exemplos.

Instanciando o DirectoryList

A classe responsável por nos fornecer a maioria dos diretórios e caminhos é a classe \Magento\Framework\Filesystem\DirectoryList.

Uma vez instanciada você tem vários métodos úteis para obter praticamente qualquer caminho no Magento 2.

Idealmente você deve injetar a classe com o uso de injeção de dependência. Porém veremos duas formas de fazê-lo.

Via ObjectManager (não recomendável)

Embora não seja recomendado, esta é uma forma de chegar ao resultado.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$directory = $objectManager->get('\Magento\Framework\Filesystem\DirectoryList'); 
echo $rootPath = $directory->getRoot();

O exemplo acima exibirá o caminho da pasta raíz do Magento. Ex: /var/www/html.

Via Injeção de Dependência

protected $_dir;
...

public function __construct(
    ...
    \Magento\Framework\Filesystem\DirectoryList $dir,
    ...        
) {
    ...
    $this->_dir = $dir;
    ...
}

Se você não está familiarizado(a) com Injeção de Dependência e outros recursos do Magento 2, considere se inscrever no Magento 2: O Curso.

Outros diretórios e paths

Ainda usando o DirectoryList em $_dir, podemos fazer:

$this->_dir->getRoot(); // Resultado: /var/www/html/meumagento

$this->_dir->getPath('media'); // Resultado: /var/www/html/meumagento/pub/media

$this->_dir->getPath('pub'); // Resultado: /var/www/html/meumagento/pub

$this->_dir->getPath('static'); // Resultado: /var/www/html/meumagento/pub/static

$this->_dir->getPath('var'); // Resultado: /var/www/html/meumagento/var

$this->_dir->getPath('app'); // Resultado: /var/www/html/meumagento/app

$this->_dir->getPath('etc'); // Resultado: /var/www/html/meumagento/app/etc

$this->_dir->getPath('lib_internal'); // Resultado: /var/www/html/meumagento/lib/internal

$this->_dir->getPath('lib_web'); // Resultado: /var/www/html/meumagento/lib/web

$this->_dir->getPath('tmp'); // Resultado: /var/www/html/meumagento/var/tmp

$this->_dir->getPath('cache'); // Resultado: /var/www/html/meumagento/var/cache

$this->_dir->getPath('log'); // Resultado: /var/www/html/meumagento/var/log

$this->_dir->getPath('session'); // Resultado: /var/www/html/meumagento/var/session

$this->_dir->getPath('setup'); // Resultado: /var/www/html/meumagento/setup/src

$this->_dir->getPath('di'); // Resultado: /var/www/html/meumagento/var/di

$this->_dir->getPath('upload'); // Resultado: /var/www/html/meumagento/pub/media/upload

$this->_dir->getPath('generation'); // Resultado: /var/www/html/meumagento/var/generation

$this->_dir->getPath('view_preprocessed'); // Resultado: /var/www/html/meumagento/var/view_preprocessed

$this->_dir->getPath('composer_home'); // Resultado: /var/www/html/meumagento/var/composer_home

$this->_dir->getPath('html'); // Resultado: /var/www/html/meumagento/var/view_preprocessed/html

E pra pegar URL’s?

O nosso DirectoryList também nos ajuda nesta tarefa. Neste caso usaremos o método getUrlPath ao invés de getPath. Só precisamos passar o nome da pasta que queremos (media, pub, var, static, tmp, cache, log, etc).

Todos os nomes disponíveis são constantes de outra classe: a \Magento\Framework\App\Filesystem\DirectoryList (ver classe no Github). Note que há um \App ali no meio. Não é a mesma classe.

Exemplos:

  • Pasta media: $this->_dir->getUrlPath(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)
  • Pasta pub: $this->_dir->getUrlPath(\Magento\Framework\App\Filesystem\DirectoryList::PUB)
  • Pasta static: $this->_dir->getUrlPath(\Magento\Framework\App\Filesystem\DirectoryList::STATIC_VIEW))

Algumas constantes não estarão disponíveis no método getUrlPath, pois correspondem à pastas de sistema. Sendo assim, elas só podem ser usadas com getPath. Ex: \Magento\Framework\App\Filesystem\DirectoryList::SESSION

E se for uma url diferente? Onde está o getUrl?

Eventualmente você quer chamar uma url específica, como checkout/onepage/success. Neste caso, o getUrlPath do DirectoryList não ajudará muito.

Para estes casos faremos uso do \Magento\Framework\UrlInterface.

Nele você tem o método getUrl que ainda permite passar os parâmetros da rota, exatamente como no Magento 1.

class Magenteiro
{
    /**
     * @var \Magento\Framework\UrlInterface
     */
    protected $_urlBuilder;

    public function __construct(
        \Magento\Framework\UrlInterface $_urlBuilder
    ) { 
        $this->_urlBuilder = $context->getUrlBuilder();
    }

    public function exemplo()
    {
        return $this->_urlBuilder->getUrl('checkout/onepage/success');
    }

 

Dica: se você estiver dentro de um Helper, é provável que você esteja estendendo \Magento\Framework\App\Helper\AbstractHelper. Neste caso, você já terá o Url Builder dentro de $this->_urlBuilder.

Conclusão

Como podemos ver, o UrlBuilder é como o equivalente do Mage::getUrl que tínhamos no Magento 1.

Com ele podemos obter caminhos de URL’s dentro do Magento 2. Se quisermos diretórios, então usamos o DirectoryList.

No Magento 2 também não temos uma classe mãe que podemos chamar em qualquer lugar e levando as boas práticas em consideração. Por isso o melhor jeito é se referir a ela com injeção de dependência como fizemos aqui.

Bônus: Aula de Dependency Injection (grátis)

Receba 3 aulas do curso de Magento 2 aqui do Magenteiro em seu e-mail. No primeiro dia você receberá acesso à aula sobre Injeção de dependência, o que tornará este artigo ainda mais claro.

Referências: StackOverflow e Alan Storm

Últimos posts por Ricardo Martins (exibir todos)
Assuntos: | |
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/obter-urls-paths-magento-2/"]