Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】

2015-3-7   /   阅读数:275630   /   分类: Laravel

基于最新 Laravel 5.5 的 2017 版教程已经发布到 Github:https://github.com/johnlui/Learn-Laravel-5/issues

十分建议学习 5.5,跟 5.0 比变化非常大。


本教程示例代码见:https://github.com/johnlui/Learn-Laravel-5

大家在任何地方卡住,最快捷的解决方式就是去看我的示例代码。


Laravel 5 中文文档:

1. http://laravel-china.org/docs/5.0

2. http://www.golaravel.com/laravel/docs/5.0/


默认条件

本文默认你已经有配置完善的 PHP + MySQL 运行环境,懂得 PHP 网站运行的基础知识。跟随本教程走完一遍,你将会得到一个基础的包含登录的简单 blog 系统,并将学会如何使用一些强大的 Laravel 插件和 composer 包(Laravel 插件也是 composer 包)。

软件版本:PHP 5.4+,MySQL 5.1+

本文不推荐完全不懂 PHP 与 MVC 编程的人学习。本文不是 “一步一步跟我做” 教程。本文需要你付出一定的心智去解决一些或大或小的隐藏任务,以达到真正理解 Laravel 运行逻辑的目的。

1. 安装

许多人被拦在了学习Laravel的第一步,安装。并不是因为安装教程有多复杂,而是因为【众所周知的原因】。在此我推荐一个composer全量中国镜像:http://pkg.phpcomposer.com/ 。推荐以 “修改 composer 的配置文件” 方式配置。

镜像配置完成后,切换到你想要放置该网站的目录下(如 C:\wwwroot、/Library/WebServer/Documents/、/var/www/html、/etc/nginx/html 等),运行命令:

composer create-project laravel/laravel learnlaravel5 5.0.22

然后,稍等片刻,当前目录下就会出现一个叫 learnlaravel5 的文件夹。

本系列教程使用 Laravel 5.0 版本,5.1 版本去掉了本系列教程主要讲解的元素(Auth 系统),不建议使用 5.1 来学习。本系列教程为入门教程,目的是搞清楚 Laravel 的基本使用方法,切忌本末倒置。

然后将网站根目录配置为 learnlaravel5/public。

如果你不会配置,建议去学会配置,网上资料很多。如果自暴自弃,可以把 的第 29 行 'url' => 'http://localhost', 配置成你的子目录地址,注意,要一直配置到 */learnlaravel5/public。

使用浏览器访问你配置的地址,将看到以下画面(我在本地配置的地址为 http://fuck.io:88 ):

Image

2. 体验 Auth 系统并完成安装

—— 经过上面的过程,Laravel 5 的安装成功了?

—— 没有o(╯□╰)o

查看路由文件 learnlaravel5/app/Http/routes.php 的代码:

Route::get('/', 'WelcomeController@index');

Route::get('home', 'HomeController@index');

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

跟随代码里的蛛丝马迹,让我们访问 http://fuck.io:88/home (请自行替换域名),结果竟然跳转到了登陆页?

Image

没错,Laravel 自带了开箱即用的 Auth 系统,连页面都已经写好了。

让我们随意输入邮箱和密码,点击登录,你很可能得到以下画面(Mac 或 Linux 下):

Image

为什么空白?用开发者工具查看,这个请求的状态码是 500,为什么?

因为 learnlaravel5/storage 目录没有 777 权限。

执行 shell 命令:

cd learnlaravel5

sudo chmod -R 777 storage

重新访问 http://fuck.io:88/home ,随意输入邮箱和密码,如果你得到以下画面:

Image

那么恭喜你~ Laravel 5 安装成功!

不想配置镜像的同学,可以使用 Laravel 界非常著名的 安正超 搞的安装神器:https://github.com/overtrue/latest-laravel

3. 数据库建立及迁移

Laravel 5 把数据库配置的地方改到了 learnlaravel5/.env,打开这个文件,编辑下面四项,修改为正确的信息:

DB_HOST=localhost

DB_DATABASE=laravel5

DB_USERNAME=root

DB_PASSWORD=password

推荐新建一个名为 laravel5 的数据库,为了学习方便,推荐使用 root 账户直接操作。

Laravel 已经为我们准备好了 Auth 部分的 migration,运行以下命令执行数据库迁移操作:

php artisan migrate

得到的结果如下:

Image

如果你运行命令报错,请检查数据库连接设置。

至此,数据库迁移已完成,你可以打开 http://fuck.io:88/home 欢快地尝试注册、登录啦。

4. 模型 Models

接下来我们将接触Laravel最为强大的部分,Eloquent ORM,真正提高生产力的地方,借用库克的一句话:鹅妹子英!

运行一下命令:

php artisan make:model Article

php artisan make:model Page

Laravel 4 时代,我们使用 Generator 插件来新建 Model。现在,Laravel 5 已经把 Generator 集成进了 Artisan。

现在,Artisan 帮我们在 learnlaravel5/app/ 下创建了两个文件 Article.phpPage.php,这是两个 Model 类,他们都继承了 Laravel Eloquent 提供的 Model 类 Illuminate\Database\Eloquent\Model,且都在 \App 命名空间下。这里需要强调一下,用命令行的方式创建文件,和自己手动创建文件没有任何区别,你也可以尝试自己创建这两个 Model 类。

Model 即为 MVC 中的 M,翻译为 模型,负责跟数据库交互。在 Eloquent 中,数据库中每一张表对应着一个 Model 类(当然也可以对应多个)。

如果你从其他框架转过来,可能对这里一笔带过的 Model 部分很不适应,没办法,是因为 Eloquent 实在太强大了啦,真的没什么好做的,继承一下 Eloquent 类就能实现很多很多功能了。

如果你想深入地了解 Eloquent,可以阅读系列文章:深入理解 Laravel Eloquent(一)——基本概念及用法


接下来进行 Article 和 Page 类对应的 articles 表和 pages表的数据库迁移,进入 learnlaravel5/database/migrations 文件夹。

*_create_articles_table.php 中修改:

Schema::create('articles', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('title');
    $table->string('slug')->nullable();
    $table->text('body')->nullable();
    $table->string('image')->nullable();
    $table->integer('user_id');
    $table->timestamps();
});

