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

2015-3-7   /   阅读数:275638   /   分类: 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

评论:

Jill-Wang
2015-12-09 14:24
老师您好,网址上输入127.0.0.1可以打开是正常显示,但是我后面输入了/home就报404错误,下面没有那个文件,是怎么回事
LeeC
2015-12-13 23:01
@Jill-Wang:我也是这个错误!
qw
2015-12-14 11:19
@Jill-Wang:我的也是404。。在阿里云上是404.。
我本地用wamp。能正常显示。。
菠菜
2015-12-18 17:53
@qw:index.php/home 哦哦哦
lisam
2016-08-10 10:43
@qw:没有授权吧
小新
2015-12-08 11:05
老师请问,执行
D:\wamp\www\laravel>php artisan migrate

Fatal error: Call to undefined function Illuminate\Foundation\Bootstrap\mb_inter
nal_encoding() in D:\wamp\www\laravel\vendor\compiled.php on line 1809

报错,开启了mb_string扩展, 并且单独文件测试 mb_internal_ecoding函数没报错,一执行php artisan migrate 就报错,应该怎么解决呢
小新
2016-01-26 10:00
@小新:老师,您好,上面问题已解决!
          原因还是自己留的坑,我之前wampserver环境是 5.4.16,安装后会在系统环境变量会有这个值,之后又安装5.5.12,环境变量5.4的把5.5的覆盖了(5.4在前),但是wamp环境中的php5.4.16包我没删,所以在cmd中执行php ,自然就执行了5.4的!
backstreetwx
2015-12-03 09:51
老师您好
为什么我在第三步最后,注册成功后,在数据库查看用户的密码是一堆类似乱码的杂乱符号呢? 而不是密码本身?
比如我注册一个用户,使用密码 123456 ,在数据库中查看就是一大长串字母加数字加符号,而我手动将数据库中的这个符号修改为 123456后
登录的时候会提示 Whoops! There were some problems with your input. These credentials do not match our records.
请问这可能是哪里出问题了呢?谢谢!
JohnLui
2015-12-03 11:37
@backstreetwx:因为密码是加密存储的呀。。。。
backstreetwx
2015-12-04 18:32
@JohnLui:那请问老师
如果用户忘记了密码,而我数据库又不能直接修改这个密码
这种情况应该怎么办呢? 数据库不能把加密的密码解密查看吗?

谢谢! >_<
JohnLui
2015-12-04 18:34
@backstreetwx:虽然你态度很好,但是基础知识差的太多了,这些问题找个 QQ 群问问吧。。。。
backstreetwx
2015-12-04 18:53
@JohnLui:老师您好

