Extensões

As extensões são pacotes de software redistribuíveis especialmente projetadas para serem usadas em aplicações Yii e fornecem recursos prontos para o uso. Por exemplo, a extensão yiisoft/yii2-debug adiciona uma barra de ferramentas de depuração na parte inferior de todas as páginas em sua aplicação para ajudar a compreender mais facilmente como as páginas são geradas. Você pode usar as extensões para acelerar o processo de desenvolvimento. Você também pode empacotar seus códigos como extensões para compartilhar com outras pessoas o seu bom trabalho.

Informação: Usamos o termo "extensão" para referenciar os pacotes de software específicos do Yii. Para propósito geral, os pacotes de software que podem ser usados sem o Yii, referenciamos sob o termo de "pacote" ou "biblioteca".

Usando Extensões

Para usar uma extensão, você precisa instalá-lo primeiro. A maioria das extensões são distribuídas como pacotes do Composer que podem ser instaladas seguindo dois passos:

  1. modifique o arquivo composer.json de sua aplicação e especifique quais extensões (pacotes do Composer) você deseja instalar.
  2. execute composer install para instalar as extensões especificadas.

Observe que você pode precisa instalar o Composer caso você não tenha feito isto antes.

Por padrão, o Composer instala pacotes registados no Packagist - o maior repositório open source de pacotes do Composer. Você também pode criar o seu próprio repositório e configurar o Composer para usá-lo. Isto é útil caso você desenvolva extensões privadas que você deseja compartilhar apenas em seus projetos.

As extensões instaladas pelo Composer são armazenadas no diretório BasePath/vendor, onde o BasePath refere-se ao caminho base da aplicação. Como o Composer é um gerenciador de dependências, quando ele instala um pacote, também instala todos os pacotes dependentes.

Por exemplo, para instalar a extensão yiisoft/yii2-imagine, modifique seu composer.json conforme o seguinte exemplo:

{
    // ...

    "require": {
        // ... other dependencies

        "yiisoft/yii2-imagine": "*"
    }
}

Depois da instalação, você deve enxergar o diretório yiisoft/yii2-imagine sob o diretório BasePath/vendor. Você também deve enxergar outro diretório imagine/imagine que contém os pacotes dependentes instalados.

Informação: O yiisoft/yii2-imagine é uma extensão nativa desenvolvida e mantida pela equipe de desenvolvimento do Yii. Todas as extensões nativas estão hospedadas no Packagist e são nomeadas como yiisoft/yii2-xyz, onde xyz varia para cada extensão.

Agora, você pode usar as extensões instaladas como parte de sua aplicação. O exemplo a seguir mostra como você pode usar a classe yii\imagine\Image fornecido pela extensão yiisoft/yii2-imagine:

use Yii;
use yii\imagine\Image;

// gera uma imagem thumbnail 
Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
    ->save(Yii::getAlias('@runtime/thumb-test-image.jpg'), ['quality' => 50]);

Informação: As classes de extensão são carregadas automaticamente pela classe autoloader do Yii.

Instalando Extensões Manualmente

Em algumas raras ocasiões, você pode querer instalar algumas ou todas extensões manualmente, ao invés de depender do Composer. Para fazer isto, você deve:

  1. fazer o download da extensão com os arquivos zipados e os dezipe no diretório vendor
  2. instalar as classes autoloaders fornecidas pela extensão, se houver.
  3. fazer o download e instalar todas as extensões dependentes que foi instruído.

Se uma extensão não tiver uma classe autoloader seguindo a norma PSR-4, você pode usar a classe autoloader fornecida pelo Yii para carregar automaticamente as classes de extensão. Tudo o que você precisa fazer é declarar uma alias root para o diretório root da extensão. Por exemplo, assumindo que você instalou uma extensão no diretório vendor/mycompany/myext e que a classe da extensão está sob o namespace myext, você pode incluir o código a seguir na configuração de sua aplicação:

