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

2014-9-29   /   阅读数:179493   /   分类: Laravel



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

十分建议学习 5.2,4.2 早已不再维护。



向 Laravel 4 – simple website with backend tutorial – Part 1 致敬,本教程部分内容翻译自此文章。

每一个教程完成,我将会git commit一次。

示例代码见 https://github.com/johnlui/Learn-Laravel-4

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

推荐 Laravel 4.2 中文文档 http://laravel-china.org/docs


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 的配置文件” 方式配置。

镜像配置完成后,切换到你想要放置该网站的目录下,运行命令:


composer create-project laravel/laravel learnlaravel 4.2.11

为了大家学习的方便,请暂时使用 4.2.11 版本进行入门。春节假期我会抽时间写一下 Laravel 5 的入门教程。4.2.11 的 Github 下载地址为:https://github.com/laravel/laravel/archive/v4.2.11.zip

然后,稍等片刻,当前目录下就会出现一个叫 learnlaravel 的文件夹,这时候如果你通过浏览器访问 learnlaravel/public/ 目录,基本都会显示 Error in exception handler.  ,这是因为 learnlaravel/app/storage 目录没有 777 权限,设置好权限即可看见页面如下图:

QQ20140930-3.jpg

恭喜你~Laravel安装成功!


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


2. 必要插件安装及配置

我们使用著名的Sentry插件来构建登录等权限验证系统。

打开 ./composer.json ,变更为:

"require": {
	"laravel/framework": "4.2.*",
	"cartalyst/sentry": "2.1.4"
},


然后,在项目根目录下运行命令

composer update


然后稍等一会儿,它会提示 cartalyst/sentry 2.1.4安装完成。


同理,我们将安装一个开发用的非常强大的插件,way/generators,这是它在composer库中的名字。在 composer.json中增加:

"require-dev": {
    "way/generators": "~2.0"
},

和“require”同级,放在下面,不是里面哦~。


运行 composer update,之后在 ./app/config/app.php 中 恰当的位置 增加配置:

'Way\Generators\GeneratorsServiceProvider'

安装完成过,在命令行中运行 php artisan,就可以看到这个插件带来的许多新的功能。


有人会问,为什么用了国内镜像还是如此之慢?其实composer在update的时候最慢的地方并不是下载,而是下载之前的依赖关系解析,由于Laravel依赖的composer包非常之多,PHP脚本的执行速度又比较慢,所以每次update等个两三分钟很正常,习惯就好。


3. 数据库建立及迁移


数据库配置文件位于 ./app/config/database.php,我们需要把“connections”中的“mysql”项改成我们需要的配置。下面是我的配置:

'mysql' => array(
	'driver'    => 'mysql',
	'host'      => 'localhost',
	'database'  => 'laravel',
	'username'  => 'root',
	'password'  => 'password',
	'charset'   => 'utf8',
	'collation' => 'utf8_unicode_ci',
	'prefix'    => 'l4_',
),


prefix为表前缀,这个Laravel会帮我们自动维护,大胆写上不用担心。


这时候你需要去数据库建立此数据库,然后在命令行中输入:

php artisan migrate --package=cartalyst/sentry


执行完成后,你的数据库里就有了5张表,这是sentry自己建立的。sentry在Laravel4下的配置详情见 https://cartalyst.com/manual/sentry#laravel-4,我大致说一下:


在 ./app/config/app.php 中 相应的位置 分别增加以下两行:

'Cartalyst\Sentry\SentryServiceProvider',
'Sentry' => 'Cartalyst\Sentry\Facades\Laravel\Sentry',

权限系统的数据库配置到此为止。


我们的简单blog系统将会有两种元素,Article和Page,下面我们将创建articles和pages数据表,命令行运行:

php artisan migrate:make create_articles_table --create=articles
php artisan migrate:make create_pages_table --create=pages


这时候,去到 ./app/database/migrations,将会看到多出了两个文件,这就是数据库迁移文件,过一会我们将操作artisan将这两个文件描述的两张表变成数据库中真实的两张表,放心,一切都是自动的。