查了下好像密码存进数据库自动MD5加密
因为以前都做客户端工作 android  IOS 之类的 ,前台的工作很多, 数据库以前只是学生项目,后台简单通过 sql语句增删改查并没有对密码进行处理所以数据库里的密码是明文的
看来实际的项目密码是必须处理的,感谢老师的回复
PHP的学习还得要努力啊
黄传备
2015-12-02 10:20
php artisan db:seed 楼主你好,这句话的时候提示SQLSTATE[42S22]:Column not found: 1054
Carrie
2016-01-28 15:11
@黄传备:你解决了吗?
我用的是windows一键安装的Laravel,cmd命令里面是没有composer的,
配置文件显示
"autoload": {
        "classmap": [
            "database"
        ],
直接执行php artisan db:seed,出现了同样问题
sha
2015-11-22 16:39
成功以后, tables 表和 pages 表已经出现在了数据库里,去看看吧~
tables表应该是articles表
anzichen
2015-11-23 11:54
@sha:是的
菜鸟
2015-11-22 13:20
redirect('basic/addProvince')->withInput()->withErrors('保存失败');
input 文本之前的值没有 怎么回事
JohnLui
2015-11-22 15:48
@菜鸟:需要使用 Laravel 的 Form 组件构件表单才行,而不是手写 input。
长青
2015-11-22 10:30
博主,请问一下,你现在发布的 laravel5.0教程,是否适合学习laravel5.1?
陌熙
2015-11-15 11:37
博主,我想请教您一个问题:我的laravel5项目在本机上(wamp)测试时全完没有问题的,现在要发布到线上(lnmp)后,访问public/index.php 是正常的,而访问其他url这提示file not found。需要哪些配置?求解,我对lnmp不是很熟悉
JohnLui
2015-11-15 15:56
@陌熙:伪静态配置,你去搜一下吧。
Gin
2015-11-10 17:05
博主您好,
我按照步骤在执行php artisan migrate的时候出现了错误
[PDOException]
  could not find driver
我的pdo_pgsql扩展是打开的

PDO

PDO support    enabled
PDO drivers    mysql, pgsql, sqlite

pdo_pgsql

PDO Driver for PostgreSQL    enabled
PostgreSQL(libpq) Version    9.2.2
Module version    1.0.2
Revision    $Id$

pgsql

PostgreSQL Support    enabled
PostgreSQL(libpq) Version    9.2.2
PostgreSQL(libpq)    Uninitialized version string (win32)
Multibyte character support    enabled
SSL support    disabled
Active Persistent Links    0
Active Links    0

Directive    Local Value    Master Value
pgsql.allow_persistent    On    On
pgsql.auto_reset_persistent    Off    Off
pgsql.ignore_notice    Off    Off
pgsql.log_notice    Off    Off
pgsql.max_links    Unlimited    Unlimited
pgsql.max_persistent    Unlimited    Unlimited


尝试了用PHP直接连postgresql正常,代码如下
<?php
$dsn = 'pgsql:dbname=kaigo;host=127.0.0.1;port=5432';
$user = 'kaigo';
$pass = 'kaigo';

try {
    $dbh = new PDO($dsn, $user, $pass);
    $sql = 'SELECT CURRENT_TIMESTAMP';
    foreach ($dbh->query($sql) as $row) {
        print $row[0] . "\n";
    }
    $dbh = null;
} catch (PDOException $e){
    print('[ERROR] ' . $e->getMessage() . "\n");
    die();
}
?>

.env文件数据库连接部分如下
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_DATABASE=kaigo
DB_USERNAME=kaigo
DB_PASSWORD=kaigo

database.php文件部分如下

'default' => 'pgsql',
    'connections' => [
        'pgsql' => [
            'driver'   => 'pgsql',
            'host'     => env('DB_HOST', '127.0.0.1'),
            'database' => env('DB_DATABASE', 'kaigo'),
            'username' => env('DB_USERNAME', 'kaigo'),
            'password' => env('DB_PASSWORD', 'kaigo'),
            'charset'  => 'utf8',
            'prefix'   => '',
            'schema'   => 'public',
        ],

环境是win7 64位,wampserver2.5(apache 2.4.9+php 5.5.12),postgresql 9.2
如果是连接mysql和sqlite能够正常通过,连postgresql就会出现上面说的错误
按照网上说的将libpq.dll文件拷到了apache目录下依然没有用
请问该如何解决?
JohnLui
2015-11-10 17:23
@Gin:数据库用户名密码错误而已。
Gin
2015-11-10 17:55
@JohnLui:是我粗心了吗,我看了下我用PHP直接连postgresql的代码里面的用户名密码跟写在配置文件里的一样啊
JohnLui
2015-11-10 17:59
@Gin:看起来你是对的,确实是 pg 驱动不存在
Gin
2015-11-10 18:20
@JohnLui:被这个问题困扰了一天了,上谷歌也没搜到什么好的解决办法
Gin
2015-11-11 19:46
@JohnLui:我想可能是64位的问题
因为之前别的事情也是在wampserver64位上失败了,然后换32位就好了
于是我就直接全部换成了32位的,把wamp也换成了xampp
问题解决了
jz
2015-11-09 15:10
老师您好,我到最后一步的时候php artisan db:seed就出错了
  [ReflectionException]
  Class PageTableSeeder does not exist
董咚懂咚
2015-11-07 13:12
请问这个评论框用的是什么插件?之前好像有人问过,但是没找见……
JohnLui
2015-11-07 14:14
@董咚懂咚:这是 emlog 自带的
董咚懂咚
2015-11-07 15:54
@JohnLui:唉,好尴尬呀
jerrrrry
2015-11-04 16:12
老师您好

请问如何能有效的去除掉laravel5中的public、index.php
我之前只是将网站root下的server.php改名为index.php
这个只解决了一部分,比如访问www.com/laravel不再是以前的ww.com/laravel/public/index.php

但是别的部分,比如有页面跳转的情况,比如ww.com/page/1是server not fund
然而ww.com/index.php/page/1是可以访问页面

我已经把。htaccess里面的参数也修改了,还是没有起效
JohnLui
2015-11-04 16:25
@jerrrrry:在哪儿看的自己改文件名的。。。。给我个链接我去骂他。
你要直接把网站根目录配置到 public。
jerrrrry
2015-11-04 16:40
@JohnLui:老师您好
你说的是不是在config下面的app.php里面改写url的参数?
这个之前也改过,还是没有效果 = =。。。
JohnLui
2015-11-04 16:49
@jerrrrry:改你的 Apache 或者 nginx 的配置。
jerrrrry
2015-11-16 03:26
@JohnLui:老师,我已经更改apache的配置文件, 只是在访问domain.com的时候没有index.php,但是如果redirect到‘home'的地址,还是默认会帮你加一个index.php., 求老师给点提示,我也已经按照您的root下的.htaccess更改了, 还是去不掉indexphp这个碧池= =
jerrrrry
2015-11-15 14:16
@JohnLui:老师,我现在更改了apache的配置,已经可以去除public,但是还是需要加上index.php,才能正常的访问网站,是不是我还没改全。。
AGui
2015-10-28 19:22
老师你好, 是用了 jenssegers/laravel-mongodb 拓展包。。 数据都通了。。登录验证提交为什么老没反应?? 能指点一二吗?

http://120.25.106.144:8888/auth/login
wen
2015-11-06 14:40
@AGui:你好,我是laravel 新手,现在对这个laravel 使用mongo库,想请教一下
AGui
2015-11-07 00:16
@wen:先去 看下这个文档。
https://github.com/jenssegers/laravel-mongodb

然后试着用composer 安装上去。
wen
2015-11-07 09:26
@AGui:哈哈,太感谢了,以前没有仔细看过这种文档,一看英文的就懒得看了,今天看了一下,已经整好了
白菜
2015-11-27 01:13
@wen:@wen 你好,我按照文档安装之后,出现了如下错误,google了下没有找到好的解决方案呢,麻烦能帮忙看一下吗
Failed to connect to: localhost:27017: SASL Authentication failed on database 'admin': Authentication failed.
白菜
2015-11-27 01:14
@wen:你好,请问你出现了这个问题吗?
Failed to connect to: localhost:27017: SASL Authentication failed on database 'admin': Authentication failed.
zmphp
2015-10-26 20:50
怎么建个数据库,加几条语句都要php 什么artisn语句。。感觉好难的感觉。
阿郎
2015-10-19 11:11
/*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */
这是我看到的配置网站根目录的介绍,说是要配置到应用的根目录,可是应用的根目录不应该配置到learnlaravel5吗,
您为啥要配置到public呢
JohnLui
2015-10-19 11:26
@阿郎:不是我要配置到 public,是程序入口就在 public 里,任何人都要设置到 public 里。
xinshou
2015-10-15 10:51
$users = DB::table('user')->select('email', 'password')->get();这个可以但是我要是想往里面填东西就不行了,语法哪错了
$users = DB::table('user')->select('email'=$email, 'password'=$password)->get();
孤独的瘦子
2015-10-08 16:56
Request $request与Input::get('title') 有何区别?
lincoln
2015-10-02 10:01
您好!按照步骤走,碰到下面问题,求解
PHP Fatal error:  Call to undefined method PageTableSeeder::setContainer() in /home/opt/demos/lv_demo/laraveldemo/vendor/laravel/framework/src/Illuminate/Database/Seeder.php on line 57
                                    
  [Symfony\Component\Debug\Exception\FatalErrorException]  
  Call to undefined method PageTableSeeder::setContainer()
码农一枚
2015-10-01 21:03
请问安装成功后,提交注册信息就提示  BadMethodCallException in Controller.php line 283:
Method [validator] does not exist.  为什么?
TP9
2015-09-29 10:33
各位大神们,,,如果视图中通过表单POST提交数据,要提交到哪里?

发表评论:

© 2011-2018 岁寒  |  Powered by Emlog