【问题标题】:creating own bootstrap in php在 php 中创建自己的引导程序
【发布时间】:2013-09-06 09:04:27
【问题描述】:

我正在尝试在 php.ini 中创建引导文件。 index.php 文件是我在根目录下的引导文件。

define('ROOT',getcwd().DIRECTORY_SEPARATOR);
function url(){
  return sprintf(
    "%s://%s%s",
    isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
    $_SERVER['HTTP_HOST'],
    $_SERVER['REQUEST_URI']
  );
}

在这里,我有上面的代码来获取所有 php 文件中的根目录和基本 url。所以,我有 .htaccess 文件重定向到 index.php 的所有请求。

Options +FollowSymLinks
IndexIgnore */*

# Turn on the RewriteEngine
RewriteEngine On

#  Redirect to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我已经创建了用于测试 bootstrap(test.php) 的 php 文件

<?php
echo ROOT." ".url();
?>

我浏览为http://localdomain.com/HRPayroll/test.php 在这里,页面显示错误。

Fatal error: Call to undefined function url()

在这里,我想通过 index.php 重定向所有请求。在这种情况下,我想在上面的 url test.php 中打印 url() 的返回值 这有什么问题,我是否正确地创建了引导程序?

【问题讨论】:

  • 创建引导程序,你说。 Bootstrap 是一个由多个文件组成的 CSS 库,“创建”它没有任何意义。你需要澄清一下。
  • @Ariane 是 Twitter 引导程序。引导只是应用程序启动时的一系列事件。
  • @FDL 哦,就是这个意思。我一直在看那个引导程序,以至于我完全忘记了这个词本身。我很尴尬。

标签: php .htaccess bootstrapping


【解决方案1】:

看起来 cske 已经有了解决方案,但我只是想添加它来调试此类事情并解决未来的问题,您可以执行以下操作之一:

  1. 检查您的 Apache 日志是否有错误。

  2. 从命令行运行 .php 文件并查看输出的错误。

  3. 为您的代码添加调试并将信息输出到网页。例如,对于您在此处遇到的问题,您可以致电http://php.net/manual/en/function.function-exists.php 并在网页上打印“true”或“false”。

  4. 将调试类添加到您的代码中,并将调试信息写入文件而不是直接写入网页,如果需要,您可以在代码上线后进行调试。

您还应该设置http://php.net/manual/en/function.error-reporting.php 以便获得所有错误输出。

【讨论】:

  • 致命错误:调用未定义的函数 url()。实际上,我想要的是自动将 index.php 的所有代码加载到所有请求 php 文件中,而不在所有文件中使用 include 或 require 函数。
【解决方案2】:
<?php
include('bootstrap.php');
echo ROOT." ".url();
?>

http://www.php.net/manual/en/ini.core.php#ini.auto-prepend-file

index.php

define('ROOT',getcwd().DIRECTORY_SEPARATOR);
function url(){
  return sprintf(
    "%s://%s%s",
    isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
    $_SERVER['HTTP_HOST'],
    $_SERVER['REQUEST_URI']
  );
}
include('test.php');

test.php

<?php
echo ROOT." ".url();
?>

并且 http://localdomain.com/HRPayroll/(因为RewriteCond %{REQUEST_FILENAME} !-f

【讨论】:

  • 我想你不明白我的问题。这里, index.php 是引导文件。我想将所有请求重定向到 index.php 的单个文件,以便我可以获得基本 url 的值。同样,我可以在引导文件和其他代码中使用数据库连接代码。
【解决方案3】:

当你说

RewriteCond %{REQUEST_FILENAME} !-f

意思是请求的资源不是文件,但test.php实际上是一个文件,它会加载它。

如果你想实现控制器,视图等,从根目录中删除测试文件并将其放置在可以通过 index.php 访问的地方

index.php

define('ROOT',getcwd().DIRECTORY_SEPARATOR);

function takeAction($className,$method,$args=array()){
   $path="protected/class.{$className}.php"; 
   if(file_exists($path)){
       include_once($path);
       $instance=new $className();
       $instance->$method($args);
   }else
      throw new Exception('Invalid  resource .... ');      
}

$className=isset($_GET['className']) ? $_GET['className'] : 'defaultClass';
$action=isset($_GET['action']) ? $_GET['action'] : 'index';
$params=$_GET; //

takeAction($className,$action,$params);

你应该有一些约定来翻译你的网址,例如

 http://www.mydomain.com/[className]/[action]/[parameter]

最好的教程是zend router

当然这是未经测试的/工作代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多