[
    'aliases' => [
        '@myext' => '@vendor/mycompany/myext',
    ],
]

Criando Extensões

Você pode considerar criar uma extensão quando você sentir a necessidade de compartilhar o seu bom código para outras pessoas. Uma extensão pode conter qualquer código que você deseja, tais como uma classe helper, um widget, um módulo, etc.

É recomendado que você crie uma extensão através do pacote doComposer de modo que possa ser mais facilmente instalado e usado por outros usuário, como descrito na última subseção.

Abaixo estão as básicas etapas que você pode seguir para criar uma extensão como um pacote do Composer.

  1. Crie uma projeto para sua extensão e guarde-o em um repositório CVS, como o github.com. O trabalho de desenvolvimento e de manutenção deve ser feito neste repositório.
  2. Sob o diretório root do projeto, crie um arquivo chamado composer.json como o requerido pelo Composer. Por favor, consulte a próxima subseção para mais detalhes.
  3. Registre sua extensão no repositório do Composer, como o Packagist, de modo que outros usuário possam achar e instalar suas extensões usando o Composer.

composer.json

Cada pacote do Composer deve ter um arquivo composer.json no diretório root. O arquivo contém os metadados a respeito do pacote. Você pode achar a especificação completa sobre este arquivo no Manual do Composer. O exemplo a seguir mostra o arquivo composer.json para a extensão yiisoft/yii2-imagine:

{
    // nome do pacote
    "name": "yiisoft/yii2-imagine",

    // tipo de pacote
    "type": "yii2-extension",

    "description": "The Imagine integration for the Yii framework",
    "keywords": ["yii2", "imagine", "image", "helper"],
    "license": "BSD-3-Clause",
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine",
        "forum": "http://www.yiiframework.com/forum/",
        "wiki": "http://www.yiiframework.com/wiki/",
        "irc": "irc://irc.freenode.net/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "authors": [
        {
            "name": "Antonio Ramirez",
            "email": "amigo.cobos@gmail.com"
        }
    ],

    // dependências do pacote
    "require": {
        "yiisoft/yii2": "*",
        "imagine/imagine": "v0.5.0"
    },

    // especifica as classes autoloading 
    "autoload": {
        "psr-4": {
            "yii\\imagine\\": ""
        }
    }
}

Nome do Pacote

Cada pacote do Composer deve ter um nome que identifica unicamente o pacote entre todos os outros. Os nomes dos pacotes devem seguir o formato vendorName/projectName. Por exemplo, no nome do pacote yiisoft/yii2-imagine, o nome do vendor e o nome do projeto são yiisoft e yii2-imagine, respectivamente.

NÃO utilize yiisoft como nome do seu vendor já que ele é usado pelo Yii para os códigos nativos.

Recomendamos que você use o prefixo yii2- para o nome do projeto dos pacotes de extensões em Yii 2, por exemplo, myname/yii2-mywidget. Isto permitirá que os usuários encontrem mais facilmente uma extensão Yii 2.

Tipo de Pacote

É importante que você especifique o tipo de pacote de sua extensão como yii2-extension, de modo que o pacote possa ser reconhecido como uma extensão do Yii quando for instalado.

Quando um usuário executar composer install para instalar uma extensão, o arquivo vendor/yiisoft/extensions.php será atualizada automaticamente para incluir informações referentes a nova extensão. A partir deste arquivo, as aplicações Yii podem saber quais extensões estão instaladas (a informação pode ser acessada através da propriedade [[yii\base\Application::extensions]]).

Dependências

Sua extensão depende do Yii (claro!). Sendo assim, você deve listar (yiisoft/yii2) na entrada require do composer.json. Se sua extensão também depender de outras extensões ou de bibliotecas de terceiros, você deve lista-los também. Certifique-se de listar as constantes de versões apropriadas (por exemplo, 1.*, @stable) para cada pacote dependente. Utilize dependências estáveis quando sua extensão estiver em uma versão estável.

