Laravel6.x博客教程

2年前,我录制了一部分Laravel视频教程,认识了很多小伙伴。LaravelPHP Web开发领域算得上是最优秀的框架之一,学习 Laravel 的人其实并不少,今天我想把以往自己学到的技术和经验(虽然现在没做IT行业了),但我会以最高效的方式免费分享给正在学习这些技术的新人,帮助他们以最快的速度学习成长!

在面临解散荒废了两年的Laravel群的问题时,我决定推出一套Laravel开发系列教程。这套教程将从 0 基础开始,通过多个项目的实战,循序渐进地将现代化的 Web 开发技术分享给大家。帮助新手入门Laravel框架(我也只有这点能力了😁)

开始 Laravel 开发之旅

Laravel is a web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.

开发环境说明

本教程写作时开发环境的系统平台为 Windows 7 (64 位),PHP 版本为 7.2.19Laravel 版本为 6.x

请确保你的服务器满足以下要求:

  • PHP >= 7.2.0
  • BCMath PHP 拓展
  • Ctype PHP 拓展
  • JSON PHP 拓展
  • Mbstring PHP 拓展
  • OpenSSL PHP 拓展
  • PDO PHP 拓展
  • Tokenizer PHP 拓展
  • XML PHP 拓展

Laravel集成环境

PHP集成环境有非常多,我就不一一介绍,这里我只推荐一个集成环境 Laragon(http://www.laragon.com.cn)。内置集成 Apache、MySQL、MariaDB、PHP、Nodejs、npm、phpMyAdmin、git、ssh、cmder、Memcached、Redis、composer、Debug、Sublime Text、ngrok、7z等工具!

Mac 环境推荐 Valet

安装 Laragon 非常简单,直接去官网下载然后选择安装目录(比如我放在 D:\laragon),然后一直下一步就OK。

安装 Laravel

我这里只推荐使用 Composer 安装 Laravel 安装器来创建 Laravel 项目,其他的方式我就不啰嗦。

在使用 Composer 之前,我们都知道 Composer 获取安装包的时候资源都在国外,导致很多时候安装失败或者进度缓慢,这里我推荐阿里云 Composer 全量镜像, 官方地址: 戳这里

打开 Laragon 的终端使用全局配置:

所有项目都会使用该镜像地址:

配置好 Composer 镜像之后,我们在 Laragon 的终端获取 Laravel 安装器:

composer global require laravel/installer

确保将 Composer's system-wide vendor 目录放置在你的系统环境变量 $PATH 中(如果你跟我一样是Windows那就不用管啦),以便系统可以找到 Laravel 的可执行文件。该目录根据你的操作系统存在不同的位置中;一些常见的配置包括 :

  • macOS and GNU / Linux 发行版: $HOME/.config/composer/vendor/bin
  • Windows: %USERPROFILE%\AppData\Roaming\Composer\vendor\bin

安装完成后, laravel new 命令会在你指定的目录创建一个全新的 Laravel 项目。例如, laravel new blog 将会创建一个名为 blog 的目录,并已安装好 Laravel 所有的依赖项:

laravel new blog

创建博客的数据库模型

设计博客的数据库表结构

博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库。我们把写好的文章永久地保存在数据库里,当用户访问我们的博客时,Laravel 就去数据库里把这些数据取出来展现给用户。

博客的文章应该含有标题、正文、作者、发表时间等数据。一个更加现代化的博客文章还希望它有分类、标签、评论等。为了更好地存储这些数据,我们需要合理地组织数据库的表结构。

我们的博客初级版本主要包含博客文章,文章会有分类以及标签。一篇文章只能有一个分类,但可以有很多文章标签。

例如存储博客文章的数据库表长这个样子:

标题 正文 发表时间 分类 标签
1 标题1 正文 2019-10-11 Laravel Laravel教程、PHP
2 标题2 正文 2019-10-12 Vue 博客、vue
3 标题3 正文 2019-10-13 Python 爬虫

这 3 篇文章的分类和标签都是相同的,这会产生很多重复数据,当数据量很大时就浪费了存储空间。

不同的文章可能它们对应的分类或者标签是相同的,所以我们把分类和标签提取出来,做成单独的数据库表,再把文章和分类、标签关联起来。下面分别是分类和标签的数据库表:

分类 id 分类名
1 Laravel
2 Python
标签 id 标签名称
1 Laravel教程
2 Python爬虫

编写博客模型代码

以上是自然语言描述的表格,数据库也和编程语言一样,有它自己的一套规定的语法来生成上述的表结构,这样我们才能把数据存进去。一般来说这时候我们应该先去学习数据库创建表格的语法,再回来写我们的 Laravel 博客代码了。但是 Laravel 告诉我们不用这么麻烦,它已经帮我们做了一些事情。Laravel 把那一套数据库的语法转换成了 PHP 的语法形式,我们只要写 PHP 代码就可以了,Laravel 会把 PHP 代码翻译成对应的数据库操作。

这种操作数据库的行为在 Laravel 中我们称之为 数据库迁移,迁移就像是数据库的版本控制器,让你的团队更容易修改和共享程序的数据库结构。迁移通常配合 Laravel 的结构生成器,能更容易的生成应用程序的数据库结构。

例如我们使用 make:migration Artisan 命令来创建分类数据库表:

php artisan make:migration create_category_table

新创建的迁移会放在你的 database/migrations 目录。每个迁移的文件名都包含一个时间戳来让 Laravel 确认迁移的顺序。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoryTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('category', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->default('')->comment('分类名称');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('category');
    }
}

