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

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

评论:

jokee
2016-04-05 10:51
call函数默认会把类里所有的func调用一遍吗?
多谢
jokee
2016-04-05 16:44
@jokee:找了原代码,原来是这样的
    public function call($class)
    {
        $this->resolve($class)->run();

        if (isset($this->command)) {
            $this->command->getOutput()->writeln("<info>Seeded:</info> $class");
        }
    }

BTW,多谢lz的教程
楠楠猪
2016-04-02 21:41
老师你好,我也想把自己的主页变成你的http://fuck.io:88/home,而不是http://localhost/test1/learnlaravel5/public/home,我该怎么做啊,谢谢啦!
1
2016-04-11 17:57
@楠楠猪:虚拟主机里面配置一下
henry
2016-03-29 14:33
感谢分享!学到了很多,都按楼主的步骤实现了
崇拜大神
2016-03-24 11:06
好崇拜大神啊
几只少年
2016-02-25 21:06
已收藏楼主博客,88年的吧~
JohnLui
2016-02-25 21:17
@几只少年:93。。。
jinhaoxu
2016-03-18 21:37
@JohnLui:老师你好,我想请问一下:
1.laravel5.0是不是自带记住登录状态,为什么我没勾选记住我,我重启浏览器后它还是记住我了??
2.laravel5.0是不是得自己写限制用户登录错误次数的方法?它原来的ThrottlesLogins在laravel5.0里面好像用不了......
老师如果您有空的话就回复一下我,或者发邮箱给我,指点一下我这只迷途的“小羔羊”:)

2016-09-13 01:30
@jinhaoxu:学习了
赵明亮
2016-02-15 11:26
学习了
Cindy
2016-02-08 21:47
你好,我一直無法連到home目錄,它一直出現Error 404,請問是什麼原因呢?
Happybird
2016-02-22 18:39
@Cindy:今天我也出这个问题了,后来发现把apache conf里
LoadModule rewrite_module modules/mod_rewrite.so前面的# 去掉就行了
Ryuuri
2016-03-11 11:32
@Happybird:成功了。
非常感谢。
mili
2016-01-26 23:46
老师你好现在 我按照你的教程开始做 没有下载下来 没有HOME 的控制器 和页面了希望您能更新教程 虽然这个有基础的人来说 不算啥
php新手上路
2016-01-25 01:31
老师 您好伟大
T厌氧De鱼
2016-01-12 13:12
运行sudo php artisan migrate时
**************************************
*     Application In Production!     *
**************************************
Do you really wish to run this command? [y/N] y
                                                  
  [Illuminate\Database\QueryException]                                                            
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at'  
  (SQL: create table `users` (`id` int unsigned not null auto_increment primary key, `name` varch  
  ar(255) not null, `email` varchar(255) not null, `password` varchar(60) not null, `remember_tok  
  en` varchar(100) null, `created_at` timestamp default 0 not null, `updated_at` timestamp defaul  
  t 0 not null) default character set utf8 collate utf8_unicode_ci)                                
                                                                                                  
  [PDOException]                                                                                  
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at'
wanyutang
2016-02-21 05:20
@T厌氧De鱼:執行 composer update 後再 sudo php artisan migrate 看看
參考:https://github.com/twostairs/paperwork/issues/337
eddywon
2016-01-11 18:30
Page::create([
        'title'   => 'Title '.$i,
        'slug'    => 'first-page',
        'body'    => 'Body '.$i,
        'user_id' => 1,
      ]);
貌似这里有问题,应该改成下面的才能运行来着
DB::table('pages')->insert([
        'title'   => 'Title '.$i,
        'slug'    => 'first-page',
        'body'    => 'Body '.$i,
        'user_id' => 1,
      ]);