A maioria dos pacotes JavaScript/CSS são gerenciados pelo Bower e/ou pelo NPM, ao invés do Composer. O Yii usa o plugin de asset do Composer para habilitar a gerência destes tipos de pacotes através do Composer. Se sua extensão depender do pacote do Bower, você pode simplesmente listar a dependência no composer.json conforme o exemplo a seguir:

{
    // package dependencies
    "require": {
        "bower-asset/jquery": ">=1.11.*"
    }
}

O código anterior indica que a extensão depende do pacote jquery do Bower. Em geral, no composer.json, você pode usar o bower-asset/PackageName para referenciar um pacote do Bower no composer.json, e usar o npm-asset/PackageName para referenciar um pacote do NPM, por padrão o conteúdo do pacote será instalado sob os diretórios @vendor/bower/PackageName e @vendor/npm/Packages, respectivamente. Estes dois diretórios podem ser referenciados para usar alias mais curtas como @bower/PackageName e @npm/PackageName.

Para mais detalhes sobre o gerenciamento de asset, por favor, consulte a seção Assets.

Classe Autoloading

Para que suas classes sejam carregadas automaticamente pela classe autoloader do Yii ou da classe autoloader do Composer, você deve especificar a entrada autoload no arquivo composer.json, conforme mostrado a seguir:

{
    // ....

    "autoload": {
        "psr-4": {
            "yii\\imagine\\": ""
        }
    }
}

Você pode listar um ou vários namespaces e seus caminhos de arquivos correspondentes.

Quando a extensão estiver instalada em uma aplicação, o Yii irá criar para cada namespace listada uma alias que se referenciará ao diretório correspondente ao namespace. Por exemplo, a declaração acima do autoload corresponderá a uma alias chamada @yii/imagine.

Práticas Recomendadas

Como as extensões são destinadas a serem usadas por outras pessoas, você precisará, por muitas vezes, fazer um esforço extra durante o desenvolvimento. A seguir, apresentaremos algumas práticas comuns e recomendadas na criação de extensões de alta qualidade.

Namespaces

Para evitar conflitos de nomes e criar classes autocarregáveis em sua extensão, você deve usar namespaces e nomear as classes seguindo o padrão PSR-4 ou o padrão PSR-0.

Seus namespaces de classes devem iniciar com vendorName\extensionName, onde a extensionName é semelhante ao nome da extensão, exceto que ele não deve conter o prefixo yii2-. Por exemplo, para a extensão yiisoft/yii2-imagine, usamos o yii\imagine como namespace para suas classes.

Não use yii, yii2 ou yiisoft como nome do seu vendor. Estes nomes são reservados para serem usados para o código nativo do Yii.

Inicialização das Classes

As vezes, você pode querer que sua extensão execute algum código durante o processo de inicialização de uma aplicação. Por exemplo, a sua extensão pode querer responder ao evento beginRequest da aplicação para ajustar alguma configuração do ambiente. Embora você possa instruir os usuários que usam a extensão para associar explicitamente a sua função ao evento beginRequest, a melhor maneira é fazer isso é automaticamente.

Para atingir este objetivo, você pode criar uma classe de inicialização implementando o [[yii\base\BootstrapInterface]]. Por exemplo,

namespace myname\mywidget;

use yii\base\BootstrapInterface;
use yii\base\Application;

class MyBootstrapClass implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $app->on(Application::EVENT_BEFORE_REQUEST, function () {
             // fazer alguma coisa aqui
        });
    }
}

Em seguida, liste esta classe no arquivo composer.json de sua extensão conforme o seguinte,

{
    // ...

    "extra": {
        "bootstrap": "myname\\mywidget\\MyBootstrapClass"
    }
}

Quando a extensão for instalada em uma aplicação, o Yii instanciará automaticamente a classe de inicialização e chamará o método [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] durante o processo de inicialização para cada requisição.

Trabalhando com Banco de Dados

