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 权限,设置好权限即可看见页面如下图:

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
2014.9.29   /   热度:147945   /   分类: Laravel

评论:

zhangkz
2016-03-25 10:37
php artisan migrate:make create_articles_table --create=articles
php artisan migrate:make create_pages_table --create=pages
这两句有错误,不应该是migrate:make,而是make:migrate
JohnLui
2016-03-25 10:42
@zhangkz:4 时代大家还是用的 way 的 generator 插件,这个功能是在 5 才集成到 artisan 里的。
相思人
2015-12-16 20:23
大哥,你的laravel教程 我看了,很不错,我有一个问题:
1,你用的symfony  调试不是默认的laravel调试吧,你怎么配置的呢?
码农一枚
2015-10-01 20:46
请问:搭建成功,但是每当提交注册的时候就会提示“Method [validator] does not exist.”  这是什么原因?
warnerwu
2017-02-10 18:22
@码农一枚:方法过滤不存在
小刘
2015-08-18 17:03
老师啊,出个用项目串讲的laravel5视频吧!!!
guoer
2015-06-17 13:56
第一次就被安装的步骤吓到了啊
秋风888
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,
]);
JohnLui
2015-06-11 21:02
@秋风888:可能吧,但是建议去学 5 哦~
php初学者~
2015-09-10 12:13
@JohnLui:在一家公司想套用该框架,可惜php版本不高,最多只能用版本4,应该也没什么问题吧
JohnLui
2015-09-10 13:03
@php初学者~:有问题,完全跑不起来的。。。
page
2015-05-16 13:49
666666,文章写的很好,赞
长青
2015-04-28 14:45
这个Faker\Factory或者fzaninotto/faker怎么安装?这个问题搞了我一个星期了,很急,很重要,我们就要用laravel做项目的

我是在github下载了 faker 的安装包解压到 vendor 目录下,然后又在 app\config\app.php 文件的 'providers' 数组中添加了 'Fzaninotto\Faker\FakerServiceProvider'。就是不行,一直报错“ymfony \ Component \ Debug \ Exception \ FatalErrorException (E_UNKNOWN)

Class 'Fzaninotto\Faker\FakerServiceProvider' not found ” ;求详细安装教程!
JohnLui
2015-04-28 15:21
@长青:Faker 可能需要老版本才支持 Laravel 4 了,推荐直接用 5。
cstabor
2015-04-20 23:23
Installing laravel/laravel (v4.2.11)
  - 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

安装总是提示这个错误。
JohnLui
2015-04-28 15:21
@cstabor:建议用 5 。
徒步远行
2015-04-10 18:16
Warning: require(/webserver/program/laravel/bootstrap/../vendor/autoload.php): failed to open stream: No such file or directory in /webserver/program/laravel/bootstrap/autoload.php on line 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 目录
JohnLui
2015-04-10 18:43
@徒步远行:这是因为没有执行 composer dump-autoload 的原因
TIM
2015-03-27 14:24
laravel 5
执行了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来执行,
JohnLui
2015-03-27 15:24
@TIM: 没搞过
MoGoethe
2015-03-26 17:34
Administrator@USER-20150318JG /c/wamp/www/learnlaravel (master)
$ 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遍了
JohnLui
2015-03-26 17:49
@MoGoethe:去看 5 的教程吧。。。很多第三方包已经更新了,默认只支持 5 了。
Bpio
2015-03-02 23:12
老师,老师,给出个5.0的教程吧!5.0变化有些大啊!
artisan好多命令都变了!目录结构也变了!
zone
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 有教程吗!!
baren
2015-02-25 03:37
D:\Apache2.2\htdocs\laravel>php artisan db:seed
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>

老师:如上所示错误该怎么处理,拜谢
baren
2015-02-26 19:16
@baren:明明安装了Faker却还是不行
果大王
2015-02-14 23:24
惭愧惭愧   望上个评论不要通过审核了  感谢你的教程  祝愿新年技术更上一层楼
wusp
2015-02-11 10:42
老师你好,在使用您推荐的composer全量中国镜像的composer.json文件,并执行install之后,我碰到了这个问题:

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

请问这个问题是如何引发的,该如何解决呢?
谢谢!
JohnLui
2015-02-11 12:55
@wusp:中国镜像会暂时抽疯。稳妥的解决办法是开 VPN 直连国外服务器。
后面一个问题是因为没有 composer update 安装依赖包导致的,在这个状态下,网站跑不起来。
ok
2015-02-10 15:15
Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException 这是为啥·?
JohnLui
2015-02-10 15:38
@ok:路由匹配失败,404 的意思。
沐风待雨
2015-02-10 10:36
Generating autoload files
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"
    }
}
JohnLui
2015-02-10 11:41
@沐风待雨:sentry 2 不支持 Laravel 5。
沐风待雨
2015-02-10 21:59
@JohnLui:那怎么整呢,"cartalyst/sentry": "2.1.4" ,你sh4o的sentry 2 是指的这个吗?那这里应该用sentry 那个版本?
JohnLui
2015-02-11 12:56
@沐风待雨:Sentry 3 是收费的
沐风待雨
2015-02-23 01:32
@JohnLui:。。。。汗
penkku
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,如法炮制一下就好了。

发表评论:

© 2011-2017 岁寒  |  Powered by Emlog