Simplificando, a função do controlador é aceitar solicitações. Ele utiliza o método get, neste caso via URI, para carregar um módulo de função para atualizar ou enviar uma camada de apresentação. O controlador usará a variável global automática $_GET para determinar qual módulo carregar.
Um exemplo de solicitação seria assim:
http://example.com/index.php?module=login
Isso parece simples, mas no processo de implementação não é. Aqui estão as partes do argumento que podem ser reconhecidas por vários controladores:
módulo define qual módulo usar, como usuários. A classe do módulo define qual classe funcional usar, como se você deseja que os usuários efetuem login ou logout.
event define qual evento específico usar.
Um exemplo mais complexo pode explicar a URL da solicitação que é composta por cada argumento acima:
http://example.com/index.php?module=users&class=login
Esta solicitação informa ao controlador que. ele deve carregar o módulo de usuários, depois a classe de login e, finalmente, executar o evento padrão login::__default() porque nenhum evento específico está definido.
A seguir está a parte específica do código:
<?php
/**
*index.php
*
* @autor Joe Stump < [email protected] >
* @copyright Joe Stump < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php');
// {{{ __autoload($class)
/**
* __carga automática
*
* O Autoload é executado pelo PHP quando não consegue encontrar uma classe que está tentando carregar.
* Ao nomear nossas classes de forma inteligente, seremos capazes de carregar a maioria das classes
* dinamicamente.
*
* @autor Joe Stump < [email protected] >
* @param string $class Nome da classe que estamos tentando carregar
* @return nulo
* @packageFramework
*/
função __autoload($classe)
{
$arquivo = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$arquivo);
}
// }}}
if (isset($_GET['module'])) {
$módulo = $_GET['módulo'];
if (isset($_GET['evento'])) {
$evento = $_GET['evento'];
} outro {
$evento = '__default';
}
if (isset($_GET['class'])) {
$classe = $_GET['classe'];
} outro {
$classe = $módulo;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
if (arquivo_existe($arquivoclasse)) {
require_once($classFile);
if (class_exists($classe)) {
tentar {
$instancia = new $class();
if (!FR_Module::isValid($instance)) {
die("O módulo solicitado não é um módulo de framework válido!");
}
$instance->moduleName = $module;
if ($instance->authenticate()) {
tentar {
$resultado = $instancia->$evento();
if (!PEAR::isError($resultado)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance);
if (!PEAR::isError($presenter)) {
$presenter->display();
} outro {
morrer($presenter->getMessage());
}
}
} catch (Exceção $ erro) {
morrer($erro->getMessage());
}
} outro {
die("Você não tem acesso à página solicitada!");
}
} catch (Exceção $ erro) {
morrer($erro->getMessage());
}
} outro {
die("Um módulo válido para sua solicitação não foi encontrado");
}
} outro {
die("Não foi possível encontrar: $classFile");
}
} outro {
die("Um módulo válido não foi especificado");
}
?>
A seguir estão os comentários específicos sobre o código acima:
carregue "config.php"
para definir a função __autoload(). Esta é uma nova função no PHP5, que facilita o carregamento dinâmico de diversas classes.
Se um argumento for definido, então os módulos relevantes, classes e eventos específicos são carregados,
seguidos por alguns julgamentos e operações de erro específicas.
Finalmente, depois que tudo estiver correto, a camada de apresentação
[URL
amigável]
é carregada.mencionado no exemplo acima é Se você se sentir desconfortável, use mod_rewrite para implementar URLs amigáveis. A seguir está o código padrão de reescrita escrito pelo autor para esta estrutura:
RewriteEngine On
# Altere o URI aqui para o que você deseja que sua página inicial seja
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# Alterações / index.php?module=bem-vindo a /welcome
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# Altera /index.php?module=users&class=login para /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# Alterações /index.php?module=users&class=login&event =foo
# para /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
Estendendo o Controlador
[Controlador Estendido]
tem um controlador centralizado Um dos a vantagem é que depois de adicionar algumas funções, elas podem ser refletidas imediatamente através do controlador. Aqui estão algumas idéias para estender este controlador para tornar a estrutura mais poderosa em geral:
Você pode usar o SoapServer, uma novidade no PHP5, para detectar automaticamente se uma solicitação é SOAP.
Você
pode usar controladores para filtrar todas as variáveis globais automáticas, como $_GET e $_POST para evitar código HTML malicioso, etc.
converter expressões em tempo real, por exemplo, do modo padrão para o modo PDF
, você pode adicionar diretamente o mecanismo de cache no controlador. A vantagem disso é que todo o aplicativo pode usar o cache para melhorar a eficiência
. uma coisa a notar é que você está no controlador. A funcionalidade adicionada será refletida no programa geral. Por exemplo, você deseja filtrar todas as variáveis globais automáticas, mas muitos administradores de aplicativos precisam usar algum código HTML, o que se torna complicado (Nota do tradutor: minha ideia é adicionar uma instrução condicional if para carregar um módulo específico sem aplicar a filtragem função).