Sua extensão pode precisar acessar banco de dados. Não pressupunha que as aplicações que usam sua extensão SEMPRE usam o Yii::$db como a conexão do banco de dados. Em vez disso, você deve declarar a propriedade db para as classes que necessitam acessar o banco de dados. A propriedade permitirá que os usuários de sua extensão personalizem quaisquer conexão de banco de dados que gostariam de usar. Como exemplo, você pode consultar a classe [[yii\caching\DbCache]] e ver como declara e usa a propriedade db.

Se sua extensão precisar criar uma tabela específica no banco de dados ou fazer alterações no esquema do banco de dados, você deve:

  • fornecer migrations para manipular o esquema do banco de dados, ao invés de usar arquivos simples de SQL;
  • tentar criar migrations aplicáveis em diferentes SGDB;
  • evitar o uso de Active Record nas migrations.

Usando Assets

Se sua extensão usar um widget ou um módulo, pode ter grandes chances de requerer algum assets para funcionar. Por exemplo, um módulo pode exibir algumas páginas que contém imagens, JavaScript e CSS. Como os arquivos de uma extensão estão todos sob o diretório que não é acessível pela Web quando instalado em uma aplicação, você tem duas escolhas para tornar estes arquivos de asset diretamente acessíveis pela Web:

  • informe aos usuários da extensão copiar manualmente os arquivos de asset para uma pasta determinada acessível pela Web;
  • declare um asset bundle e conte com o mecanismo de publicação de asset para copiar automaticamente os arquivos listados no asset bundle para uma pasta acessível pela Web.

Recomendamos que você use a segunda abordagem de modo que sua extensão possa ser usada com mais facilidade pelos usuários. Por favor, consulte a seção Assets para mais detalhes sobre como trabalhar com assets em geral.

Internacionalização e Localização

Sua extensão pode ser usada por aplicações que suportam diferentes idiomas! Portanto, se sua extensão exibir conteúdo para os usuários finais, você deve tentar usar internacionalização e localização. Em particular,

  • Se a extensão exibir mensagens aos usuários finais, as mensagens devem usadas por meio do método Yii::t() de modo que eles possam ser traduzidas. As mensagens voltadas para os desenvolvedores (como mensagens internas de exceções) não precisam ser traduzidas.
  • Se a extensão exibir números, datas, etc., devem ser formatadas usando a classe [[yii\i18n\Formatter]] com as regras de formatação apropriadas.

Para mais detalhes, por favor, consulte a seção Internacionalização.

Testes

Você quer que sua extensão execute com perfeição sem trazer problemas para outras pessoas. Para alcançar este objetivo, você deve testar sua extensão antes de liberá-lo ao público.

É recomendado que você crie várias unidades de testes para realizar simulações no código de sua extensão ao invés de depender de testes manuais. Toda vez que liberar uma nova versão de sua extensão, você pode simplesmente rodar as unidades de teste para garantir que tudo esteja em boas condições. O Yii fornece suporte para testes, que podem ajuda-los a escrever mais facilmente testes unitários, testes de aceitação e testes funcionais. Para mais detalhes, por favor, consulte a seção Testing.

Versionamento

Você deve dar para cada liberação de sua extensão um numero de versão (por exemplo, 1.0.1). Recomendamos que você siga a prática versionamento semântico ao determinar qual número de versão será usado.

Liberando Versões

Para que outras pessoas saibam sobre sua extensão, você deve liberá-lo ao público.

Se é a primeira vez que você está liberando uma extensão, você deve registrá-lo no repositório do Composer, como o Packagist. Depois disso, tudo o que você precisa fazer é simplesmente criar uma tag de liberação (por exemplo, v1.0.1) no repositório CVS de sua extensão e notificar o repositório do Composer sobre a nova liberação. As pessoas, então, serão capazes de encontrar a nova versão e instalá-lo ou atualizá-lo através do repositório do Composer.

