Ir para conteúdo

POWERED BY:

Arquivado

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

Pedro Roccon

Caminhos absolutos no PHP

Recommended Posts

Pessoal, boa tarde. Primeiramente obrigado por se interessarem no meu tópico.

 

Bom vamos lá, eu preciso tirar uma dúvida que me atormenta a muito tempo. Eu tenho 1 aplicação em PHP que possuí 1 área administrativa. Vou exemplificar ilustrando abaixo como estão meus diretórios.

 

|-- ROOT

|------ /admin

|------------ /controllers

|------------ /models

|------------ /views

|---------------- /HelloWorld

|-------------------- index.php

|------------ index.php

|------------ header.php

|------------ footer.php

 

Resumindo, tenho uma pasta /admin que contém as subpastas /controllers, /models e /views. A pasta /views possui outra subpasta chamada /HelloWorld que por sua vez possui um arquivo index.php

 

Gostaria de chamar em /views/HelloWord/index.php o header que está em /admin/header.php, porém não consigo fazer isso de uma forma dinâmica. Gostaria que sempre meu include/require fosse relativo à pasta ROOT independente da pasta do meu script. Vocês tem alguma idéia de como posso fazer isso?

 

Já tentei $_SERVER['DOCUMENT_ROOT'].'/admin/header.php', porém sem sucesso.

 

$_SERVER['DOCUMENT_ROOT'] me retorna algo como /home/dominio/www/, porem quando uso no include/require não funciona.

 

Alguém pode me ajudar? Desde já agradeço

 

Obrigado! :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rockrgo, sua dica foi legal, muito obrigado! Porém eu não posso que ele sempre retorne para a raiz, eu preciso que ele volte para uma pasta de referência minha, por exemplo, /admin. Acho que me expressei mal em minha pergunta.

 

As vezes minha aplicação pode estar todando em 1 subpasta que está na raiz, por exemplo: /aplicação/admin, entendeu?

 

Eu queria que os includes/requires fossem independente da pasta que eu estivesse nos servidor, ou seja, caminhos absolutos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rockrgo, sua dica foi legal, muito obrigado! Porém eu não posso que ele sempre retorne para a raiz, eu preciso que ele volte para uma pasta de referência minha, por exemplo, /admin. Acho que me expressei mal em minha pergunta.

 

As vezes minha aplicação pode estar todando em 1 subpasta que está na raiz, por exemplo: /aplicação/admin, entendeu?

 

Eu queria que os includes/requires fossem independente da pasta que eu estivesse nos servidor, ou seja, caminhos absolutos.

Você está trabalhando com autoload e namespaces?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está trabalhando com autoload e namespaces?

 

Trabalho somente com autoload, com o namespace ainda não. Meus includes e requires seriam referente ao header.php e footer.php das páginas, e não das classes que preciso importar. Ou seja, seria mais para incluir os HTMLs.

 

Muito obrigado pela dica, vou dar uma olhada :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use constantes mágicas e trate com dirname()

 

http://www.if-not-true-then-false.com/2010/howto-use-php-magic-constants-file-dir-function-class-method-line-namespace/

 

após isso, e só declarar em uma constante global

define('ROOT', dirname(__DIR__) . DIRECTORY_SEPARATOR );
include_once ROOT . 'nome_da_pasta';

a cada dirname aplicado ela via retornar um diretorio a menos dirname(dirname(__DIR__))

 

 

http://www.php.net/dirname

 

crie constante com nome de cada pasta, assim fica mais fácil de controllar sua aplicação

 

Exemplo:

 

defines.inc.php

define('DS', DIRECTORY_SEPARATOR );
define('ROOT', realpath( dirname(dirname(__DIR__))) . DS);
define('CONFIG', BASE_DIR . 'config'. DS);
define('TOOLS', BASE_DIR . 'tools'. DS);
define('CLASSES', ROOT . 'classes' . DS );
define('EMAIL', ROOT . 'classes' . DS .'Email' . DS);
define('CONTROLERS', ROOT . 'controllers' . DS);

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Use constantes mágicas e trate com dirname()

 

http://www.if-not-true-then-false.com/2010/howto-use-php-magic-constants-file-dir-function-class-method-line-namespace/

 

após isso, e só declarar em uma constante global

define('ROOT', dirname(__DIR__) . DIRECTORY_SEPARATOR );
include_once ROOT . 'nome_da_pasta';

a cada dirname aplicado ela via retornar um diretorio a menos dirname(dirname(__DIR__))

 

 

http://www.php.net/dirname

 

crie constante com nome de cada pasta, assim fica mais fácil de controllar sua aplicação

 

Exemplo:

 

defines.inc.php

define('DS', DIRECTORY_SEPARATOR );
define('ROOT', realpath( dirname(dirname(__DIR__))) . DS);
define('CONFIG', BASE_DIR . 'config'. DS);
define('TOOLS', BASE_DIR . 'tools'. DS);
define('CLASSES', ROOT . 'classes' . DS );
define('EMAIL', ROOT . 'classes' . DS .'Email' . DS);
define('CONTROLERS', ROOT . 'controllers' . DS);

 

Willians, meu problema é que por exemplo, se eu utilizo o $_SERVER['DOCUMENT_ROOT'] ou até mesmo o __DIR__ ele me retornar /home/usuario/www e não a raiz do site em si. Então eu tento adicionar este código em meu include e ele fica algo como /home/usuario/www/admin/header.php, o que faz o PHP não encontrar o arquivo solicitado.

 

Eu precisaria de algo que sempre me retornasse a raiz para padronizar meus includes e requires. Por exemplo, independente da pasta que eu esteja eu utilizar sempre:

include($caminho.'/admin/header.php');

