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

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

评论:

mike
2015-07-18 00:47
请问一下我如何在模板中使用项目中的资源地址呢?
我看您的代码中直接使用/css/xxx.css 就可以定向到public/css/xxx.css了这是怎样做到的呢?
如果我想使用一些类似常量的方法就像ThinkPHP中__URL__/public/css这样的引用地址又有那些常量或者替代方法呢?
多谢解答!
JohnLui
2015-07-20 10:51
@mike:因为web服务器根目录是 public 目录。
mike
2015-07-20 22:33
@JohnLui:我看项目生成了server.php这个文件,它不是入口吗?这两个文件什么关系呢?还有框架之中没有处理静态资源目录的方法吗?类似nodejs express 中就有app.use(express.static('public'));方法,这样一个框架肯定也有办法管理这些吧,可是我找了它全部的文档也没找到好方法,望指教,多谢!
JohnLui
2015-07-21 14:29
@mike:public/index.php 是入口。 PHP 只是一堆文件而已,你访问哪个,他就解释哪个。静态资源留给 Apache 和 nginx 来处理,PHP 就负责解释 .php 文件。多理解,多感受。
Hugo
2015-07-16 12:12
你好,请问这个***_create_articles_table.php 文件是怎么来的呢? 是要我手动创建吗?还有就是前面三个星号是要省略什么呢?
JohnLui
2015-07-21 14:32
@Hugo:要省略的是日期,这个时间是这个文件自动生成时候的时间。这个文件不用手动创建,是在建立model的自动创建的。
潇湘子
2015-08-03 17:13
@JohnLui:老师您好,我执行make:model后只生成了model文件,没有***_create_articles_table.php,这会是哪些原因引起的呢?
JohnLui
2015-08-03 17:34
@潇湘子:没生成的可能性不大,目测是你没找到地方。。。
潇湘子
2015-08-03 17:36
@JohnLui:谢谢老师耐心回答,后来找到问题是make:model后没有添加 --migration。我粗心了
helenandyoyo
2015-07-14 10:30
博主你好:
         再次请教一下:采用Composer-Setup.exe或命令行请求方式配置composer失败。所以我直接下载了composer.phar文件。本人电脑是win7系统,官网配置composer为系统全路径环境变量的指令我在win7命令行下试了无效。请问该将composer.phar如何配置?(ps:昨天试的只能在特定路径下运行 php composer.phar 才有效,直接composer无效,没有百度到直接下载composer.phar然后进行配置的具体操作)
        谢谢指教!
JohnLui
2015-07-14 14:14
@helenandyoyo:composer 只是一段 PHP 脚本而已,安装 composer 创建 composer 环境变量只是使用 composer 命令代替了 php composer.phar 而已。你可以把 composer.phar 放到项目根目录,每次都通过 php composer.phar dump-autoload 即可。
helenandyoyo
2015-07-13 09:30
博主你好:
        本人下载的是laravel5一键安装包版,现在要执行composer dump-autoload,但是预先没有下载过composer。laravelv-5.0.22\vendor文件夹中存在一个composer文件夹,是否是将该路径添加到path环境变量中?如果没有添加composer环境变量,则执行报错:'composer' 不是内部或外部命令,也不是可运行的程序或批处理文件。
        谢谢指教!!!
JohnLui
2015-07-13 10:38
@helenandyoyo:composer 是一个需要安装的软件。
新手求教
2015-07-11 18:26
博主求问如何保留注册登录功能。。就是要可以注册登录再进去发帖回复的
哒哒
2015-07-10 11:43
我执行  php artisan migrate  
出现的是  Nothing to migrate  ????
JohnLui
2015-07-21 14:33
@哒哒:因为已经 migrate 过一次了,在数据库里已经有记录了。解决办法是清空数据库。
helenandyoyo
2015-07-09 17:56
改为一键安装laravel5.0.22版进行学习,乱码发生:
1、在http://localhost:8000/home输入邮箱和密码,界面跳转后出现SQLSTATE[HY000] [2002] ÓÉÓÚÄ¿±ê¼ÆËã»ú»ý¼«¾Ü¾ø£¬ÎÞ·¨Á¬½Ó¡£
2、win7 命令行输入 php artisan migrate出现:[PDOException]  SQLSTATE[HY000] [2002] ????目???????????芫????薹????印?
请问是什么原因?
浏览器是unicode编码形式。
JohnLui
2015-07-09 18:06
@helenandyoyo:数据库连接错误。
helenandyoyo
2015-07-09 20:13
@JohnLui:我之前把lavarel5放置在xampp的服务器目录htdcos下,出现上述问题,刚才把larave5迁出,就好了。难道与laravel文件放置的路径有关?
helenandyoyo
2015-07-09 18:07
@helenandyoyo:追加:
      具体界面如下:

