Carregamento Automático
O carregamento automático é um conceito em PHP onde você especifica um diretório ou diretórios para carregar classes. Isso é muito mais benéfico do que usar require
ou include
para carregar classes. Também é um requisito para usar pacotes do Composer.
Por padrão, qualquer classe Flight
é carregada automaticamente graças ao Composer. No entanto, se você deseja carregar suas próprias classes, pode usar o método Flight::path()
para especificar um diretório para carregar classes.
Exemplo Básico
Vamos assumir que temos uma estrutura de diretórios como a seguinte:
# Caminho de Exemplo
/home/user/project/my-flight-project/
├── app
│ ├── cache
│ ├── config
│ ├── controllers - contém os controladores para este projeto
│ ├── translations
│ ├── UTILS - contém classes apenas para esta aplicação (tudo em maiúsculas de propósito para um exemplo posterior)
│ └── views
└── public
└── css
└── js
└── index.php
Você pode especificar cada diretório a ser carregado da seguinte maneira:
/**
* public/index.php
*/
// Adicionar um caminho ao carregador automático
Flight::path(__DIR__.'/../app/controllers/');
Flight::path(__DIR__.'/../app/utils/');
/**
* app/controllers/MyController.php
*/
// sem necessidade de namespace
// Todas as classes carregadas automaticamente são recomendadas a serem em Pascal Case (cada palavra capitalizada, sem espaços)
// A partir da versão 3.7.2, você pode usar Pascal_Snake_Case para os nomes de suas classes executando Loader::setV2ClassLoading(false);
class MyController {
public function index() {
// fazer algo
}
}
Namespaces
Se você tiver namespaces, na verdade se torna muito fácil implementar isso. Você deve usar o método Flight::path()
para especificar o diretório raiz (não o diretório do documento ou pasta public/
) de sua aplicação.
/**
* public/index.php
*/
// Adicionar um caminho ao carregador automático
Flight::path(__DIR__.'/../');
Agora, veja como seu controlador poderia ser. Observe o exemplo abaixo, mas preste atenção aos comentários para informações importantes.
/**
* app/controllers/MyController.php
*/
// namespaces são necessários
// os namespaces são iguais à estrutura de diretórios
// os namespaces devem seguir o mesmo padrão de caso que a estrutura de diretórios
// os namespaces e diretórios não podem ter nenhum sublinhado (a menos que Loader::setV2ClassLoading(false) seja definido)
namespace app\controllers;
// Todas as classes carregadas automaticamente são recomendadas a serem em Pascal Case (cada palavra capitalizada, sem espaços)
// A partir da versão 3.7.2, você pode usar Pascal_Snake_Case para os nomes de suas classes executando Loader::setV2ClassLoading(false);
class MyController {
public function index() {
// fazer algo
}
}
E se você quiser carregar automaticamente uma classe em seu diretório de utils, você faria basicamente a mesma coisa:
/**
* app/UTILS/ArrayHelperUtil.php
*/
// o namespace deve corresponder à estrutura de diretórios e caso (observe que o diretório UTILS está todo em maiúsculas
// como na árvore de arquivos acima)
namespace app\UTILS;
class ArrayHelperUtil {
public function changeArrayCase(array $array) {
// fazer algo
}
}
Sublinhados em Nomes de Classe
A partir da versão 3.7.2, você pode usar Pascal_Snake_Case para os nomes de suas classes executando Loader::setV2ClassLoading(false);
.
Isso permitirá que você use sublinhados em seus nomes de classe.
Isso não é recomendado, mas está disponível para aqueles que precisam.
/**
* public/index.php
*/
// Adicionar um caminho ao carregador automático
Flight::path(__DIR__.'/../app/controllers/');
Flight::path(__DIR__.'/../app/utils/');
Loader::setV2ClassLoading(false);
/**
* app/controllers/My_Controller.php
*/
// sem necessidade de namespace
class My_Controller {
public function index() {
// fazer algo
}
}