Laravel 4 系列入门教程(一)【最适合中国人的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 权限,设置好权限即可看见页面如下图:
恭喜你~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 系列入门教程(二)
评论:
2015-06-11 18:32
只是文中下面这段代码,是不是粘贴重复了,和数据表结构对应不上啊。
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,
]);
2015-04-28 14:45
我是在github下载了 faker 的安装包解压到 vendor 目录下,然后又在 app\config\app.php 文件的 'providers' 数组中添加了 'Fzaninotto\Faker\FakerServiceProvider'。就是不行,一直报错“ymfony \ Component \ Debug \ Exception \ FatalErrorException (E_UNKNOWN)
Class 'Fzaninotto\Faker\FakerServiceProvider' not found ” ;求详细安装教程!


2015-04-20 23:23
- Installing laravel/laravel (v4.2.11)
Downloading: 100%
Failed to download laravel/laravel from dist: RecursiveDirectoryIterator::__construct(learnlaravel/): failed to open dir: No such file or directory
Now trying to download from source
安装总是提示这个错误。
2015-04-10 18:16
Fatal error: require(): Failed opening required '/webserver/program/laravel/bootstrap/../vendor/autoload.php' (include_path='.:/usr/share/php:/usr/share/pear') in /webserver/program/laravel/bootstrap/autoload.php on line 16
安装了没有vendor 目录
2015-03-27 14:24
执行了php artisan mak:console FindUser
然后也写好了
<?php namespace Yoyo\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
class UserFind extends Command {
protected $name = 'user:find';
protected $description = 'user:find';
public function __construct()
{
parent::__construct();
}
public function fire()
{
$this->line('hello world');
}
protected function getArguments()
{
return [
//['example', InputArgument::REQUIRED, 'An example argument.'],
];
}
protected function getOptions()
{
return [
//['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
];
}
}
怎么将他添加到php artisan user:find来执行,
2015-03-26 17:34
$ php artisan migrate --package=cartalyst/sentry
**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? yes
[PDOException]
SQLSTATE[HY000] [2002] 目芫薹印
migrate [--bench[="..."]] [--database[="..."]] [--force] [--path[="..."]] [--pac
kage[="..."]] [--pretend] [--seed]
老师您好,如果wamp处于关闭状态只要执行 : $ php artisan migrate --package=cartalyst/sentry 这个命令就会出现上面这个问题,
如果 打开 wamp 那就会出现:
$ php artisan migrate --package=cartalyst/sentry
**************************************
* Application In Production! *
**************************************
Do you really wish to run this command? yes
[PDOException]
SQLSTATE[HY000] [1049] Base 'laravel' inconnue
migrate [--bench[="..."]] [--database[="..."]] [--force] [--path[="..."]] [--pac
kage[="..."]] [--pretend] [--seed]
这个问题,请问是怎么回事啊?我已经配置了N遍了




2015-03-02 08:16
composer create-project laravel/laravel blog 4.2.11
老是出现这个异常呢,
[Symfony\Component\Process\Exception\RuntimeException]
The process has been signaled with signal "11".
还有,laravel 5 有教程吗!!
2015-02-25 03:37
PHP Fatal error: Class 'Fzaninotto\Faker\FakerServiceprovider' n
Apache2.2\htdocs\laravel\bootstrap\compiled.php on line 4481
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErro
ssage":"Class 'Fzaninotto\\Faker\\FakerServiceprovider' not found
pache2.2\\htdocs\\laravel\\bootstrap\\compiled.php","line":4481}}
D:\Apache2.2\htdocs\laravel>
老师:如上所示错误该怎么处理,拜谢
2015-02-11 10:42
wuspdeMacBook-Air:laravel-master wusp$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
[Composer\Downloader\TransportException]
The "http://pkg.phpcomposer.com/repo/packagist/p/illuminate/pagination.json
" file could not be downloaded: php_network_getaddresses: getaddrinfo faile
d: nodename nor servname provided, or not known
failed to open stream: php_network_getaddresses: getaddrinfo failed: nodena
me nor servname provided, or not known
同时在命令行使用 php artisan serve命令时出现以下反馈:
wuspdeMacBook-Air:laravel-master wusp$ php artisan
Warning: require(/Applications/Web/laravel-master/bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in /Applications/Web/laravel-master/bootstrap/autoload.php on line 17
Fatal error: require(): Failed opening required '/Applications/Web/laravel-master/bootstrap/../vendor/autoload.php' (include_path='.:') in /Applications/Web/laravel-master/bootstrap/autoload.php on line 17
请问这个问题是如何引发的,该如何解决呢?
谢谢!
2015-02-10 10:36
exception "BadMethodCallException" with message "Call to undefined method [package]" in D:\wamp\www\laravel\storage\framework\compiled.php 4346
在composer update 或者 php artisan 后会提示这个错误。我用的是laravel 5
composer.json 文件如下
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"laravel/framework": "5.0.*",
"cartalyst/sentry": "2.1.4"
},
"require-dev": {
"way/generators": "~3.0",
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1"
},
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php -r \"copy('.env.example', '.env');\"",
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
}
}
2015-01-29 16:07
总结一下,从安装到现在,遇到了几处难点:
1,安装第一步,“切换到你想要放置该网站的目录下”
一开始不知道网站根目录指的是哪里,还以为是public目录,百度上问也没人回答,google外国网站,才得知是app的父目录,这个难点差点把我挡在laravel门外。如果教程中写明网站的目录就是app的父目录就好了。
2,"require": {
"laravel/framework": "4.2.*",
"cartalyst/sentry": "2.1.4"
},
4.2.*原封不动就这样写。不要写成4.2.11之类的。
3,composer.json就在learnlaravel根目录下。我一开始用的是/learnlaravel/vendor/laravel/framework/src/Illuminate/Support/composer.json,导致安装Sentry等插件失败。
4,View [admin._partials.assets] not found.
不知道admin._partials.assets放在哪个目录下,看评论才知是在\app\views\admin\_partials目录下添加assets.blade.php这个文件,刷新后提示找不到admin._partials.navigation,如法炮制一下就好了。
2016-03-25 10:37
php artisan migrate:make create_pages_table --create=pages
这两句有错误,不应该是migrate:make,而是make:migrate