下面,在***_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表就建立完成了。


4. 模型 Models

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

我们在命令行运行下列语句以创建两个model:

php artisan generate:model article
php artisan generate:model page

这时候,在 app/models/ 下就出现了两个文件 Article.php 和 Page.php,这是两个 Model 类,他们都继承了Laravel提供的核心类 \Eloquent。这里需要强调一下,用命令行的方式创建文件,和自己手动创建文件没有任何区别,你也可以尝试自己创建这两个 Model 类哦。

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

如果你从其他框架转过来,可能对这里一笔带过的 Model 部分很不适应,没办法,是因为 Eloquent 实在太强大了啦,真的没什么好做的,继承一下 Eloquent 类就能实现很多很多功能了。详见 Eloquent 系列教程:深入理解 Laravel Eloquent(一)——基本概念及用法

5. 数据库填充

分别运行下列命令:

php artisan generate:seed page
php artisan generate:seed article

这时,在 ./app/database/seeds/ 下就出现了两个新的文件,这就是我们的数据库填充文件。Laravel提供自动数据库填充,十分方便。

generator默认使用Faker\Factory作为随机数据生成器,所以我们需要安装这个composer包,地址是 https://packagist.org/packages/fzaninotto/faker ,跟generator一起安装在 require-dev 中即可。具体安装请自行完成,可以参考Sentry和Generator,这是第一次练习。


接下来,分别更改这两个文件:

Article::create([
  'title'   => $faker->sentence($nbWords = 6),
  'slug'    => 'first-post',
  'body'    => $faker->paragraph($nbSentences = 5),
  'user_id' => 1,
]);
Page::create([
  'title'   => $faker->sentence($nbWords = 6),
  'slug'    => 'first-page',
  'body'    => $faker->paragraph($nbSentences = 5),
  'user_id' => 1,
]);


然后,我们需要在 DatabaseSeeder.php 中增加两行,让Laravel在seed的时候会带上我们新增的这两个seed文件。

$this->call('ArticleTableSeeder');
$this->call('PageTableSeeder');


下面就要真正的把数据填充进数据库了:

php artisan db:seed

操作完成以后去数据库看看,数据已经填充进去了,article和page各10行。


接下来做什么?Laravel 4 系列入门教程(二)

WRITTEN BY

avatar
标签: PHP Laravel

评论:

Harlan
2014-11-08 01:05
感谢你的文章!
我在生成数据的时候遇到了这样的错误
PHP Fatal error:  Call to undefined method Faker\Factory::isDeferred() in /wwwroot/laravel/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 126

