larablog 系列文章 01 - 安装配置和模版引擎

这是系列文章的开头,是创建网站的第一步,这部分的内容我们将下载并配置 Laravel 本地开发环境。创建博客应用,它会包含主要的 HTML 结构,我们可以通过本地进行浏览访问。

配置开发环境

集成开发环境 XAMPP

开发环境的搭建方式有很多,比如 Homestead 开发环境,为了让新手能快速搭建开发环境,我们选择了集成开发环境这种容易快速上手使用的方案,如果你已经了解其它的方式或有精力去研究,欢迎查阅其它文章,这里不过多阐述。

XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包。它可以在 Windows、Linux、Solaris、Mac OS X 等多种操作系统下安装使用,支持多语言:英文、简体中文、繁体中文、韩文、俄文、日文等。

Windows 下还可以用 WAMP 集成开发包,和 XAMPP 类似,有需要话也可以进行了解

你可以在这里下载适合你系统的版本:
https://www.apachefriends.org/zh_cn/download.html

安装完成后,你可以通过控制面板启动相应的服务,控制面板如下:

Mac 系统中控制面板如下,Windows 系统与之大同小异。

Mac 下的控制面板

在你启动这 MySQL, Apache 这 2 个服务后,你就可以通过下面的地址来访问数据库:

http://localhost/phpmyadmin/

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。

你通过页面登录即可访问并管理数据库

注意:XAMPP 默认安装时设定的 MySQL 账户 root 密码为空

数据库配置

由于项目中需要用到数据库,这里我们先创建项目的数据库 larablog

创建数据库

构建应用

创建应用

首先,通过命令行工具进入你的 Web 目录下:

Web 目录即 XAMPP 安装目录下的 htdocs 目录

我们这里通过 Composer 创建项目,执行如下命令:

composer create-project laravel/laravel larablog --prefer-dist "5.1.*"

Laravel 5.1 LTS 是 Laravel 历史上第一个提供 LTS(长期支持 - long-time support) 支持的版本。由于不同版本特性之间的区别这里无法详细讲解,所以我们这里选用了 LTS 版,了解一个长期稳定的版本相对来说很有必要。

配置项目的数据信息

Laravel 安装后会在目录下生成名为 .env 的配置文件,通常我们不会该文件纳入版本管理工具(比如 git),我们在本地开发和生产服务器上不同环境的配置信息也是区别于此。在项目目录下还有一个 .env.example 文件,是作为配置模板而存在。

让我们来编辑 .env 文件,设置数据库信息:

这个文件里罗列的很多已经设定好的配置,默认用于本地开发环境,如果是生产环境,有些配置需要调整,这里我们主要是设置数据相关的配置。

找到如下部分,对内容进行更改:

DB_DATABASE=larablog
DB_USERNAME=root
DB_PASSWORD=

这里,数据库的名称使用的是开头创建的 larablog,同时数据库密码为空。

默认结构说明

一个新安装的 Laravel 根目录包含许多个文件夹:

app 目录,如你所料,这里面包含应用程序的核心代码。

bootstrap 目录包含了几个框架启动跟自动加载设置的文件。以及在 cache 文件夹中包含着一些框架在启动性能优化时所生成的文件。

config 目录,顾名思义,包含所有应用程序的配置文件。

database 目录包含数据库迁移与数据填充文件。如果你愿意的话,你也可以在此文件夹存放 SQLite 数据库。

public 目录包含了前端控制器和资源文件(图片、JavaScript、CSS,等等)。

resources 目录包含了视图、原始的资源文件 (LESS、SASS、CoffeeScript) ,以及语言包。

storage 目录包含编译后的 Blade 模板、基于文件的 session、文件缓存和其它框架生成的文件。此文件夹分格成 appframework,及 logs 目录:

  • app 目录可用于存储应用程序使用的任何文件。
  • framework 目录被用于保存框架生成的文件及缓存。
  • logs 目录包含了应用程序的日志文件。

tests 目录包含自动化测试。这有一个现成的 PHPUnit 例子。

vendor 目录包含你的 Composer 依赖模块。

路由

在项目中 app/Http/routes.php 是用用程序的路由文件,请求的处理都通过这里进行进行配置。

默认如下:

<?php

Route::get('/', function () {
    return view('welcome');
});

这里配置的路由信息是,访问网站根路径是,显示视图 welcome 的内容。

视图 welcome 位于 resources/views/welcome.blade.php

运行项目

在项目所在目录下,通过命令行执行 php artisan serve 启动应用,操作如下:

➜  larablog php artisan serve
Laravel development server started on http://localhost:8000/

Laravel 的控制台命令启动了 PHP 内置服务器,让我们可以不需要单独设立虚拟站点也可以访问应用。是一种很快速便捷的运行办法。

说明一下,本身我们通过 XAMPP 内置的 Apache 也可以配置虚拟站点进行访问,因为这种运行 PHP 内置服务器的方式相对更方便,所以就没有提及它。这里主要为了避免新手学习重要的内容时被一些细枝末节的问题所干扰,后期自己可以了解如何配置虚拟站点来运行应用,尤其是当使用了 Homestead 这样的开发环境。