Whoops, looks like something went wrong.
1/1 PDOException in Connector.php line 47: SQLSTATE[HY000] [2002] ÓÉÓÚÄ¿±ê¼ÆËã»ú»ý¼«¾Ü¾ø£¬ÎÞ·¨Á¬½Ó¡£

    in Connector.php line 47
    at PDO->__construct('mysql:host=localhost;dbname=homestead', 'homestead', 'secret', array('0', '2', '0', false, '0')) in Connector.php line 47
    at Connector->createConnection('mysql:host=localhost;dbname=homestead', array('driver' => 'mysql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'name' => 'mysql'), array('0', '2', '0', false, '0')) in MySqlConnector.php line 20
    at MySqlConnector->connect(array('driver' => 'mysql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'name' => 'mysql')) in ConnectionFactory.php line 58
    at ConnectionFactory->createSingleConnection(array('driver' => 'mysql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, 'name' => 'mysql')) in ConnectionFactory.php line 47
    at ConnectionFactory->make(array('driver' => 'mysql', 'host' => 'localhost', 'database' => 'homestead', 'username' => 'homestead', 'password' => 'secret', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false), 'mysql') in DatabaseManager.php line 177
    at DatabaseManager->makeConnection('mysql') in DatabaseManager.php line 65
    at DatabaseManager->connection() in PasswordResetServiceProvider.php line 63
    at PasswordResetServiceProvider->Illuminate\Auth\Passwords\{closure}(object(Application), array()) in Container.php line 773
    at Container->build(object(Closure), array()) in Container.php line 656
    at Container->make('auth.password.tokens', array()) in Application.php line 613
    at Application->make('auth.password.tokens') in Container.php line 1231
    at Container->offsetGet('auth.password.tokens') in PasswordResetServiceProvider.php line 39
    at PasswordResetServiceProvider->Illuminate\Auth\Passwords\{closure}(object(Application), array()) in Container.php line 773
    at Container->build(object(Closure), array()) in Container.php line 656
    at Container->make('auth.password', array()) in Application.php line 613
    at Application->make('Illuminate\Contracts\Auth\PasswordBroker') in Container.php line 887
    at Container->resolveClass(object(ReflectionParameter)) in Container.php line 848
    at Container->getDependencies(array(object(ReflectionParameter), object(ReflectionParameter)), array()) in Container.php line 813
    at Container->build('App\Http\Controllers\Auth\PasswordController', array()) in Container.php line 656
    at Container->make('App\Http\Controllers\Auth\PasswordController', array()) in Application.php line 613
    at Application->make('App\Http\Controllers\Auth\PasswordController') in ControllerDispatcher.php line 83
    at ControllerDispatcher->makeController('App\Http\Controllers\Auth\PasswordController') in ControllerDispatcher.php line 54
    at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\Auth\PasswordController', 'getEmail') in Route.php line 198
    at Route->runWithCustomDispatcher(object(Request)) in Route.php line 131
    at Route->run(object(Request)) in Router.php line 691
    at Router->Illuminate\Routing\{closure}(object(Request))
    at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
    at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101
    at Pipeline->then(object(Closure)) in Router.php line 693
    at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 660
    at Router->dispatchToRoute(object(Request)) in Router.php line 618
    at Router->dispatch(object(Request)) in Kernel.php line 210
    at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
    at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in VerifyCsrfToken.php line 43
    at VerifyCsrfToken->handle(object(Request), object(Closure)) in VerifyCsrfToken.php line 17
    at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 55
    at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 61
    at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 36
    at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 40
    at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42
    at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 125
    at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
    at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101
    at Pipeline->then(object(Closure)) in Kernel.php line 111
    at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 84
    at Kernel->handle(object(Request)) in index.php line 53
    at require_once('D:\xampp\xampproot\htdocs\laravel-v5.0.22\public\index.php') in server.php line 21
果子
2015-07-09 11:12
您好!博主,我在完成laravel安装后,访问:http://myservername/home 时,出现404页面,为什么不能出现登录页面?有可能是什么原因?
直接访问:http://myservername/是可以出现首页的
爱吃果子
2015-07-11 18:02
@果子:可能是伪静态没搞好。。。 试着访问http://myservername/ index.php/ home
helenandyoyo
2015-07-09 10:36
初学者请教:本人下载的是lavarel一键安装包,是否也可以按照这个教程学习?
JohnLui
2015-07-09 10:54
@helenandyoyo:just try it
Frank
2015-07-28 23:43
@helenandyoyo:v5.0.22 一键包有坑,所有文件编码是GBK,小心.
王凯波
2015-07-08 10:20
请问,执行composer dump-autoload时出现这个错误:

Composer could not find a composer.json file in C:\Users\MyPC\AppData
To initialize a project, please create a composer.json file as described in the
https://getcomposer.org/ "Getting Started" section

找不到composer.json这个文件是什么原因?
王凯波
2015-07-08 15:02
@王凯波:解决了,目录没有切换过去
YLD
2015-07-07 15:47
你好,楼主,数据库迁移完成之后,访问localhost/laravel/public或localhost/laravel/home,都会出现以下问题
Whoops, looks like something went wrong.
1/1 RuntimeException in compiled.php line 6608: No supported encrypter found. The cipher and / or key length are invalid.
JohnLui
2015-07-07 16:20
@YLD:你需要 mcrypt 这个 PHP 插件。其实百度一下就能查到哦
stannisshuang
2015-07-07 02:19
关于
"然后将网站根目录配置为 learnlaravel5/public。
如果你不会配置,建议去学会配置,网上资料很多。如果自暴自弃,可以把 的第 29 行 'url' => 'http://localhost', 配置成你的子目录地址,注意,要一直配置到 ***/learnlaravel5/public。"

抱歉,我是web开发初学者,查了一晚上了还是没解决这个问题,请帮忙看看是什么原因,谢谢!

Define SRVROOT "F:/Apache24"
ServerRoot "${SRVROOT}"

LoadModule rewrite_module modules/mod_rewrite.so

DocumentRoot "F:/WWW/learnlaravel5/public"
<Directory "F:/WWW/learnlaravel5/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

这是我的httpd.conf配置(win7+apache2.4+php5.6),改完重启了,主页还是没转过来,依然显示的是F:/Apache24下的index.php , 请问是什么地方没设置对?
谢谢!
JohnLui
2015-07-07 11:11
@stannisshuang: 你完全没改对地方,再查查吧。。。
stannisshuang
2015-07-07 21:31
@JohnLui:谢谢回复。

能提示一些关键字吗? 没有概念啊。

谢谢。
JohnLui
2015-07-08 10:54
@stannisshuang:Apache 伪静态
iat.net.cn
2015-06-27 10:17
讲得很好,不知是否可以推出5.1的,LTS版本的用的人会多些
瞬间
2015-06-29 11:04
@iat.net.cn:同问
vendor
2015-06-19 11:24
想问下楼主:5.1好还是5.0好?5.1是不是开发得还不完善?你说的少了主要元素是指?
lunarfire
2015-07-02 13:57
@vendor:5.1好,因为5.1是长期支持的版本。对于框架或者开源软件,能得到稳定的版本和长期的维护真是福音。
Eager
2015-06-19 00:26
什么时候出一个Lumen的教程啊!求
JohnLui
2015-06-19 13:14
@Eager:lumen 太不完善了,推荐 TinyLara ~ http://tinylara.com/
lywindl
2015-06-18 17:07
至此,数据库迁移已完成,你可以打开 http://fuck.io:88/home 欢快地尝试注册、登录啦。

我没有欢快的注册哈 一但注册就报错 我是新手 不太明白 他说的方法是指那个地方 麻烦您 指点一下 我用的是 5.1.2

Whoops, looks like something went wrong.
1/1
BadMethodCallException in compiled.php line 8714:

Method [validator] does not exist.
JohnLui
2015-06-18 19:10
@lywindl:"本系列教程使用 Laravel 5.0 版本,5.1 版本有部分更新,但幅度不大。"

这个部分被拿掉了。
agan
2015-06-18 15:50
楼主能否把你的代码发送给我,我的邮箱是1586843890@qq.com
JohnLui
2015-06-18 16:59
@agan:
agan
2015-06-25 10:07
@JohnLui:啊哈  不用了  弄会了  谢谢你的教程
icecream
2015-06-18 14:39
5.1已经没有HomeController了呀
lx1036
2015-07-20 19:25
@icecream:5.1没有HomeController的,开始我要是觉得奇怪的呢,
agenge
2015-06-17 14:05
使用的5.1,默认没有HomeController.php
Derek
2015-06-14 23:22
博主你好,非常感谢你的教程

我目前使用Phpstorm在学习Laravel,在写model create脚本的时候,下面的语句:
$table->string('slug')->nullable();
Phpstorm提示Illuminate\Support\Fluent不提供此方法“nullable()", 我看了下Fluent里确实没有定义。但是执行artisan migration又是成功的,而且数据库字段也定义了NULL。这是怎么一回事呢?
多谢解答
JohnLui
2015-06-15 00:20
@Derek:PHP 是一种可以千变万化的解释型语言,静态检查工具并不能像编译器那样给出确切的问题,刚开始不建议使用 IDE 来学习。当然非常熟悉之后是可以使用 IDE 来提高开发效率的。所以这个问题的答案也很简单:PhpStorm 的自动侦测 Illuminate\Support\Fluent 有误或不足。

发表评论:

© 2011-2018 岁寒  |  Powered by Emlog