最后原因是:我在app.app加了Faker\Factory这样一个命名空间
fakecoder
2014-11-02 14:51
使用php artisan出现error:'Way\Generators\GeneratorsServiceProvider' not found。谷歌了一下,将'Way\Generators\GeneratorsServiceProvider'从app.php删除后反而好用了,我虚了,我这是病吗?
JohnLui
2014-11-02 21:35
@fakecoder:可能是放错地方了。。。
fakecoder
2014-11-03 10:04
@JohnLui:是放在provider数组里了啊,,而且后面配置sentry也是同样的问题。。昨天我又出现新问题了,用sentry就生成了一张表,不是五张,后来的article和page倒是能够生成了,这有影响吗?我感觉自己有些凌乱了
JohnLui
2014-11-03 11:12
@fakecoder:删掉local文件夹,只使用外的配置文件试试。注意看 composer.json 中的包版本。
fakecoder
2014-11-03 23:46
@JohnLui:你好,晚上才有时间弄,我把原来的工程删了,从头开始做,在安装sentry和generrator的时候提示:could not scan for classes inside app/commands which does not appear to be a file nor a folder。
我没管,然后删掉了local文件夹并在app.php中providers添加了'Way\Generators\GeneratorsServiceProvider',执行php artisan还是错误,删掉就好用。composer.json里的sentry版本都是从教程中复制过来的(composer.json是建工程之前我自己建的,貌似没问题吧)
有点小伤感
JohnLui
2014-11-04 10:23
@fakecoder:可能是你多执行了某一步操作,已经将generator注册到系统里了。多执行 composer update 。。。
fakecoder
2014-11-04 12:29
@JohnLui:貌似是,,那我继续往下做?影响大吗
JohnLui
2014-11-04 14:11
@fakecoder:建议重做。。。
fakecoder
2014-11-04 14:24
@JohnLui:重做是composer也要重装吗,还是只是重做工程?
JohnLui
2014-11-04 14:26
@fakecoder:重做工程。Composer 本质上就是一段 PHP 脚本,是不会变的。
fakecoder
2014-11-04 14:34
@JohnLui:好。我试试!谢了!
fakecoder
2014-11-04 22:27
@JohnLui:历经好几天,可算完成了第一个教程,都是自己的问题。。估计很少有人犯,说一下吧。我的毛病出在第一步,看composer配置的时候想当然的在laravel文件夹下直接建了一个composer.json文件,结果生成learnlaravel的时候里面会自带这个文件的,我改的一直是我自己建的文件,生成的没改,应该是问题所在吧。好吧,我2了谢谢
ilvsx
2014-11-01 00:21
对了,由于 Laravel 的 you have arrived 页面的 css 会加载 google font ,造成每次打开都要等上至少一分钟。
解决方法是,先下载Lato字体,然后找到 learnlaravel\app\views 目录下的 hello.php 文件修改:
- /*@import url(//fonts.googleapis.com/css?family=Lato:700);*/
+ /* latin-ext */
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 700;
  src: local('Lato Bold'), local('Lato-Bold'), url(http://fonts.gstatic.com/s/lato/v11/ObQr5XYcoH0WBoUxiaYK3_Y6323mHUZFJMgTvxaG2iE.woff2) format('woff2');
  unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 700;
  src: local('Lato Bold'), local('Lato-Bold'), url(http://fonts.gstatic.com/s/lato/v11/HdGTqbEHKKIUjL97iqGpTvY6323mHUZFJMgTvxaG2iE.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}

或者修改成其他字体。
既然是新手教程,这里也可以提一下。
JohnLui
2014-11-01 02:54
@ilvsx:这个页面没什么价值…会被直接弃用…感谢你的反馈。
wilson
2014-10-30 16:50
写得不错,清晰易懂。
ilvsx
2014-10-29 18:07
- 运行 composer update,之后在 ./app/config/app.config 中增加配置:
+  运行 composer update,之后在 ./app/config/app.config 中 'providers' => array 增加配置:

纯新手又不懂英文这步就跳不过去了。。。
Once this operation completes, the final step is to add the service provider. Open app/config/app.php, and add a new item to the providers array.
JohnLui
2014-10-29 18:23
@ilvsx:不明白你想表达什么。。。你可以去参考我在 Github 上的代码。
ilvsx
2014-10-29 21:34
@JohnLui:./app/config/app.php 中增加配置

鬼知道这个增加配置是怎么增加的啊?
你这是入门+教程,这样写算是入门+教程?
要不是去看https://github.com/JeffreyWay/Laravel-4-Generators 的安装步骤写清楚了"add a new item to the providers array.",真的新手入门冲着这个适合中国人的标题来看,能明白这一步的配置往哪增加?

还说向http://www.codeforest.net/laravel4-simple-website-with-backend-1 致敬,看看人家怎么写的:EDIT: Some people complained there’s not enough info on installing Sentry, so basicaly you need to add the service provider and the alias to your app/config/app.php file:

如果你的标题不是 入门+教程+最适合中国人,我不会说什么。
JohnLui
2014-10-29 22:41
@ilvsx:"入门教程" 并不是 “一步一步跟我做”,我在教程的某些地方刻意留下一些大大小小的任务,就是要让学习的人自己去尝试着解决问题,在解决问题的过程中感受 Laravel 做事的逻辑。很多人确实会卡在这一步,评论里面已经有几个人的反馈了。其实我想写清楚也很容易,大不了贴个我在 Github 上相应文件的链接,但是我不想这样干,想让大家在卡住之后自己仔细看下这个文件中的代码,或者想到去看我的代码,学习自己解决问题的能力。要不我的教程是没有价值的,一步一步跟我做完之后还是不会自己往下做,遇到问题了也不会自己解决。还是要感谢你的回复,也会给后来者以帮助。
ilvsx
2014-10-29 23:33
@JohnLui:这里对于新手来说属于一个新知识点,应该先讲清楚,后面遇到类似知识点再设置提问。

抱歉,前面我语气很冲,希望您能谅解。
okokok
2014-12-14 19:00
@JohnLui:我觉得你做的对。那些问题我都一个一个找着解决了。感觉这做法挺好。我喜欢解决问题的过程。有几个问题还是到github上的找创始人的文档看的。composer dump-autoload 的,有一个没更新。我是composer update才解决的。
JohnLui
2014-10-29 23:37
@ilvsx:
很菜
2014-10-24 22:37
php artisan generate:model article
php artisan generate:model page
php artisan generate:seed page
php artisan generate:seed article
运行错误,显示:
  [InvalidArgumentException]
  There are no commands defined in the "generate" namespace.
已经在composer.json中配置,如下
"require-dev": {
        "way/generators": "~2.0",
        "fzaninotto/faker": "1.5.*@dev"
    },
没有在app.php中写配置,不知道要不要,新手不是很懂。
John·Lui
2014-10-24 23:16
@很菜:要。
Yorian
2014-10-31 15:25
@John·Lui:已经在composer.json中配置,如下
"require-dev": {
        "way/generators": "~2.0",
        "fzaninotto/faker": "1.5.*@dev"
    },
没有在app.php中写配置,不知道要不要,新手不是很懂。

您@很菜:要。说的是在app.php中配置以下内容吗?
"require-dev": {
        "way/generators": "~2.0",
        "fzaninotto/faker": "1.5.*@dev"
    },
不解??
JohnLui
2014-10-31 15:47
@Yorian:按照下面一行说的做就行了:"运行 composer update,之后在 ./app/config/app.php 中增加配置:"
Yorian
2014-10-31 15:46
@John·Lui:应该是将'Way\Generators\GeneratorsServiceProvider'加入到到providers数组中,希望作者修正下,以免新手造成误导!
JohnLui
2014-10-31 15:59
@Yorian:加上我的配置文件的链接了,这个地方不好描述。看来确实对很多人造成了困扰
Yorian
2014-10-31 17:10
@JohnLui:嗯,是的.后来看到你的文件链接了谢谢!
Frewen
2014-10-22 16:05
最后一步 php artisan db:seed 的时候出错。
[PDOException]
SQLSTATE[HY000]: General error: 1364 Field 'image' doesn't have a default v
alue

原因分析是:
在***_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();
});

