Laravel 框架结构 以及目录文件解读(学习笔记)
composer下载Laravel 5.4(由于PHP版本仅7.0,故未下载5.6)
composer create-project laravel/laravel your-project-name --prefer-dist "5.4.*"
composer下载后已经生成APP_KEY,如果需要改变 使用命令 php artisan key:generate ,需要把php命令设置为全局
下面我们说说根文件夹下的几个文件和文件夹(storage
和 bootstrap/cache
目录应该允许写入)
app
文件夹 包含了应用的核心代码,此外你为应用编写的代码绝大多数也会放到这里(详情可以看官网);
bootstrap
文件夹包含了少许文件,用于框架的启动和自动载入配置,还有一个 cache
文件夹用于包含框架为提升性能所生成的文件,如路由和服务缓存文件;
config
文件夹包含了应用所有的配置文件,建议通读一遍这些配置文件以便熟悉所有配置项;
database
文件夹包含了数据迁移及填充文件,如果你喜欢的话还可以将其作为 SQLite 数据库存放文件夹;
public
文件夹包含了入口文件 index.php
和前端资源文件(图片、JavaScript、CSS等);
resources
文件夹包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化语言文件;
routes
文件夹包含了应用的所有路由定义。Laravel默认提供了三个路由文件:web.php
、api.php
和console.php
。
web.php
文件包含的路由都会应用web中间件组,具备Session、CSRF防护以及Cookie加密功能,如果应用无需提供无状态的、RESTful风格的API,所有路由都会定义在web.php
文件。
api.php
文件包含的路由应用了api
中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过token进行认证并且不能访问Session状态。
console.php
文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口(路由)。
storage
文件夹包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该文件夹被细分为成app
、framework
和logs
子文件夹,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
功能,如Apache
的mod_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
Laravel 框架结构 以及目录文件解读(学习笔记)的更多相关文章
- 【目录】Python学习笔记
目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...
- C# IO流与文件读写学习笔记
本笔记摘抄自:https://www.cnblogs.com/liyangLife/p/4797583.html,记录一下学习过程以备后续查用. 一.文件系统 1.1文件系统类的介绍 文件操作类大都在 ...
- (目录)Fortran学习笔记:开坑!!!
前言:因为某些原因,需要使用Fortran编写程序,记录下Fortran语法学习过程中的部分笔记.在此开坑记录,立下Flag,"希望年末能够更新完" Fortran 学习笔记 陈橙 ...
- python的文件处理学习笔记
python的文件处理函数是open() 以下主要是关于这个函数的一些学习笔记 1.文件处理离不开编码 要注意的是文件打开时的编码和文件保存时的编码的统一,这样才能保证你打开的文件不会存在乱码 总结: ...
- 源代码目录结构--AngularJS学习笔记(一)
最近开始接触AngularJS,确实是一个相当不错的东西,可以把很多东西简化掉.又对于其中的双向绑定等的实现很好奇,加之正在学习Javascript的东西,所以觉得从源代码这块开始深入学习Angula ...
- Linux文件类型(学习笔记六)
一.Linux下的文件类型 普通文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ - ] 目录文件:在由 ls –al 所显示出来的属性方面,第一个属性为 [ d ] 设备文件:一般都 ...
- Linux用户身份与文件权限学习笔记
用户身份 管理员UID为0:系统的管理员用户 系统用户UID为1~999:服务程序会有独立的系统用户负责运行:防止被黑客入侵进行提权,并有效控制被破坏的范围 普通用户UID从1000开始:是由管理员创 ...
- Linux用户、用户组、文件权限学习笔记
最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...
- PHP文件包含学习笔记
看完下面的几篇文章,然后从第8行开始以后的内容可以忽略!此文是个笔记梳理,是对大佬文章简单的COPY记录,方便以后查看,自己只复现了其中的例子 参考文章: PHP文件包含漏洞利用思路与Bypass总结 ...
随机推荐
- bootstrap之弹出框
1.模态框的核心在于 首先声明一个 模态框,标记其位置 <div class="modal fade" id="myModal" tabindex=&qu ...
- JavaScript用法
JavaScript 用法 JavaScript 语句,会在页面加载时执行. <body> 中的 JavaScript <!DOCTYPE html> <html> ...
- 深入浅出Java类加载过程
学习笔记二之Java虚拟机中类加载的过程 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化. 1. 加载 加载,是指Java虚拟机查找字 ...
- vue 页面跳转的两种方式
1,标签跳转 <router-link to='two'><button>点我到第二个页面</button></router-link> 2,点 ...
- gulp前端自动化构建并上传oss
前言 前端自动化构建工具从最开始的grunt, gulp, fis等到现在比较流行的webpack可谓层出不穷,个人还是比较倾向于gulp,虽然有的时候会因为某个插件的配置问题头疼很久,但不可否认gu ...
- 前端加密传输 crypto-js AES 加密和解密
配置: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- idea使用事项
1.调用外部jar包 Run/Debug Configurations --- Tomcat Server --- Startup/connection --- Debug 添加“path”变量:** ...
- 在Dynamics 365中使用SURVEYJS代替对话(Dialog)制作话术
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复269或者20180318可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- arcgis api 3.x for js 入门开发系列三地图工具栏(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Django2.0 正则表示匹配的简单例子
在Django中,使用正则表达式,匹配Url 默认情况下,url固定格式如下: urlpatterns = [ path('admin/', admin.site.urls), ] 如果需要使用正则表 ...