JohnLui
2016-01-11 18:52
@eddywon:Page 类需要在前面 use。
末路伯爵
2016-01-08 10:37
请问下这两个文件是怎么来的***_create_articles_table.php、***_create_pages_table.php,我跟着教程跟走的只有users和password的两个文件。我按照上面路由配置之后访问home页面直接报错:
ReflectionException in Route.php line 264:
Class App\Http\Controllers\HomeController does not exist
in Route.php line 264
at ReflectionMethod->__construct('App\Http\Controllers\HomeController', 'index') in Route.php line 264
at Route->signatureParameters('Illuminate\Database\Eloquent\Model') in Router.php line 838
at Router->substituteImplicitBindings(object(Route)) in Router.php line 823
at Router->substituteBindings(object(Route)) in Router.php line 806
at Router->findRoute(object(Request)) in Router.php line 670
at Router->dispatchToRoute(object(Request)) in Router.php line 654
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 53 。
能帮忙解答下吗?我的版本是5.2。
fade
2016-01-13 17:18
@末路伯爵:5.0以后的版本移除了auth模块。教程一开始就说了以5.0版本来写的。
我用5.1也出了这个问题。。
Aicy
2016-03-04 13:56
@fade:,请问你后面是怎么解决这个问题的,在5.1上
arthur
2016-03-16 12:00
@Aicy:很简单,执行php artisan make:auth就好了,参见官方文档:https://laravel.com/docs/5.2/authentication。
小七
2016-01-06 17:16
大神,全局类在哪里写,怎么调用啊,求指点啊
JohnLui
2016-01-06 17:25
@小七:类都是全局的呀。。。
小七
2016-01-06 17:30
@JohnLui:我不知道这样的全局函数放在哪里怎么调用
JohnLui
2016-01-06 17:30
@小七:学习下 命名空间,就明白了
iswant
2016-01-05 10:34
刚安装的laravel5.2,发现session不能用,这个问题很是扯淡,不知道还有没有人遇到这个问题,详细描述如下:
http://zhidao.baidu.com/question/2076165870789234268.html
Eric
2016-01-04 15:26
你好,我执行php artisan db:seed命令时出现以下错误
[Illuminate\Database\QueryException]
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'title' in 'field li
st' (SQL: insert into `pages` (`title`, `slug`, `body`, `user_id`, `updated
_at`, `created_at`) values (Title 0, first-page, Body 0, 1, 2016-01-04 07:2
4:15, 2016-01-04 07:24:15))
[PDOException]
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'title' in 'field li
st'
acaxia
2016-01-07 17:54
@Eric:数据库里没有title字段吧
谢谢
2015-12-31 11:54
非常感谢
丢小丢
2015-12-27 20:31
根本没有home目录 5.0.22 版本
proof
2015-12-24 16:51
[Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at' (SQL: create table `users` (`id` int unsigned not null auto_increment primary k
  ey, `name` varchar(255) not null, `email` varchar(255) not null, `password` varchar(60) not null, `remember_token` varchar(100) null, `created_at` timestamp default 0 not nul
  l, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci)

我在执行php artisan migrate的时候就一直报这个错是怎么回事啊。。
何笙
2015-12-14 17:21
你好,我在做一个注册,完全没有弄明白,老师能给我一个思路么,我找了很多文件都没有解决,我注册的时候明明把E-mail去掉了,但是每次注册的时候还要提示我The email field is required.   老师能给我一个大概的思路么。
cc
2015-12-12 11:36
老师你好,我用了下面的那条命令改名后,网站就打不开了
php artisan app:name larvael5
------------------------------------------------------------------------------------------------------------------------------------------------------------
PHP Fatal error:  Uncaught exception 'ReflectionException' with message 'Class larvael5\Http\Kernel does not exist' in E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php:776
Stack trace:
#0 E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php(776): ReflectionClass->__construct('larvael5\\Http\\K...')
#1 E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php(656): Illuminate\Container\Container->build('larvael5\\Http\\K...', Array)
#2 E:\www\13838\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(613): Illuminate\Container\Container->make('larvael5\\Http\\K...', Array)
#3 E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php(229): Illuminate\Foundation\Application->make('larvael5\\Http\\K...', Array)
#4 E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php(773): Illuminate\Container\Container->Illuminate\Container\{closure}(Object(Illuminate\Foundation\Application), Array)
#5 E:\www\13838\vendor in E:\www\13838\vendor\laravel\framework\src\Illuminate\Container\Container.php on line 776



请问怎么还原呢??
aaa
2016-04-10 17:53
@cc:将vendor/composer/autoload_psr4.php的最后一行
    改为'YourAppName\\' => array($baseDir . '/app'),

发表评论:

© 2011-2018 岁寒  |  Powered by Emlog