Laravel 框架结构 以及目录文件解读(学习笔记)

composer下载Laravel 5.4(因为PHP版本仅7.0,故未下载5.6)php

        composer create-project laravel/laravel your-project-name --prefer-dist "5.4.*"css

        composer下载后已经生成APP_KEY,若是须要改变 使用命令 php artisan key:generate ,须要把php命令设置为全局前端

下面咱们说说根文件夹下的几个文件和文件夹storage 和 bootstrap/cache 目录应该容许写入)mysql

   app 文件夹  包含了应用的核心代码,此外你为应用编写的代码绝大多数也会放到这里(详情能够看官网);laravel

         bootstrap 文件夹包含了少量文件,用于框架的启动和自动载入配置,还有一个 cache 文件夹用于包含框架为提高性能所生成的文件,如路由和服务缓存文件;git

   config 文件夹包含了应用全部的配置文件,建议通读一遍这些配置文件以便熟悉全部配置项;web

   database 文件夹包含了数据迁移及填充文件,若是你喜欢的话还能够将其做为 SQLite 数据库存放文件夹;sql

   public 文件夹包含了入口文件 index.php 和前端资源文件(图片、JavaScript、CSS等);数据库

   resources 文件夹包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化语言文件;json

   routes 文件夹包含了应用的全部路由定义。Laravel默认提供了三个路由文件:web.phpapi.phpconsole.php

     web.php 文件包含的路由都会应用web中间件组,具有Session、CSRF防御以及Cookie加密功能,若是应用无需提供无状态的、RESTful风格的API,全部路由都会定义在web.php文件。

    api.php 文件包含的路由应用了api中间件组,具有频率限制功能,这些路由是无状态的,因此请求经过这些路由进入应用须要经过token进行认证而且不能访问Session状态。

    console.php 文件用于定义全部基于闭包的控制台命令,每一个闭包都被绑定到一个控制台命令而且容许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,可是它定义了基于控制台的应用入口(路由)。

   storage 文件夹包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该文件夹被细分为成appframeworklogs子文件夹,app文件夹用于存放应用要使用的文件,framework文件夹用于存放框架生成的文件和缓存,最后,logs文件夹包含应用的日志文件;

   storage/app/public 文件夹用于存储用户生成的文件,好比能够被公开访问的用户头像,要达到被访问的目的,你还须要在public文件夹下生成一个软链接 storage 指向这个文件夹。你能够经过 php artisan storage:link 命令生成这个软连接。

   tests 文件夹包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;每个测试类都要以 Test 开头,你能够经过 phpunit 或 php vendor/bin/phpunit 命令来运行测试。

   vendor文件夹包含全部Composer依赖,这个文件咱们不要动,也不要修改里面的代码。

  .env文件(如没有,请复制一份.env.example更名为.env)

            上面说的app_key就在.env文件中,.env文件就是Laravel的配置文件,一看便懂, 同时和config文件夹下的database一块儿配合使用

APP_ENV=local
APP_KEY=base64:Wt1CEnZTaB7kq82syINzBqHcNCXxXL7uY1KMEmW/23I=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

.gitignore 文件 用于设置git的忽略文件

artisan 文件 中的代码跟public/index.php的代码基本同样,猜想应该是经过artisan命令来运行程序,作一些自动操做,好比数据库迁移等。

composer 文件 与package.json 不必说,你们都知道

phpunit.xml 文件 单元测试的配置文件

最后说下server.php文件。

这是根目录下的惟一.php文件,代码以下

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
    return false;
}

require_once __DIR__.'/public/index.php';
注释翻译:该文件容许咱们从内置的PHP网页服务器模拟Apache的“mod_rewrite”功能。 这提供了一种方便的方式,而没必要在此安装一个“真正”的网络服务器软件来测试Laravel应用程序。

其实这个文件模拟了web server的rewrite功能,如Apachemod_rewrite模块,以及Nginx的配置:

好比咱们在web server(本文使用Apache)中设置以下:

<VirtualHost *:80>
    DocumentRoot "F:/workspace"
    ServerName server.laravel.com
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "F:/workspace/laravel_study/public"
    ServerName self.laravel.com
</VirtualHost>

  此时 http://server.laravel.com/laravel_study/server.php   和  http://self.laravel.com  访问的都是 public下的index.php,就是说我能够经过访问server.php来访问个人项目,同时若是有须要的话,能够在里面对路径URL等作一些处理,固然了server.php这个文件自己就不常使用,此处仅作了解。

  最后顺道说下laravel中的.htaccess文件

  RewriteCond就像咱们程序中的if语句同样,表示若是符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php 
RewriteRule  index.php            index.b.php

  上面语句的做用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,若是你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
//跳转到对index.m.php的访问
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
//跳转到对index.L.php的访问
}
else
//跳转到对index.b.php的访问

在看例2:
  RewriteCond %{HTTP_REFERER} (www.test.cn)
  RewriteRule (.*)$ test.php
  上面语句的做用是若是你访问的上一个页面的主机地址是www.test.cn,则不管你当前访问的是哪一个页面,都会跳转到对test.php的访问。
在看例三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

上面语句的做用是若是你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里能够看出,RewriteCond语句之间默认的是AND,若是想要OR,则要明确的写出来。

下面是一些经常使用用的重写规则:  RewriteCond %{REQUEST_FILENAME} !-f   //若是文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)  RewriteCond %{REQUEST_FILENAME} !-d   //#若是目录存在就直接访问目录不进行RewriteRule  RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#若是是这些后缀的文件,就直接访问文件,不进行Rewrite

相关文章
相关标签/搜索