Alguém sabe porque ele me retorna este caminho?

 

Obrigado, pela paciência de todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá ;)

 

vamos supor que você tenha uma pasta chamada config =D

 

|-- ROOT

|------ /config <--////////////////////

|------ /admin

|------------ /controllers

|------------ /models

|------------ /views

|---------------- /HelloWorld

|-------------------- index.php

|------------ index.php

|------------ header.php

|------------ footer.php

 

Nela você coloca suas configurações, e esqueça as outras por enquanto.

 

Dentro desta pasta config, você vai colocar um script com o nome config.inc.php, é só um exemplo coloque o nome que você quiser.

 

na sua index.php coloque isso

<?php
define( 'DS', DIRECTORY_SEPARATOR );
define('BASE_DIR', dirname( __DIR__ ) . DS);
include_once( BASE_DIR .'config'. DS .'config.inc.php');

Faça com que ela ache a pasta config e o arquivo config.inc.php

 

Não se esqueça que dirname() remove uma pasta

 

Quando conseguir achar o arquivo config.inc.php e só setar as outras constantes na config.inc.php ou outro arquivo e inclua a mesma na config.inc.php

 

 

Resumindo para que isso funcione, o primeiro arquivo a ser chamado tem que ser a config.inc.php

ela será a mãe de seu sistema, através dela você incluira sua classes via Autoloader

 

use também

http://www.php.net/manual/pt_BR/function.file-exists.php

 

 

nas minhas aplicações eu só uso isso na index, e um arquivo de router, que seria em outros termos suas includes

<?php
define( 'DS', DIRECTORY_SEPARATOR );
define('BASE_DIR', dirname( __DIR__ ) . DS);
include_once( BASE_DIR .'config'. DS .'config.inc.php');

Dispatcher::getInstance()->dispatch();

$_SERVER['DOCUMENT_ROOT'] Não uso, mas é a mesma coisa que __DIR__

 

 

veja um exemplo da minha config, não é lá as maravilhas mas quebra um galho

<?php
if (!defined('_BASE_DIR_'))
    exit('Proibido acesso direto ao script!');

@ini_set('display_errors', 1);
@error_reporting(E_ALL | E_STRICT);	

//ini_set('memory_limit', '-1');
//ini_set('session.save_path', _BASE_DIR_ . 'session' );

require_once(__DIR__ . DS . 'defines.inc.php');
require_once(__DIR__ . DS . 'bootstrap.php');
require_once(__DIR__ . DS . 'database.php');

/* Trying to redefine HTTP_HOST if empty (on some webservers...) */
if (!isset($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_HOST']))
	$_SERVER['HTTP_HOST'] = @getenv('HTTP_HOST');

define('_VL_NAME_HOST_', DomainCheck::check( $_SERVER['HTTP_HOST'] ) );	
ini_set('session.cookie_domain', '.'. _VL_NAME_HOST_ );

session_start();
session_regenerate_id();
@ob_start("ob_gzhandler");

//$start_time = microtime(true);

/* SSL configuration */
//define('_VL_SSL_PORT_', 443);

//define('_VL_CONFIG_IDIOMA_', 'pt_BR' ); //Define o indioma

//Define as configurações do Analytics
define('_VL_ANALYTICS_ACCOUNT_', '');

/* email para avisos do sistema */
define('_VL_EMAIL_ADMIN_', 'wdase@odas.com');

/* Melhorar a configuração do PHP para evitar problemas */
ini_set('upload_max_filesize', '100M');
ini_set('default_charset', 'utf-8');
ini_set('magic_quotes_runtime', 0);

/* charset correto Apache (exceto se que seja tarde demais */
if (!headers_sent())
	header('Content-Type: text/html; charset=utf-8');

/* Redefine REQUEST_URI if empty (on some webservers...) */
if (!isset($_SERVER['REQUEST_URI']) || empty($_SERVER['REQUEST_URI']))
{
	if (!isset($_SERVER['SCRIPT_NAME']) && isset($_SERVER['SCRIPT_FILENAME']))
		$_SERVER['SCRIPT_NAME'] = $_SERVER['SCRIPT_FILENAME'];
	if (isset($_SERVER['SCRIPT_NAME']))
	{
		if (basename($_SERVER['SCRIPT_NAME']) == 'index.php' && empty($_SERVER['QUERY_STRING']))
			$_SERVER['REQUEST_URI'] = dirname($_SERVER['SCRIPT_NAME']).'/';
		else
		{
			$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
			if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING']))
				$_SERVER['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
		}
	}
}

date_default_timezone_set('America/Sao_Paulo');
setlocale( LC_ALL, 'pt_BR', 'pt_BR.iso-8859-1', 'pt_BR.utf-8', 'portuguese' );

//Define um Salt para segurança da senha ou token de ativação
define('_VL_SECURITY_SALT_', '41837580das5038e260692f01bdbcb86');
/* Define o cookie domain*/
define('_VL_COOKIE_DOMAIN_', '.'. _VL_NAME_HOST_);

/* Chave de criptografia */
define('_VL_COOKIE_KEY_', _VL_NAME_HOST_);

//Define as configurações de smtp
define('_VL_HOST_SMTP_', 'mail.dasdsa.com.br');

define('_USERNAME_SMTP_', 'noreply@das.com.br');

define('_PASSWORD_SMTP_', 'NOdasd4e');

/*
if(isset($_COOKIE['session_id']))
	session_id( session_id() );
	session_start();
if(!isset($_COOKIE['session_id']))
	setcookie('session_id', session_id(), 0, '/', '.ddddddddddddd.com');
*/

require_once(__DIR__ . DS . 'defines_uri.inc.php');

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.