As versões de sua extensão, além dos arquivos de códigos, você deve também considerar a inclusão de roteiros para ajudar as outras pessoas aprenderem a usar a sua extensão:

  • Um arquivo readme no diretório root do pacote: descreve o que sua extensão faz e como faz para instalá-lo e usá-lo. Recomendamos que você escreva no formato Markdown e o nome do arquivo como readme.md.
  • Um arquivo changelog no diretório root do pacote: lista quais mudanças foram feitas em cada versão. O arquivo pode ser escrito no formato Markdown e nomeado como changelog.md.
  • Uma arquivo de atualização no diretório root do pacote: fornece as instruções de como atualizar a extensão a partir de versões antigas. O arquivo deve ser escrito no formato Markdown e nomeado como upgrade.md.
  • Tutoriais, demos, screenshots, etc.: estes são necessários se sua extensão fornece muitos recursos que podem não ser totalmente cobertos no arquivo readme.
  • Documentação da API: seu código deve ser bem documentado para permitir que outros usuários possam ler e entender mais facilmente. Você pode consultar o arquivo da classe Object para aprender como documentar o seu código.

Informação: Os seus comentários no código podem ser escritos no formato Markdown. A extensão yiisoft/yii2-apidoc fornece uma ferramenta para gerar uma documentação da API com base nos seus comentários.

Informação: Embora não seja um requisito, sugerimos que sua extensão se conforme a determinados estilos de codificação. Você pode consultar o estilo de codificação do framework.

Extensões Nativas

O Yii fornece as seguintes extensões que são desenvolvidas e mantidas pela equipe de desenvolvimento do Yii. Todos são registrados no Packagist e podem ser facilmente instalados como descrito na subseção Usando Extensões.

  • yiisoft/yii2-apidoc: fornece um gerador de API de documentação extensível e de alto desempenho. Também é usado para gerar a API de documentação do framework.
  • yiisoft/yii2-authclient: fornece um conjunto comum de autenticadores de clientes, como Facebook OAuth2 client, GitHub OAuth2 client.
  • yiisoft/yii2-bootstrap: fornece um conjunto de widgets que encapsulam os componentes e plug-ins do Bootstrap.
  • yiisoft/yii2-codeception: fornece suporte a testes baseados no Codeception.
  • yiisoft/yii2-debug: fornece suporte a depuração para aplicações Yii. Quando esta extensão é usada, uma barra de ferramenta de depuração aparecerá na parte inferior de cada página. A extensão também fornece um conjunto de páginas independentes para exibir mais detalhes das informações de depuração.
  • yiisoft/yii2-elasticsearch: fornece suporte para o uso de Elasticsearch. Este inclui suporte a consultas/pesquisas básicas e também implementa o padrão Active Record que permite que você armazene os active records no Elasticsearch.
  • yiisoft/yii2-faker: fornece suporte para o uso de Faker para gerar dados falsos para você.
  • yiisoft/yii2-gii: fornece um gerador de código baseado na Web que é altamente extensível e pode ser usado para gerar rapidamente models (modelos), formulários, módulos, CRUD, etc.
  • yiisoft/yii2-imagine: fornece funções de manipulação de imagens comumente utilizados com base no Imagine.
  • yiisoft/yii2-jui: fornece um conjunto de widgets que encapsulam as interações e widgets do JQuery UI.
  • yiisoft/yii2-mongodb: fornece suporte para o uso do MongoDB. Este inclui recursos como consultas básicas, Active Record, migrations, cache, geração de códigos, etc.
  • yiisoft/yii2-redis: fornece suporte para o uso do redis. Este inclui recursos como consultas básicas, Active Record, cache, etc.
  • yiisoft/yii2-smarty: fornece um motor de template baseado no Smarty.
  • yiisoft/yii2-sphinx: fornece suporte para o uso do Sphinx. Este inclui recursos como consultas básicas, Active Record, geração de códigos, etc.
  • yiisoft/yii2-swiftmailer: fornece recursos para envio de e-mails baseados no swiftmailer.
  • yiisoft/yii2-twig: fornece um motor de template baseado no Twig.