PHP急速入门二·跑一个网站试一试

继续上一篇,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中文文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,591评论 0 121
  • 本文转自CSDN,在原作者基础上将老版本laravel的目录更正为最新laravel5.4目录,去除了不太好理解的...
    小小奶狗阅读 2,008评论 6 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 晚上打开简书,习惯式的复制上一篇文章标题,粘贴在今日标题上,修改前面的数字时,才意识到自控读写群就在昨天已经结束了...
    疯玩阅读 158评论 0 1
  • 1999年的夏天,两个十几岁的小女兵坐在福建深山里的营房里看星星。 一个问:你有什么梦想? 一个回:我想去北京。 ...
    锦衣的星辰大海阅读 180评论 0 3