中    $table->string('image')->nullable(); 设置成了必填项导致。

解决方案我认为有两种:
1:    $table->string('image')->nullable(); 修改成——>    $table->string('image');
2:数据数组中列添加相应值
Article::create([
  'title'   => $faker->sentence($nbWords = 6),
  'slug'    => 'first-post',
  'body'    => $faker->paragraph($nbSentences = 5),
  'image'  =>'xxxxxxxxxxxxxxxxxxxxxxxx',
  'user_id' => 1,
]);
John·Lui
2014-10-22 16:19
@Frewen:->nullable() 的意思是 “非必须”。
初学者
2014-10-12 10:15
运行 composer update,之后在 ./app/config/app.config 中增加配置:

1
    
'Way\Generators\GeneratorsServiceProvider'


我始终找不到“app.config”这个文件
John·Lui
2014-10-12 13:03
@初学者:./app/config/app.php 手误。
初学者
2014-10-12 21:49
@初学者:多谢!
Laravel 4 系列入门教程(一)已经试着做完,很有帮助。
金龙
2014-10-07 22:14
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'title' in 'field list'
我的mysql中列表没有更新,请问是少了什么步骤吗?
John·Lui
2014-10-07 23:06
@金龙:自己按照教程来,一步都不能少。这个出错信息太少了,没法分析。错误的意思大概是数据库没有 migrate 成功表结构,就用 seed 往里面填充数据了。
helloqidi
2014-10-24 10:20
@金龙:遇到同样的问题,原因是 在 app/config/local下也有一个database.php,需要修改此处的数据库连接。
具体请查看官方文档:http://laravel.com/docs/4.2/configuration#environment-configuration
John·Lui
2014-10-24 12:37
@helloqidi:默认总是 production 环境,不经过配置是不会启用 local 文件夹的。
金龙
2014-10-07 21:06
请问在Autoloaded Service Providers怎么配置faker。填写的ServiceProvider是哪个
John·Lui
2014-10-07 23:05
@金龙:不用填写,faker是普通 Composer 包,不是Laravel插件,是直接用命名空间载入使用的。
Julian
2014-10-07 15:24
Faker\Factory的安装,配置文件貌似不是在require-dev里,而是require里,官方说明里有,不知道应该是到底选哪个,好像如果是dev的必须也要对应dev版,如果是fzaninotto选择1.4.0,还是放在require里。
John·Lui
2014-10-07 15:46
@Julian:require-dev 和软件版本没有任何关系,你理解有误。
require-dev 是 Composer 的配置项,意思是开发用插件,线上部署的时候不用。默认的 composer update 是包含 dev 的,所以其实现阶段象征意义大于现实意义。Laravel可能会在部署的时候根据环境变量选择自动加载包,以达到减小命名空间树的目的(猜测)。
Julian
2014-10-07 16:09
@John·Lui:配置的时候我选用的是1.4.0,最新版的是1.5.*@dev,我如果按照你的操作,放在require-dev里,update不成功,放在require里就可以了,如果只是区分开发跟部署的关系的话,不论他是否自动加载,感觉都应该会有区分,如果是在dev里配置能成的话,不知道我这里是哪里出了问题
John·Lui
2014-10-07 16:14
@Julian:不成功有什么提示?这个包没有任何对于Laravel的依赖,不能用好解释,安装不成功就很奇怪了。require 和 require-dev 只有 composer 设置里有区分,跟软件版本绝对没有任何关系。
Julian
2014-10-07 16:26
@John·Lui:反正挺奇怪的,估计是我哪里配置没弄对吧,慢慢研究中,谢谢你文章了,正好找教程找不到
newbie2005
2014-10-04 02:17
請問兩個文件的位置
*********************************
接下来,分别更改这两个文件:
Article::create([
  'title'   => $faker->sentence($nbWords = 6),
  'slug'    => 'first-post',
  'body'    => $faker->paragraph($nbSentences = 5),
  'user_id' => 1,
]);
Page::create([
  'title'   => $faker->sentence($nbWords = 6),
  'slug'    => 'first-page',
  'body'    => $faker->paragraph($nbSentences = 5),
  'user_id' => 1,
]);
John·Lui
2014-10-04 11:47
@newbie2005:看上文:
这时,在 ./app/database/seeds/ 下就出现了两个新的文件,这就是我们的数据库填充文件。Laravel提供自动数据库填充,十分方便。
新学者
2014-11-13 15:46
@John·Lui:我在填充的是后出现了问题,告诉我有一个类未调用,怎么办啊(PHP Fatal error:  Class 'Faker\Factory' not found in D:\web1\apache\htdocs\learn
laravel\app\database\seeds\ArticleTableSeeder.php on line 10
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","me
ssage":"Class 'Faker\\Factory' not found","file":"D:\\web1\\apache\\htdocs\\lear
nlaravel\\app\\database\\seeds\\ArticleTableSeeder.php","line":10}}
Jacob
2014-11-14 12:40
@新学者:1.在composer.json中require-dev下粘贴下面的内容
"fzaninotto/faker": "1.5.*@dev"

2.更新包
终端运行composer update

发表评论:

© 2011-2020 岁寒  |  Powered by Emlog