larevel学习笔记 程序体系结构

初学Laravel, 但是什么Laravel 安装,简介这里就不说了。这个去网上找找还是不少资料的

这里先浅显的说一下laravel的结构(当作抛砖引玉吧,好吧连砖都算不上。。。)

安装完Laravel 可以看到有4个文件夹:

app

包含了站点的controllers(控制器),models(模型),views(视图)和assets(资源)。这些是网站运行的主要代码,你会将你大部分的时间花在这些上面。

bootstrap

用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。

public

这个文件夹是唯一外界可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可用来存放任何可以公开的静态资源,如css,Javascript,images等。

vendor

用来存放所有的第三方代码,在一个典型的Laravel应用程序,这包括Laravel源代码及其相关,并含有额外的预包装功能的插件。

但我们的大部分开发都是在app文件夹下进行的

所以app 文件夹的详细介绍如下:

文件的文件夹

作用

/app/config/

配置应用程序的运行时规则、 数据库、 session等等。包含大量的用来更改框架的各个方面的配置文件。大部分的配置文件中返回的选项关联PHP数组。

/app/config/app.php

各种应用程序级设置,即时区、 区域设置(语言环境)、 调试模式和独特的加密密钥。

/app/config/auth.php

控制在应用程序中如何进行身份验证,即身份验证驱动程序。

/app/config/cache.php

如果应用程序利用缓存来加快响应时间,要在此配置该功能。

/app/config/compile.php

在此处可以指定一些额外类,去包含由‘artisan optimize’命令声称的编译文件。这些应该是被包括在基本上每个请求到应用程序中的类。

/app/config/database.php

包含数据库的相关配置信息,即默认数据库引擎和连接信息。

/app/config/mail.php

为电子邮件发件引擎的配置文件,即 SMTP 服务器,From:标头

/app/config/session.php

控制Laravel怎样管理用户sessions,即session driver, session lifetime。

/app/config/view.php

模板系统的杂项配置。

/app/controllers

包含用于提供基本的逻辑、 数据模型交互以及加载应用程序的视图文件的控制器类。

/app/database/migrations/

包含一些 PHP 类,允许 Laravel更新当前数据库的架构并同时保持所有版本的数据库的同步。迁移文件是使用Artisan工具生成的。

/app/database/seeds/

包含允许Artisan工具用关系数据来填充数据库表的 PHP 文件。

/app/lang/

PHP 文件,其中包含使应用程序易于本地化的字符串的数组。默认情况下目录包含英语语言的分页和表单验证的语言行。

/app/models/

模型是代表应用程序的信息(数据)和操作数据的规则的一些类。在大多数情况下,数据库中的每个表将对应应用中的一个模型。应用程序业务逻辑的大部分将集中在模型中。

/app/start/

包含与Artisan工具以及全球和本地上下文相关的自定义设置。

/app/storage/

该目录存储Laravel各种服务的临时文件,如session, cache,  compiled view templates。这个目录在web服务器上必须是可以写入的。该目录由Laravel维护,我们可以不关心。

/app/tests/

该文件夹给你提供了一个方便的位置,用来做单元测试。如果你使用PHPUnit,你可以使用Artisan工具一次执行所有的测试。

/app/views/

该文件夹包含了控制器或者路由使用的HTML模版。请注意,这个文件夹下你只能放置模版文件。其他的静态资源文件如css, javascript和images文件应该放在/public文件夹下。

/app/routes.php

这是您的应用程序的路由文件,其中包含路由规则,告诉 Laravel 如何将传入的请求连接到路由处理的闭包函数、 控制器和操作。该文件还包含几个事件声明,包括错误页的,可以用于定义视图的composers。

/app/filters.php

此文件包含各种应用程序和路由筛选方法,用来改变您的应用程序的结果。Laravel 具有访问控制和 XSS 保护的一些预定义筛选器。

这就是 Laravel 的大致结构。Laravel不像其它框架那样有许多xml文件用来系统配置,她更看重的是目录约定,在指定的目录下编写指定的操作。

顺带说一下 Laravel 的启动流程吧(这个在官方文档中有介绍)

  1. 请求进入 public/index.php 文件。
  2. bootstrap/start.php 文件创建应用程序对象并检测环境。
  3. 内部的 framework/start.php 文件配置相关设置并加载服务提供器。
  4. 加载应用程序 app/start 目录下的文件。
  5. 加载应用程序的 app/routes.php 文件。
  6. 将 Request 对象发送给应用程序对象,应用程序对象返回一个 Response 对象。
  7. 将 Response 对象发回客户端。

应用程序的启动文件被存放在app/start目录中。默认情况下,该目录下包含三个文件:global.php、local.php 和 artisan.php文件。

global.php启动文件默认包含一些基本项目,例如日志的注册以及载入app/filters.php 文件。

然而,你可以在该文件里做任何你想做的事情。无论在什么环境下,它都将会被自动包含进_每一个_request中。而local.php 文件仅在local环境下被执行。

当然,如果除了local环境你还有其他环境的话,你也可以为针对这些环境创建启动文件。