好了,如果你通过浏览器打开页面 http://localhost:8000/ 将会看到如下页面:

welcome
尝试增加一些内容

接下来,我们尝试增加一些简单的内容,感受一下。

app/Http/routes.php 中添加一个路由配置:

Route::get('/hello/{name}', function($name) {
    return 'Hello '. $name;
});

我们配置了一个路由用于输出欢迎内容。

访问 http://localhost:8000/hello/larablog 即可看到如下内容:

Hello larablog

模板引擎

在我们对 Laravel 构建应用有个基础了解后,我们先从模版开始构建站点的结构。Laravel 使用了 Blade 作为模板引擎。

Blade 是 Laravel 所提供的一个简单且强大的模板引擎。相较于其它知名的 PHP 模板引擎,Blade 并不会限制你必须得在视图中使用 PHP 代码。所有 Blade 视图都会被编译缓存成普通的 PHP 代码,一直到它们被更改为止。这代表 Blade 基本不会对你的应用程序生成负担。

Blade 视图文件使用 .blade.php 做为扩展名,通常保存于 resources/views 文件夹内。

基础布局

首先,我们要为整个博客站点建立一个基础视图模板,整个站点视图基于这个模板,继承该视图并显示。

在项目录下新建文件 resources/layouts/app.blade.php ,内容如下:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
        <title>@yield('title') - larablog</title>

        @section('stylesheets')
            <link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" />
        @show

        <link rel="shortcut icon" href="/favicon.ico" />
    </head>
    <body>

        <section id="wrapper">
            <header id="header">
                <div class="top">
                    @section('navigation')
                        <nav>
                            <ul class="navigation">
                                <li><a href="/">Home</a></li>
                                <li><a href="#">About</a></li>
                                <li><a href="#">Contact</a></li>
                            </ul>
                        </nav>
                    @show
                </div>

                <hgroup>
                    <h2>@yield('blog_title', '<a href="/">larablog</a>')</h2>
                    <h3>@yield('blog_tagline', '<a href="/">creating a blog in Laravel</a>')</h3>
                </hgroup>
            </header>

            <section class="main-col">
                @yield('body')
            </section>

            <aside class="sidebar">
                @include('partials.sidebar')
            </aside>

            <div id="footer">
                @section('footer')
                    Laravel blog tutorial
                @show
            </div>
        </section>

        @yield('javascripts')
    </body>
</html>

如果你仔细看,会发现 @include('partials.sidebar') 这段代码,我们额外引入了一个局部视图。

所以,还需要建立一个局部页面 resources/views/partials/sidebar.blade.php,内容如下:

@section('sidebar')
    Sidebar content
@show

app.blade.php 文件中包含了传统的 HTML 语法。不过,请注意 @section@yield 命令。正如其名,@section 命令定义一个内容区块,而 @yield 命令被用来 “显示指定区块” 的内容。

在默认情况下,Blade 模板中的 {{ }} 表达式将会自动调用 PHP 的 htmlentities 函数,以避免 XSS 攻击。如果你不希望你的数据被转义,可以使用下列的语法:

Hello, {!! $name !!}.

更多模板相关的信息请查看文档 Blade TemplatesBlade 模板

stylesheets 内容区块中,我们引入了一个样式表:

<link href="{{ asset('css/screen.css') }}" type="text/css" rel="stylesheet" />

我们使用 asset 帮助函数来生成样式资源所在的路径,其函数作用如下:

// 根据目前请求的协定(HTTP 或 HTTPS)产生资源文件网址
asset('img/photo.jpg', $title, $attributes);