*_create_pages_table.php 中修改:

Schema::create('pages', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('title');
    $table->string('slug')->nullable();
    $table->text('body')->nullable();
    $table->integer('user_id');
    $table->timestamps();
});

然后执行命令:

php artisan migrate

成功以后, articles 表和 pages 表已经出现在了数据库里,去看看吧~

5. 数据库填充 Seeder

learnlaravel5/database/seeds/ 下新建 PageTableSeeder.php 文件,内容如下:

delete();

    for ($i=0; $i < 10; $i++) { Page::create([ 'title' => 'Title '.$i,
        'slug'    => 'first-page',
        'body'    => 'Body '.$i,
        'user_id' => 1,
      ]);
    }
  }

}

然后修改同一级目录下的 DatabaseSeeder.php中:

// $this->call('UserTableSeeder');

这一句为

$this->call('PageTableSeeder');

然后运行命令进行数据填充:

composer dump-autoload

php artisan db:seed

去看看 pages 表,是不是多了十行数据?


教程(一)代码快照:https://github.com/johnlui/Learn-Laravel-5/archive/tutorial_1.zip


下一步:Laravel 5 系列入门教程(二)【最适合中国人的 Laravel 教程】

WRITTEN BY

avatar

评论:

wjc
2015-08-20 11:32
请教个问题,我在做数据填充时,为什么插入汉字时会报错,改了mysql字段字符集还是不行?
D:\www\learnlaravel5.1>php artisan db:seed

  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xD5\xC5\xC8\
  xFD"' for column 'Name' at row 1 (SQL: insert into `students` (`NO`, `Name`
  , `Class`, `Age`, `Birthday`, `updated_at`, `created_at`) values ("NO001",
  "????", "一??", 20, 1980-01-09, 2015-08-20 03:18:38, 2015-08-20 03:18:38))

  [PDOException]
  SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xD5\xC5\xC8\
  xFD"' for column 'Name' at row 1