这些文件将在应用程序运行在该环境中时被自动包含。假设你在 bootstrap/start.php 文件中配置了一个 development 环境,

你可以创建一个 app/start/development.php 文件,在那个环境下任何进入应用程序的请求都会包含该文件。

查看和设置当前环境这个就另写一遍文档吧。

参考资料:

http://v4.golaravel.com/docs/4.2

http://www.cnblogs.com/huangbx/p/3586704.html (这个写的很好啊,大家去看这个博客吧,我的也就我自己能看懂。 - -!)

-------------------------------------------开始扯淡---------------------------------------------------

进来抽时间开始学习Laravel,过程应该是断断续续的。

最近忙的事情比较多,有很多事情都无从下手。艰难啊!

早就打算学Laravel了,但是时间有限,想了想不能再拖了,

所以即使忙也抽点时间看看。

Laravel 目前中文资料还是挺少的。 大牛们赶快行动起来吧。

-------------------------------------------扯淡完毕---------------------------------------------------

此文章通过 python 爬虫创建,原文是自己的csdn 地址: larevel学习笔记 程序体系结构

Laravel 查看和配置当前环境

可以通过

$environment = App::environment();
var_dump($environment);

获取当前环境

默认情况下当前环境是 production

那是因为在 文件 bootstrapstart.php 中有
设置:
$env = $app->detectEnvironment(array(
     'local' => array('homestead'),
));

homestead 就是指计算机的名字  ,linux 或者mac可以使用hostname 查看,
windows可以在powershell下使用hostname或者在计算机属性中查看 你的计算机名字一般不会是
homestead 所以找不到这个名字就会返回是production 即当前的默认环境

我们可以简要分析一下 首先分析 函数detectEnvironment()

定义在vendorlaravelframeworksrcIlluminateFoundationApplication.php 中

public function detectEnvironment($envs)
    {
        $args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;

        return $this['env'] = (new EnvironmentDetector())->detect($envs, $args);
    }

继续分析 detect() 函数

定义在vendorlaravelframeworksrcIlluminateFoundationEnvironmentDetector.php 中

	public function detect($environments, $consoleArgs = null)
	{
		if ($consoleArgs)
		{
			return $this->detectConsoleEnvironment($environments, $consoleArgs);
		}
		else
		{
			return $this->detectWebEnvironment($environments);
		}
	}

默认 $consoleArgs 为null 那么接着分析 函数detectWebEnvironment()

protected function detectWebEnvironment($environments)
	{
		// If the given environment is just a Closure, we will defer the environment check
		// to the Closure the developer has provided, which allows them to totally swap
		// the webs environment detection logic with their own custom Closure's code.
		if ($environments instanceof Closure)
		{
			return call_user_func($environments);
		}

		foreach ($environments as $environment => $hosts)
		{
			// To determine the current environment, we'll simply iterate through the possible
			// environments and look for the host that matches the host for this request we
			// are currently processing here, then return back these environment's names.
			foreach ((array) $hosts as $host)
			{
				if ($this->isMachine($host)) return $environment;
			}
		}

		return 'production';
	}

可见最后renturn 'production'; 由此 可以知道为什么返回 production了

那么我们只需要把 'local' => array('homestead'), 中的homestead 改成我们自己的计算机名字就会是当前环境变成local
你也可以命名其他环境。
这样你就可以把许多配置写到自己的文件夹下面了
例如 app/config 文件夹

这个时候很多配置当当前环境例如是local 没有的时候使用的默认的配置文件例如

cache.php
但是你也可以直接在config/local 下面创建cache.php 覆盖默认的环境配置

使用不同环境另一个一个作用是  敏感信息的保护

这个作用可以查看官方文档,我这里就不 复制粘贴了。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Laravel 查看和配置当前环境

magento根据运送城市设置支付方式

例如,有的时候我们的商城并不是支持所有地区都可以货到付款的。

那么这个时候就会根据不同城市 选择性的显示货到付款支付方式。

但首先我们要在后台做一些可控的配置

例如:

当然还要有那些城市是可以货到付款的。这里就不显示出来了。(因为我自己是在另一个 选项卡了配置这个信息的。)

(后台开发可以去网上搜索教程。)

之后在文件

appdesignfrontendbasedefaulttemplatecheckoutonepagepaymentmethods.phtml中

代码

 $methods = $this->getMethods();
    $oneMethod = count($methods) <= 1;

下添加代码:

$showCashOnDeliever = Mage::getStoreConfig('payment/cashondelivery/accordingCityActive'); // 根据自己编写情况找到实际位置
    if($showCashOnDeliever){
        $checkout = Mage::getSingleton('checkout/session')->getQuote();
        $shipping = $checkout->getShippingAddress(); // 获取当前运送的城市
        $CityStr = Mage::getStoreConfig('payment/cashondelivery/city');
        $CityArr = explode(' ',$CityStr); // 获取货到付款的城市
    }

然后找到代码

 foreach ($methods as $_method):
        $_code = $_method->getCode();

下面添加 代码:

if($showCashOnDeliever){
            if($_code == "cashondelivery"){
                $destCity = $shipping->getCity();
                if(!in_array($destCity,$CityArr )){
                    continue;
                }
            }
        }