public/css/screen.css 的内容如下:

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}
body { line-height: 1;font-family: Arial, Helvetica, sans-serif;font-size: 12px; width: 100%; height: 100%; color: #000; font-size: 14px; }
.clear { clear: both; }


#wrapper { margin: 10px auto; width: 1000px; }
#wrapper a { text-decoration: none; color: #F48A00; }
#wrapper span.highlight { color: #F48A00; }


#header { border-bottom: 1px solid #ccc; margin-bottom: 20px; }
#header .top { border-bottom: 1px solid #ccc; margin-bottom: 10px; }
#header ul.navigation { list-style: none; text-align: right; }
#header .navigation li { display: inline }
#header .navigation li a { display: inline-block; padding: 10px 15px; border-left: 1px solid #ccc; }
#header h2 { font-family: 'Irish Grover', cursive; font-size: 92px; text-align: center; line-height: 110px; }
#header h2 a { color: #000; }
#header h3 { text-align: center; font-family: 'La Belle Aurore', cursive; font-size: 24px; margin-bottom: 20px; font-weight: normal; }


.main-col { width: 700px; display: inline-block; float: left; border-right: 1px solid #ccc; padding: 20px; margin-bottom: 20px; }
.sidebar { width: 239px; padding: 10px; display: inline-block; }


.main-col a { color: #F48A00; }
.main-col h1,
.main-col h2
{ line-height: 1.2em; font-size: 32px; margin-bottom: 10px; font-weight: normal; color: #F48A00; }
.main-col p { line-height: 1.5em; margin-bottom: 20px; }


#footer { border-top: 1px solid #ccc; clear: both; text-align: center; padding: 10px; color: #aaa; }

首页视图

我们已经建立好了基础的布局模板。之后我们基于布局视图建立的页面通常和控制器方法有关,比如博客显示页面会有对应的博客显示模板。

让我们来建立首页的控制器方法和与之相应的模板。

首先,建立控制器。在命令行中进入项目所在目录,执行如下命令:

php artisan make:controller PageController --plain

该命令会帮助我们新建控制器文件 app/Http/Controllers/PageController.php,将其内容更改如下:

<?php

namespace App\Http\Controllers;

class PageController extends Controller
{

    public function index()
    {
        return view('pages.index');
    }

}

接下来,为这个控制器方法创建视图,新建 resources/views/pages/index.blade.php,内容如下:

@extends('layouts.app')

@section('title', 'larablog')

@section('body')
    Blog homepage
@endsection

我们完成了首页视图,它继承自基础布局。接下来让我们为首页配置路由信息,编辑 app/Http/routes.php,将首页的路由更改如下:

Route::get('/', 'PageController@index')->name('homepage');

此时,我们已为首页定义了控制器方法,利用模板继承构建了首页的视图,并配置了路由。
接下来便可以通过访问 http://localhost:8000/ 查看首页的实际显示效果。

关于页面

这个部分的最后任务是创建一个静态页面。将演示如何将其它页面联系在一起,同时进一步了解模板继承相关的用法。

路由

当我们要创建一个页面的时候,首先都会考虑该给它建立怎么样的路由信息。这里,我们打开 app/Http/routes.php,添加如下内容:

Route::get('/about', 'PageController@about')->name('about');

控制器

打开新建的文件 app/Http/Controllers/PageController.php,添加新的控制器方法:

public function about()
{
    return view('pages.about');
}

视图

至于视图,我们创建一个新的文件位于 resources/views/pages/about.blade.php,内容如下:

@extends('layouts.app')

@section('title', 'About')

@section('body')
    <header>
        <h1>About larablog</h1>
    </header>
    <article>
        <p>Donec imperdiet ante sed diam consequat et dictum erat faucibus. Aliquam sit
        amet vehicula leo. Morbi urna dui, tempor ac posuere et, rutrum at dui.
        Curabitur neque quam, ultricies ut imperdiet id, ornare varius arcu. Ut congue
        urna sit amet tellus malesuada nec elementum risus molestie. Donec gravida
        tellus sed tortor adipiscing fringilla. Donec nulla mauris, mollis egestas
        condimentum laoreet, lacinia vel lorem. Morbi vitae justo sit amet felis
        vehicula commodo a placerat lacus. Mauris at est elit, nec vehicula urna. Duis a
        lacus nisl. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices
        posuere cubilia Curae.</p>
    </article>
@endsection

这个页面并没有特殊的地方,我们只是模拟了一些页面文字内容,通过控制器方法渲染了它。

页面链接

我们现在的关于页面可以正常访问了,你可以通过 http://localhost:8000/about 访问。
目前来说,我们没有在博客上添加任何跟它有关的访问链接,用户还得想我们一样输入完整的网址。
接下来让我们添加访问这个页面链接,同时了解如何通过路由来生成 URL。尽量不去使用如下的方式去链接页面:

<a href="/contact">Contact</a>

这是通过硬连接的方式与其它页面联系在一起。这很常见,但这样的做法存在一个问题就是,
如果您想在任何时候更改联系人页面的位置,您将必须找到所有对硬链接的引用并更改它们。

比较好的做法是利用 Laravel 中提供的方法来生成路径和 URL:

// 产生给定路由名称网址
route($route, $parameters, $absolute = true);

// 产生给定路径的完整网址
url('path', $parameters = array(), $secure = null);

知道这一点之后,让我们找到布局模板 resources/views/app.blade.php 页面。

将导航 navigation 内容区块的内容更改如下:

<nav>
    <ul class="navigation">
        <li><a href="{{ route('homepage') }}">Home</a></li>
        <li><a href="{{ route('about') }}">About</a></li>
        <li><a href="#">Contact</a></li>
    </ul>
</nav>

最后,更新 logo 的跳转链接,同样还是位于 resources/views/app.blade.php 文件中:

<hgroup>
    <h2>@section('blog_title')<a href="{{ route('homepage') }}">larablog</a>@show</h2>
    <h3>@section('blog_tagline')<a href="{{ route('homepage') }}">creating a blog in Laravel</a>@show</h3>
</hgroup>

现在刷新你的浏览器页面,将会看到首页和关于页面如你所期望的链接在一起,并正常显示。

总结

我们已经介绍了 Laravel 应用程序的基本内容,包括配置和启动应用程序。同时也探索了 Laravel 程序背后的基本构件原理,包括路由、控制器、模板引擎的使用。

接下来我们将关注如何创建联系人页面。该页面比“关于”页面要稍微深入一些,因为它允许用户提交表单与服务器交互。下一章讲介绍包括表单提交、验证、处理在内的相关内容。

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

推荐阅读更多精彩内容