Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

atomicBRblaster

file_exists() X URL amigável

Recommended Posts

Fala rapaziada,

 

Estou me utilizando, para fins de estudo, de uma mini-framework que talvez muitos de vocês conheçam idealizada e destrinchada por Matheus Moura em suas videoaulas.

 

O problema é que a dele funciona, e a "minha", identica, não funciona. Pensando ser algo que não estava enxergando, peguei a dele e coloquei no servidor para testar e tive os mesmos problemas, mas quais?

 

Bom, vamos lá.

 

Durante todos os "trâmites" que a framework faz para tratar as requisições numa classe chamada System, ele faz verificações de existência de arquivos a fim de incluir (require_once) os controllers das views a serem "chamadas" e aí vem o problema: durante essa verificação há uma constante na index do projeto que aponta para os respectivos diretórios, sendo:

 

$controller_path = CONTROLLERS . $this->_controller . "Controller.php";

 

E então vem a verificação:

 

if(!file_exists($controller_path)
   die("Controller does not exist.");

require_once($controller_path);
$app = new $this->_controller();

 

Esse teste retorna sempre true, pois há o operador "!" no teste e logo, entra no bloco "die".

 

Após vários testes, tentei o seguinte antes do bloco do if:

 

$controller_path = "C:/wamp/www/project/app/controllers/" . $this->_controller . "Controller.php";

 

Após este teste tive êxito na inclusão dos arquivos, mas pergunta que não quer calar é:

 

Visto que não há aparentes erros de lógica e sintaxe, por que motivo no server do autor original da framework o primeiro código funciona? Há alguma config apache, php ou até do sistema para que a função "file_exists" considere caminhos como o "/app/controllers/indexController.php"?

 

Obrigado a todos que se prontificaram a ler e/ou auxilia! =D Abraços a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguns fatores interferem:

 

- Versão do PHP

- Plataforma (Win32 vs *nix)

- Variáveis de ambiente

- Configurações do Apache

- Configurações do PHP

 

Mas o mais provável mesmo é que, em algum momento, você esteja misturando '\' com '/' no caminho do controller.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o valor da constante CONTROLLERS e o path existente ANTES dessa constante, isto é, do C: até ela (a constante)?

 

Existe no include_path, por modificação do mesmo via set_include_path() esse caminho, para que a inclusão passe a buscar a partir dele também?

 

Existe algum tipo de autoload envolvido?

 

Mas o mais provável mesmo é que, em algum momento, você esteja misturando '\' com '/' no caminho do controller.

Isso até poderia ser explicado no servidor online que é quase sempre Linux/*nix, mas o Windows reconhece tanto um quanto outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguns fatores interferem:

 

- Versão do PHP

- Plataforma (Win32 vs *nix)

- Variáveis de ambiente

- Configurações do Apache

- Configurações do PHP

 

Mas o mais provável mesmo é que, em algum momento, você esteja misturando '\' com '/' no caminho do controller.

 

- PHP 5.3.9

- Windows XP Professional e Windows 7 Home Basic (ambos os mesmos erros)

- Vars de ambiente (não chequei, pois estou usando um WAMP Server)

- Configs do Apache checadas mod_rewrite ativo

- Configs do PHP checadas safe_mode desativado (ambiente de desenvolvimento apenas)

 

Me certifiquei de que os caminhos possuam apenas slashes e não backslashes.

Como disse, sintaxe e lógica está tudo ok, visto que testei o meu código e o código original (no servidor do programador que a desenvolveu).

 

Qual o valor da constante CONTROLLERS e o path existente ANTES dessa constante, isto é, do C: até ela (a constante)?

 

Existe no include_path, por modificação do mesmo via set_include_path() esse caminho, para que a inclusão passe a buscar a partir dele também?

 

Existe algum tipo de autoload envolvido?

 

 

Isso até poderia ser explicado no servidor online que é quase sempre Linux/*nix, mas o Windows reconhece tanto um quanto outro.

 

O autoload está na index e carrega apenas MODELS e HELPERS...Como também checam a existência dos arquivos nos diretórios, também apresentam o mesmo comportamento.

 

Seguem as variáveis "chave" para análise:

 

As contantes ficam na index e possui o valor:

 

define("CONTROLLERS", "/app/controllers/");

 

$controller_path = CONTROLLERS . $this->_controller . "Controller.php"; // Controller Path ORIGINAL (Não funciona)
$controller_path = "C:/wamp/www/project/app/controllers/". $this->_controller . "Controller.php"; // Controller Path testado (Funciona Ok!)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, não faz isso:

define("CONTROLLERS", "/app/controllers/");

Faça isso:

define("DS", DIRECTORY_SEPARATOR);
define("CONTROLLERS", DS."app".DS."controllers".DS);

Isso faz com que não haverá erro na inclusão, tanto no Ruindows quanto o Linux.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma dica, não faz isso:

define("CONTROLLERS", "/app/controllers/");

Faça isso:

define("DS", DIRECTORY_SEPARATOR);
define("CONTROLLERS", DS."app".DS."controllers".DS);

Isso faz com que não haverá erro na inclusão, tanto no Ruindows quanto o Linux.

 

Guilherme, a constante DIRECTORY_SEPARATOR não tem nada a ver com (back)slashes. Ela varia entre ponto-e-vírgula para Windows e dois pontos para sistemas Unix.

 

@atomicBRblaster, o Windows resolve qualquer diretório começado com uma barra '/*' como a raiz do Disco onde o interpretador do PHP está sendo executado. Muito provavelmente C:.

 

Nesse caso, o PHP estaria procurando por 'c:\app\controllers\'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme, a constante DIRECTORY_SEPARATOR não tem nada a ver com (back)slashes. Ela varia entre ponto-e-vírgula para Windows e dois pontos para sistemas Unix.

 

@atomicBRblaster, o Windows resolve qualquer diretório começado com uma barra '/*' como a raiz do Disco onde o interpretador do PHP está sendo executado. Muito provavelmente C:.

 

Nesse caso, o PHP estaria procurando por 'c:\app\controllers\'.

Eu acho que você confundiu. Esta afirmativa é para o PATH_SEPARATOR, não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que você confundiu. Esta afirmativa é para o PATH_SEPARATOR, não?

Exato. DIRECTORY_SEPARATOR são as abrras normais ou invertidas e PATH_SEPARATOR os caracteres descritos pelo Evandro (assumindo que são esses mesmos, não sei).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato. DIRECTORY_SEPARATOR são as abrras normais ou invertidas e PATH_SEPARATOR os caracteres descritos pelo Evandro (assumindo que são esses mesmos, não sei).

São sim, acabei de pesquisar no Google, para mais detalhes:

http://www.codingforums.com/showthread.php?t=192669 (#POST2)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade, vacilo meu.

 

De qualquer forma, pra que redefinir uma constante? Só pq o nome é grande??

 

$path = implode(DIRECTORY_SEPARATOR, [NULL, 'app', 'controllers', NULL]);

 

PHP 5.3

$path = implode(DIRECTORY_SEPARATOR, Array(NULL, 'app', 'controllers', NULL));

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade, vacilo meu.

 

De qualquer forma, pra que redefinir uma constante? Só pq o nome é grande??

 

$path = implode(DIRECTORY_SEPARATOR, [NULL, 'app', 'controllers', NULL]);

 

PHP 5.3

$path = implode(DIRECTORY_SEPARATOR, Array(NULL, 'app', 'controllers', NULL));

Justamente, tenho preguiça de digitar isso tudo, ou ficar copiando/colando. Cada um trabalha de uma forma, até por que, não é errado definir uma constante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu também redefino essas constantes. DS e PS é muito mais rápido do que DIRECTORY_SEPARATOR e PATH_SEPARATOR.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com uma dúvida. É ruim para manutenção do sistema, criar constantes para caminho de um diretório, como por exemplo imagens, javascript?

 

E tem lá muita diferença entre uma variavel global e uma constante, pro uso do exemplo acima?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei algumas das sugestões acima, aliás, obrigado a todos por todas elas. =D

 

Infelizmente não tive êxito com nenhuma delas...

 

[link]http://www.videoaulasbrasil.com.br/php/criando-um-mini-framework-em-php-com-mvc/[/link]

 

Com os devidos créditos ao autor, Matheus Moura, a aula acima e sua sequência, mostram que o código que estou usando funcionam perfeitamente, porém no servidor WAMP que estou utilizando não funciona.

 

Posso estar enganado, mas a função

file_exists()

testa apenas árvore de diretórios do sistema operacional e não testa existência de arquivos baseado na "url" que passamos ao servidor.

 

Procede?

 

Farei um teste com

is_file()

.

Compartilhar este post


Link para o post
Compartilhar em outros sites
is_file

Se não me engano, ele verifica se é um arquivo comum, se sim retorna verdade, caso contráio mentira. EU acho que esta função não seria muito apropriada pra verificar se tal existe, apesar de que muitos utilizam para esta finalidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido!

 

Coisa de amador...tal como sou...=/

 

Dá até vergonha de postar aqui pra verem, mas, acho que fica a lição.

 

Alguém chegou a mencionar, mas eu cego, não enxerguei que a barra no começo fazia o php buscar um o arquivo na árvore de diretórios a partir de "C:\" ou "/" no caso do Unix/Linux.

 

Resumindo:

 

define("CONTROLLERS", "/app/controllers/"); // não funciona
define("CONTROLLERS", "app/controllers/");  // funciona

 

Agradeço a todos que se prontificaram a ajudar. Espero em breve passar de "ajudado" a "ajudador".

 

Valew pessoal!

 

Tópico encerrado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.