这时候你就可以结账试试了。 ^_^

--------------------------------------------------唠叨两句----------------------------------------

这只是通过判断的方式使得前台不显示货到付款的支付方式了。同样的你可以去掉任何你需要的支付方式。

当然,有人说我截取post数据修改支付方式为货到付款,那么订单支付方式当然还会是货到付款了。你若真要

细致考虑,那你就在确认订单的时候再去判断合法性。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento根据运送城市设置支付方式

php 错误Cannot modify header information – headers already sent by

PHP 的输出缓存

先明确一下PHP的输出顺序
1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display

另外浏览器的输出缓存:IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上

buffer
buffer是 一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的 区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并 不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函 数flush()的时候,强制要求把buffer中的脏数据写回磁盘。

同样的道理,当执行echo,print的时候,输出并没有立即通过server传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在server buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由server传给浏览器显示。所以,数据会依次写到这几个地方:echo/print -> php buffer -> server buffer -> browser

php output_buffering
默 认情况下,php buffer是开启的,而且该buffer默认值是4096,即4kb。你可以通过在php.ini配置文件中找到output_buffering配 置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过server传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了4kb数据,也不真的把数据交给server传给浏览器,因为ob_start()将php
buffer空间设置到了足够大。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。
我们将php.ini 中的 output_buffering 设置成为On就表明设置了无限大的buffer空间。

假设我们设置的output_buffering 为Off 那么php代码:

echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';

是会出错的提示:Cannot modify header information - headers already sent by

根据以上内容分析原因:

php在echo ‘php'时已经向浏览器发送一个头信息,当再出现header("content-type:text/html;charset='utf-8'");
又看到一个头信息,这时已经打回了上面的头信息,无法更改便出错了。

解决上述问题可以通过以下方法解决:
1. 检查是否有在header 输出之前输出的内容
2. 使用
<?php ob_start(); ?>
... HTML codes ...
<?php
... PHP codes ...
header ("Location: ....");
ob_end_flush();
?>方法解决
3. error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可
不显示错误(但是错误还在)
4. 有权限编辑php.ini 则
设置 output_buffering =为on或者具体大小。
5. 将该文件转为UTF-8 without BOM编码的文件

今天修改magento代码 提交到服务器上的时候在log文件中发现错误:
 HEADERS ALREADY SENT...
检查发现错误记录在文件
appcodecoreMageCoreControllerResponseHttp.php

if (!$this->canSendHeaders()) {
            Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));
            return $this;
        }

追踪函数canSendHeaders
在libZendControllerResponseAbstract.php中

 public function canSendHeaders($throw = false)
    {
        $ok = headers_sent($file, $line);
        if ($ok && $throw && $this->headersSentThrowsException) {
            #require_once 'Zend/Controller/Response/Exception.php';
            throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
        }

        return !$ok;
    }

可以看到使用了 headers_sent函数。 我们也可以通过这个函数配合get_include_files 找出错误出现在那里
其实这个错误和php 提示错误Cannot modify header information - headers already sent by
应该是一个问题
我找到php.ini 修改
output_buffering =4096 为On 错误解决了,
但是这里的问题是我的 output_buffering 是打开的但是还发生这种错误?难道大小不够
我索性尝试给了1024000即1M 结果错误也没有。
那么我的猜测是:(知道的麻烦帮下忙告诉下,具体原因。拜谢!)
输出的内容比较大,php 缓冲区大小是4kb 那么写满了以后要输出到browser, 但是在这4kb后面
还有头部信息的修改例如header() 函数但是头信息已经发送了,于是报错。而如果修改buffer大小
为On 表示无限大则错误消失。

-----------------------------------------------------------------是这样吗?---------------------------------------------------------------------

---------------------------------------------------------------- 更新-----------------------------------------------------------------------------

正解在这里 ("▔□▔)/

http://blog.csdn.net/m0sh1/article/details/46124089

参考资料:

http://blog.csdn.net/besily/article/details/5396268
http://www.jb51.net/article/38363.htm
http://www.jb51.net/article/39774.htm
http://www.jb51.net/article/38365.htm
http://stackoverflow.com/questions/4670031/magento-debug-headers-already-sent-error

此文章通过 python 爬虫创建,原文是自己的csdn 地址: php 错误Cannot modify header information - headers already sent by

php 中ob_flush函数 和 flush函数

ob_flush()函数: 取出PHP buffering中的数据,放入server buffering

flush()函数: 取出Server buffering的数据,放入browser buffering

例如代码:

         <?php
             echo str_repeat('m0sh1' ,1000);    
             for($i=0;$i<4;$i++) {
                 echo $i.'<br />';
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
          <?php
               //header("content-type:text/html;charset='utf-8'");
               // 提示错误 Cannot modify header information - headers already sent by
          ?>

执行发现

这里代码输出结果是一行一行输出的,
 注意:正确使用二者的顺序是. 先ob_flush, 然后flush

此文章通过 python 爬虫创建,原文是自己的csdn 地址: php 中ob_flush函数 和 flush函数