源码最后改成这样的:
class StudentTableSeeder extends Seeder{
    public function run()
    {
       DB::table('students')->delete();
        $NO = 'NO001';
        $Name = '张三';
        $Class = '一班';
        $temp_date = '2015-01-09 19:25:43';
        Student::create([
            'NO' => '"'.$NO.'"',
            'Name' => '"'.$Name.'"',
            'Class' => '"'.$Class.'"',
            'Age' => 20,
            'Birthday' => date('Y-m-d',strtotime($temp_date))
        ]);
acsu
2015-08-15 14:09
楼主您好,我按教程全做完了。之后想试试分页功能,可是只有在“http://localhost/”这个地址上的分页成功了,"http://localhost/articles/"这个地址上的分页只能显示第一页,不论点击第几页的链接结果都是显示第一页,请问这个问题如何解决?
分页的代码如下:
ArticlesController.php
public function index()
{
    return view('articles.index')->withArticles(Article::paginate(2));
}

index.blade.php
<?php echo $articles->render(); ?>

生成的分页链接是这样的:http://localhost/articles/?page=4
这样还是显示第一页,
可是用这个地址:http://localhost/?page=4 就可以正常分页显示,
分页的代码都是一样的,我是新手,实在不知道该怎么弄了,请帮帮我吧
JohnLui
2015-08-22 14:03
@acsu:http://localhost/articles/?page=4 应该是 http://localhost/articles?page=4 才会起作用。
acsu
2015-08-24 18:48
@JohnLui:感谢楼主写了这么好的教程,还花时间来回答问题
我后来发现是nginx的配置写错了,
location / {
    try_files $uri $uri/ /index.php?$query_string;
}
这里不知道怎么回事写成:
location / {
    try_files $uri $uri/ /index.php;
}

少了最后的?$query_string,所以url里的查询参数都丢掉了。
胖子
2015-09-11 17:39
@JohnLui:老师,又打扰你了,我现在遇到的问题,想请教你一下:
我根据楼上那位同学的方法,在WenController.php里面:
    public function index()
    {    
        return view('wen')->withWens(Wen::paginate(15));
    }
然后打开http://127.0.0.1/test/firstpj/public/wen?page=3发现可以实现分页跳转,
但是把<?php echo $wen->render(); ?>或者变换格式 {{ $wen->render() }}放到wen.blade.php里,打开网页就出现错误代码。
想请教下,如何能也页面下形成那种正常的翻页效果?麻烦了
胖子
2015-09-11 18:00
@JohnLui:已经解决,
<div class="container">
    <?php foreach ($users as $user): ?>
        <?php echo $user->name; ?>
    <?php endforeach; ?>
</div>

<?php echo $users->render(); ?>

我没分好$users和$user
dafa
2015-08-11 14:37
现在时间是 14:36 而注册完之后时间却是6:00 , 所以在安装之后需要设置下 时区, 希望作者在文中加上!
Randy
2015-08-10 15:15
Parse error: syntax error, unexpected '[' in D:\WWW\learnlaravel5\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php on line 383

博主你好,为什么windows上总有这个问题?我php的版本是5.6.11
JohnLui
2015-08-22 14:01
@Randy:这个确实是PHP版本低于5.4会出现的问题,通过 phpinfo() 看一下版本吧
xinxin
2015-08-09 12:41
博主你好,
请问“composer create-project laravel/laravel learnlaravel5 5.0.22”和“laravel new blog”有什么区别?
JohnLui
2015-08-09 12:47
@xinxin:第二种情况只适用于装了 Laravel 安装器在系统上。第一种是装了 composer 在系统上。
Neverland
2015-08-06 17:03
博主你好,在php artisan migrate的时候,出现SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES)。然后重装了MYsql,问题并未解决...!help。。。
phperstar
2015-08-06 23:29
@Neverland:数据库配置的账号密码有问题吧,命令行下用配置信息连接数据库测试一下
景仁景行
2015-08-05 18:40
楼主你好,我自己下载的软件包,之前遇到的问题都没有了,但是走到显示pages列表的时候,Page:all()这段代码一直报错,是什么原因呢:
报错信息:Whoops, looks like something went wrong.
我自己测试过,用$page = new Page();是可以初始化的Page类的,所以这个我就不大清楚是什么原因导致的了。
JohnLui
2015-08-05 18:58
@景仁景行:你需要打开 debug 。。。。
景仁景行
2015-08-06 09:43
@JohnLui:是config/app.php吧,
'debug' => true,
我改过了
景仁景行
2015-08-06 10:31
@JohnLui:楼主你好,我刚刚那个问题已经解决,我贴出来分享一下
我仔细查看了报错信息,发现是数据库连接错误,数据库的连接信息是在config/database.php中,
我将其中的mysql配置信息修改一下,然后重新php artisan serve一下,就能读取出数据了。
景仁景行
2015-08-05 16:41
楼主,我用composer命令下载laravel的时候,会被卡在
- Installing doctrine/inflector (v1.0.1)
    Downloading: 60%
这儿,一直不往下走,请问如何处理。
JohnLui
2015-08-05 16:50
@景仁景行:推荐日本镜像。
fanninnypeom
2015-08-01 20:25
博主 我按照你说的都做了一遍 但是我进不去后台管理的界面
因为会自动转到auth的登录界面
可是我不知道邮箱账号和密码啊
博主你知道auth的默认账号密码是多少吗......
JohnLui
2015-08-01 23:34
@fanninnypeom:进不去,表还没建立呢,你跟着教程继续走就明白了~
cheng
2015-09-18 17:33
@JohnLui:博主您好,我完整看完了您的教程,除了去掉路由里的middleware=>auth,没找到其它方法能进后台。可能是我的疏漏,请指正。

提个建议,本教程第一章注明主要讲解 Auth 系统,但真的介绍Auth相关内容比较少,希望能更加完善。

另外,Laravel 5.1目前已经加入了 Auth,希望本教程也能升级到5.1,毕竟是首个 LTS 版本。

谢谢博主。
bruce
2015-08-01 01:09
composer dump-autoload 是重新生成autoload文件吧 在什么情况下才用重新生成这个文件呢?还望大神解释下。
JohnLui
2015-08-01 01:12
@bruce:在新建了类以后。
08LZX
2015-07-31 15:57
老师你好,我配置好后访问public为什么也显示500错误,文件夹应该有权限的
JohnLui
2015-07-31 16:10
@08LZX:composer update 没有成功?
08LZX
2015-07-31 16:30
@JohnLui:成功了,另外我用 安正超的安装神器也会报这样的错
08LZX
2015-07-31 17:05
@JohnLui:php版本没跟上..
Qi
2015-07-29 11:04
您好,对于laravel的伪静态等知识点请教下,谢谢
个人目前理解的是: 访问 ....../public/home 实际相当于 ......./public/index.php/home , 将index.php后面的home作为参数传递到index.php文件中,而后,针对routes.php的配置找到home对应的controller类进行调用处理, 请问这样理解对吗?
JohnLui
2015-07-29 15:52
@Qi:对
Frank
2015-07-28 23:16
composer dump-autoload
在这里,它的作用是什么呢?
cpw
2015-07-28 12:03
请问一下 我想引入以前写的一些工具类和方法 该怎么引
JohnLui
2015-07-28 14:28
@cpw:Laravel 5 对整个 app 目录进行了 PSR-4 自动加载,就是说保持命名空间和文件夹名称一致,就可以自动引入了。
小白
2015-07-27 12:46
老师您好,教程十分明了。
我只搭在了本地,为什么我通过 http://localhost/learnlaravel5/home/ 返回404,
通过 http://localhost/learnlaravel5/public/home 能去到 Auth,
看了 phpinfo(),已经开启了 rewrite_mod,http://localhost/learnlaravel5/public/,也能顺利的跳到跟您一样的页面。
JohnLui
2015-07-27 15:37
@小白:因为入口文件是 public/index.php。
ylic
2015-07-25 10:04
感谢博主制作这份新手教程,教程的全部代码已经测试完成。目前有一个问题。
发现速度会有点卡,我测试首页,显示1000条记录的列表页,,要费时1.3秒,不查询数据库的页面还可以,在0.2秒这内。这个是什么问题,还是说框架都有这样的速度问题,请大神回复。
JohnLui
2015-07-27 01:15
@ylic:数据库可以优化的,基本都是设计问题,跟框架没关系。

2015-07-23 13:56
您好。
运行php artisan migrate时候
Could not open input file: artisan

没找到解决方法, 那些命令是在cmd下运行嘛。。什么路径呢?  我这边到指定路径时会提示'' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

谢谢解答
JohnLui
2015-07-23 18:15
@土:Laravel 项目根目录下有一个叫 artisan 的文件,在那里执行 php artisan。
ocean
2015-07-21 15:10
你好,我在执行php artisan migrate时提示:
PDOException
SQLstate[hy000][2006]MySql server has gone away
请问这个要怎么解决呢?谢谢。。。
JohnLui
2015-07-21 15:16
@ocean:MySQL 服务未启动
ocean
2015-07-21 15:24
@JohnLui:服务已经启动了。
http://localhost:88/phpmyadmin/
用phpmyadmin登陆mysql是可以得。
凤翼天堂
2015-07-21 12:43
老师你好 在最后一步的时候提示:Class 'App\Page' not found in /Library/WebServer/Documents/books/database/seeds/PageTableSeeder.php on line 12
是什么问题 可是在App目录下有Page.php
JohnLui
2015-07-21 14:27
@凤翼天堂:顶部没写 namespace App; ?
凤翼天堂
2015-07-21 14:29
@JohnLui:Page.php的顶部嘛 namespace是项目的名字我是运行这个建立的:php artisan make:model Page
JohnLui
2015-07-21 14:36
@凤翼天堂:那你要注意把所有的 App 都换成你自己设定的名字。话说没事别乱改,Laravel 确实提供了这个功能,但是由于大部分人其实都不用,里面有多少 bug 谁都不知道
凤翼天堂
2015-07-21 14:37
@JohnLui:QvQ冤枉啊 我是用命令生成之后就是它(books)的我并没有修改过<?php namespace books;
JohnLui
2015-07-21 14:41
@凤翼天堂:我的意思是,老老实实用 App 吧。。。。
tony
2015-07-18 10:58
我下载了最新的laravel5.1和最新的mongodb3.0.4但是在执行php artisan migrate时报:  [InvalidArgumentException]  Unsupported driver [mongodb]。我用php直接连通mongodb,发现是可以执行CRUD操作的,证明php的mongo扩展没有问题。那就是laravel5.1还不支持最新的mongodb驱动么?
JohnLui
2015-07-21 14:34
@tony:可能是 Laravel 5.1 有 bug,不兼容最新的 mongodb 驱动。

发表评论:

© 2011-2018 岁寒  |  Powered by Emlog