这样,Laravel 就可以把 CreateCategoriesTable 这个类翻译成数据库的操作语言,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 id。可以看出从 Laravel 代码翻译成数据库语言时其规则就是一个迁移类对应一个数据库表格,类的属性对应着表格的列,属性名即列名。

我们需要 3 个表格:文章(Post)、分类(Category)以及标签(Tag),接下来创建文章和标签表格,同时完善数据库字段信息。

php artisan make:migration create_post_table

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('post', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('user_id')->default(0)->comment('用户ID');
            $table->integer('category_id')->default(0)->comment('分类ID');
            $table->string('title')->default('')->comment('文章标题');
            $table->text('body')->default('')->comment('文章正文');
            $table->tinyInteger('status')->default(0)->comment('文章状态');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('post');
    }
}

php artisan make:migration create_tag_table

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTagTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->default('')->comment('标签名称');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tag');
    }
}

多对多关联关系

文章(Post)和标签(Tag)数据库表属于多对多关系,所以我们需要建立一张中间表(post_tag):

php artisan make:migration create_post_tag_table

添加字段:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostTagTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('post_tag', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('post_id')->unsigned()->index()->comment('文章ID');
            $table->foreign('post_id')->references('id')->on('post')->onDelete('cascade');
            $table->integer('tag_id')->unsigned()->index()->comment('标签ID');
            $table->foreign('tag_id')->references('id')->on('tag')->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('post_tag');
    }
}

迁移、操作数据库

我们已经编写了博客数据库模型的代码,但那还只是 Laravel 代码而已,准确的说是 PHP 代码,Laravel 框架还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。

数据库配置

数据库的配置文件放置在 config/database.php 文件中,你可以在此定义所有的数据库连接,并指定默认使用的连接。此文件内提供了大部分 Laravel 能支持的数据库配置示例。一般情况下我们只需要新建一个 blog 的数据库并修改 .env 文件:

...
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog    # 数据库表名称
DB_USERNAME=root    # 数据库用户名
DB_PASSWORD=123     # 数据库密码
...

数据迁移

运行所有未完成的数据迁移使用 Artisan 命令:make:migration:

php artisan migrate

打开数据库,就会发现多了一些数据表:

Laravel 处理 HTTP 请求