继续上一篇,vagrant的环境搭建好了,我们可以在自己电脑上搭建网站了。
(如果你希望安装最新的homestead文件,请查看视频教程:升级homestead 我找了一个很强大的开源项目 BootstrapCMS,这节课我们就是要把它在我们的vagrant虚拟机上跑起来。但在正式动手前,因为你懂的原因,我们要为虚拟机配置一下中文的镜像。
1.配置中文镜像
1.1 Composer镜像:
Composer是PHP的包管理器,通过Composer管理着很多不错的PHP插件包。有了它,你的项目就事半功倍了。但资源都在互联网上,作为处在天朝的我们就要给他配置一个国内镜像。配置镜像很简单, 执行命令:
$ composer config -g repositories.packagist composer http://packagist.phpcomposer.com
执行完以后, 我们再给composer升个级:
$ composer self-update
如果报错可能是权限问题,可以在命令前添加sudo
来使用最高的命令权限。
更多资料请参考 Composer 中文网
1.2 NPM镜像:
NPM是Javascript的包管理器,与JS相关的的一些项目会经常用到它,同样我们也要为它配置一个镜像:
我们执行一下命令:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
这样我们就可以使用cnpm做包管理了。
我们也可以直接为npm命令添加镜像源。
先创建一个.npmrc文件
vim ~/.npmrc
粘贴
registry = https://registry.npm.taobao.org
这样用npm也有效果了
更多资料查看npm
2.安装BootstrapCMS
下载 bootstrapcms
git clone https://github.com/BootstrapCMS/CMS.git
首先,将克隆下来的CMS-master.zip放到Code文件夹下,解压CMS-master,将此文件夹重命名为bootstrap.cc
文件夹。从现在起bootstrap.cc就是我们的项目文件夹。
为了更加友好的访问,我们先配置Homestead的配置文件:
sites:
- map: bootstrapcms.cc
to: /home/vagrant/Code/bootstrapcms.cc/public
绑定 hosts文件
192.168.10.10 bootstrapcms.cc
然后我们可以进入正式安装了:
我们一步步照着来
composer install --no-dev -o
现在开始下载了
虽然配置了镜像,但是还得花点时间。
然后执行
npm install
虽然配置过镜像由于东西较多可能会花点时间。
将.env.example重命名.env改成,在这个文件配置好你的数据库的账号密码:
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost
APP_KEY=LhPy5w2RzRjkHuPXvAFijTbK0lupUI1g
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
debug为true,这样页面就会有报错的详细提示;
创建好后生成自己的key
php artisan key:generate
最后在执行
php artisan app:install
不出意外的话,再次访问你的 bootstrapcms.cc就有页面了。
3.了解Laravel的结构
我们看看BootstrapCMS是怎么工作的吧
3.1目录结构:
.env :
环境配置文件。通常我们的项目会有3种环境。程序员自己电脑上的本地开发环境,团队内部使用的测试服务器,真正使用的正式服务器。每个环境的配置都会有所不同。比如本地环境和测试环境需要debug页面,但正式服如果出现了debug页面,不仅是不友好的更是不安全的。因此,我们会在本地、测服、正服存放不一样的.env文件。另外我们还结合.gitignore来让git忽略此文件,这样同步代码的时候,它就不会被同步掉。
.gitignore:
设置git需要忽略的文件和目录,比如:刚刚提到的.env、系统缓存文件.DS_store、单元测试配置文件phpunit.xml。node_modules和vendor是存放第三方包的文件夹——node_modules存放的主要是前段的一些工具库,管理员是npm;vendor存放的是PHP的库,管理员是Composer。为了方便团队内部的开发我很少会去忽略这两个文件夹,但不好之处也是会导致整个项目体积很大。这和你的开发习惯有关,比如你们在局域网内部搭建了git服务器,那么就应该把这些文件夹也一起同步了。
public文件夹:
保存了静态文件和入口文件index.php。也就是说我们通过Nginx的配置让用户只能访问这个文件夹的内容,项目中其他文件夹用户都是无法访问的。但是我们要执行其他文件夹中的php代码怎么办?这就用到了伪静态的功能。要弄明白那伪静态,我们先要弄清楚什么是静态和动态。当您访问 http://bootstrapcms.cc/public/img/1.jpg
的时候,你访问的这个图片就是静态文件。它被放置在服务器public这个角落里面做一个安静的美男子。而http://bootstrapcms.cc/public/index.php?a=foo&b=bar
这种用?a=foo&b=bar
给index.php传参的方式就是动态。伪静态说白了就是“装纯”,明明是动态的访问方式却要装作静态。
伪静态使用了Nginx的URL重写规则骗过浏览器和用户,让浏览器以为是在访问静态文件。当你在浏览器上输入 http://bootstrapcms.cc/pages/home
的时候 ,实际Nginx 帮您访问访问的是:http://bootstrapcms.cc/public/index.php/pages/home
,而这个URL的public/index.php
被偷偷的去掉了,而/pages/home/
这个以参数的形式存在,Nignx不会真正的去找到对应的文件。为何如此?一方面是为了安全,让用户的请求可控,这样就算黑客在你网站上的某个文件夹上放了一些可执行的脚本也不会随随便便的执行;另外一方面是为了好看,如果链接上都是 ?a=foo&b=bar&c=aaa
显得太low了,而且对搜索引擎不是很友好,对网站排名的权重也有影响。这个真是个居心叵测的绿茶婊!
vendors 文件夹:
在这里放了许多第三方库,包括laravel框架的核心代码。这个文件夹很重要,但是由composer 代为掌管的,我们很少会修改这里代码。如果我需要添加新的服务,比如你想添加
可以在打开项目主目录下的.composer.json 添加你想要的第三方包:
"require": {
"php": ">=5.5.9",
"laravel/framework": "~5.1.10",
"fideloper/proxy": "~3.0",
"graham-campbell/binput": "~3.0",
"graham-campbell/contact": "~1.0",
"graham-campbell/core": "~4.0",
"graham-campbell/credentials": "~1.0",
"graham-campbell/exceptions": "~4.0",
"graham-campbell/htmlmin": "~4.0",
"graham-campbell/logviewer": "~1.0",
"graham-campbell/markdown": "~4.0",
"graham-campbell/navigation": "~2.0",
"graham-campbell/throttle": "~4.0",
"mccool/laravel-auto-presenter": "~3.0"
}
app文件夹:
这里是我们项目的核心文件。我们80%的工作都是在这里完成的。
在这个文件夹最重要的是Http文件夹,包含了:
- 控制用户请求的路由文件routes.php,它就像路由器一样能够根据用户的访问地址来分配控制器(Controller);
- 业务逻辑代码在Controllers文件夹中,例如bootstrapCMS的PageController.php就是页面创建、更新、保存、删除的逻辑,这个文件的调用是通过routes.php 中的
$router->resource('pages', 'PageController');
当用户访问 http://bootstrapcms.cc/pages
的时候,就会执行PageController的代码。
与数据库打交道的Model们:
在bootstrapCMS中,Models文件夹中包含了与数据库打交道的模型,模型之所以被称为模型,我个人估计是因为他们实例化以后都是一条条具体的活生生的东西:某个页面(page)——有title、有body、有css;某个用户(user)——有name、有密码,通常这些模型默认放在App目录中,作者为了便于管理,自己创建了Models文件夹。
resources 文件夹
这里也很重要:
views 文件夹中包含了许多模板文件,这里主要都是显示相关代码,模板一面和html打交道一面和PHP打交道。模板之间可以相互嵌套和引用,更可以循环遍历输出数据。Laravel的模板通常都是*.blade.php
,blade有自己的独特的语法,但是通过编译最终还是会转化成php文件。当月能过户首次访问页面的时候,Laravel会将*.blade.php
文件编译成php文件,存放在storage文件夹中。当用户第二次访问的时候就直接使用storage/cache/的php文件了。因此,使用模板其实对并不会对性能造成太大影响,但大大方便了显示层的代码的管理。如果把Views文件夹和之前提到的Models、Controllers加到一起,我们称之为MVC。MVC的思路大致这样的:用户发生请求的时候,根据不同的信息来执行不同的Controller,Controller接到数据后进行执行业务逻辑,在遇到需要调用数据的时候会用Model取得数据,Model接收到命令做相应的数据库操作。然后Controller将处理好的数据传给View,View接到这些数据后将这些数据填充到页面中,最终呈现给用户。Controller 是连接View和Model的桥梁。MVC是现在多数软件框架的基本的架构,也是代码分层的最佳实践。
assets放置了编译前一些文件,比如Less和SCSS可以编译成CSS文件输出的到public文件夹中供大家访问。
storage 文件夹
这里是用来存放Blade编译后的PHP文件还有一些临时文件,报错文件也在这里的log文件夹中。
database 文件夹
这里包含了数据的建表代码及默认填充数据库的种子文件。
参考资料:laravel中文文档
3.2 生命周期
网站就像一个人一样是有生命的,起点是用户输入网址按下回车的开始,结束是在浏览器刷新完页面。在这过程中发生了什么?我们一起来研究一下。
打开入口文件public/index.php可以看到代码并不复杂。
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$ kernel = $app->make('Illuminate\Contracts\Http\Kernel');
$request = Illuminate\Http\Request::capture();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
我们可以很清楚的看到这里我们做了这几件事情,注册自动加载、实例化应用、处理请求内容、发送数据给用户、收工。
现在我们来分析一下:
Laravel一开始就引用了bootstrap文件夹中的autoload.php,这里注册了许多要用到的“服务员”(第三方插件)个个都技艺不错,翻一翻autoload.php代码可以发现实际上我们悄悄请来的是composer来管理这些服务员。$app是我们的整个网站的实例化对象,通过这一步我们的网站开始有了“生命”。通过$app创建了处理用户请求的核心对象——$kernel 。$requset 这个对象捕获了用户的请求的数据后将用户请求中数据移交给$kernel进行处理,而$kerner会去调用我们编写的代码进行处理。处理的结果再通过$response 发送给用户。最后$kernel 进行一些收尾的工作。这就完成用户请求的一次生命周期。整个程序在执行的思路很清晰,这样说明了一个框架结构能让编程变得更加简单,因为它把复杂的程序封装成了简明的陈述。
参考文档 laravel中文文档
网友评论