今天有时间打算学习一下Laravel。下面是一些简单的学习记录,希望对各位也有帮助。
基础设置
1.安装composer
之前就想抽时间学习Laravel,不过觉得安装有点复杂,我想很多人都有过这种想法。这里给大家推荐一个composer的中国镜像,速度真的不错。
安装Composer前确认你已经正确安装了PHP,打开控制台(Mac)执行php -v
查看是否输出正确的版本号。
打开控制台并执行以下命令安装最新版的Composer:
//下载安装脚本composer-setup.php到当前目录
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
//执行安装过程
php composer-setup.php
//删除安装脚本
php -r "unlink('composer-setup.php');"
Composer的安装分局部安装和全局安装,这里只介绍局部安装。执行完上述命令后将会得到composer.phar
文件,将其复制到任意目录(比如项目的根目录下),然后执行php composer.phar
即可使用Composer了。
不要忘记要经常执行php composer.phar selfupdate
保持 Composer 一直是最新版本
2.Composer用法
实际上有两种方式启用本镜像服务:
* 系统全局配置:将配饰信息添加到Composer的全局配置文件config.json
。
* 单个项目配置:将配置信息添加到某个项目的composer.josn
文件中。
下面为大家介绍修改当前项目composer.json
配置文件(请原谅我比较懒,全局配置其实也不复杂):
打开控制台(Mac)并执行以下命令(确认你的composer.phar
已经复制到位):
php composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com
3.安装Laravel
镜像配置完,在终端离切换到你想放置改网站的目录下,运行以下命令:
composer create-project laravel/laravel learnlaravel5
稍等片刻,目录下会出现一个叫learnlaravel5的文件夹,这样就完成安装了。
4.运行
这里我才用PHP内置的web服务器来驱动站点,运行以下命令:
cd learnlaravel5/public
php -S 0.0.0.0:2024
这时候访问http://127.0.0.1:2024
就是这个样子的:
当然也可以使用Apache或者Nginx来驱动Laravel,这次就不在这里介绍了,有兴趣的朋友可以自己研究。
Auth系统
Laravel内置了非常完善的简单用户登录注册功能,适合一些需求不复杂的用户权限管理系统。这里其实涉及到trait这个PHP5.4+的新特性。
执行以下命令,激活这个功能:
php artisan make:auth
访问http://127.0.0.1:2014/login
,会看见如下页面:
连接数据库
接下来需要连接数据库,请自行准备好MySQL服务。
learnlaravel5目录下已经有一个.env
文件,如果没有,可以复制一份.env.example
文件重命名为.env
,然后修改下面几行:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5
DB_USERNAME=root
DB_PASSWORD=password
建议新建一个名为laravel5
数据库,并且使用root账户直接操作,简单快捷。
配置完数据库后,在登录界面填写任意邮箱和密码,点击Login,这时候会报错,单不用担心,因为我们确实没有创建users
表,下面让我们见识一下Laravel的另一个特性。
数据迁移
执行以下命令:
php artisan migrate
会出现以下提示信息:
说明数据迁移成功,现在在此访问http://127.0.0.1:2024/home
注册一个用户并完成登录。
其实migrate
就是PHP描述数据库构造,并且使用命令行一次性部署所有数据库结构。你可以在learnlaravel5/database/migrations
目录下找到上面截图的文件,一打开就知道它在干什么了。
ORM->Eloquent
Eloquent是Laravel中最强大的地方,但也是它最慢的地方,目前还是没能彻底解决。
下面我们使用Artisan工具新建Model类以及其附属的Migration和Seeder类。
运行以下命令:
php artisan make:model Article
执行成功后在app目录会生成一个Article.php的文件,这就是Artisan自动生成的Model文件:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
}
使用Migration和Seeder
下面是用Artisan生成这个Model对应的Migration和Seeder:
php artisan make:migration create_article_table
成功会在learnlaravel5/database/migrations
生成名为*_create_artisan_table的文件,接下来我们修改up
函数:
public function up()
{
//
Schema::create('articles', function(Blueprint $table)
{
$table->increments('id');
$table->string('title');
$table->text('body')->nullable();
$table->integer('user_id');
$table->timestamps();
});
}
这几行代码是Article对应的数据库表要创建的表的结构,下面我们来执行命令,让它变为MySQL中真实的数据表:
php artisan migrate
下面是用Artisan生成Seeder,Seeder主要解决在开发Web应用是手动向数据库插入数据这样的繁琐工作,同字面意思播种机还是挺配的。
php artisan make:seeder ArticleSeeder
然后在learnlaravel5/database/seeds
里面多了一个ArticleSeeder.php
文件,现在我们修改run函数:
public function run()
{
//
DB::table('articles')->delete();
for ($i=0; $i < 10; $i++) {
\App\Article::create([
'title' => 'Title '.$i,
'body' => 'Body '.$i,
'user_id' => 1,
]);
}
}
接下来需要把ArticleSeeder注册到系统内,修改learnlaravel5/database/seeds/DatabaseSeeder.php
中的run函数:
public function run()
{
// $this->call(UsersTableSeeder::class);
$this->call(ArticleSeeder::class);
}
由于database目录没有像app目录那样被composer注册为psr-4自动加载,采用的是psr-0 classmap 方式,所以我们还需要运行以下命令把ArticleSeeder.php
加入自动加载系统,避免找不到类的错误:
composer dump-autoload
然后执行seed
php artisan db:seed
Laravel的MVC架构
路由是很多有PHP框架的核心,路由承载的是URL代码片段的映射。Laravel路由中文文档。
Laravel 5 的路由在app/Http/routes.php
这个位置,打开这个文件:
Route::get('/', function () {
return view('welcome');
});
Route::auth();
Route::get('/home', 'HomeController@index');
中间的Route:auth()
就是Auth系统注入的路有配置。
基础陆游解释
上述代码中的前三行是闭包路由:
Route::get('/', function () {
return view('welcome');
});
闭包路由是用闭包作为此条请求的响应代码,灵活方便,很多简单的操作可以直接在闭包里面解决。现在我们来实现输入当前服务器时间:
Route::get('now', function(){
return date("Y-m-d H:i:s");
});
框架默认设置是UTF时间,这里修改为北京时间,在earnlaravel5/config/app.php
第55行处把timezone设置为上海:
'timezone' => 'Asia/Shanghai',
然后访问http://127.0.0.1:2024/now
可以得出如下结果:
闭包路由虽然灵活性高,不过大多数场景下我们还是需要回归到MVC架构下:
Route::get('/home', 'HomeController@index');
这样代码的意思不能懂,就是当GET方法访问http://127.0.0.1:2024/home
的时候就调用HomeController控制器中的inde方法。同理你可以修改为Route::post('/home', 'HomeController@index');
,用POST来响应请求。
细心的你也许已经发现,这里才用的是控制器@方法
的形式。Laravel 的路由跟所有 PHP 框架的路由一样,都是用的最简单直接的 PHP 方式来调用控制器中的方法的:使用字符串初始化类得到对象,调用对象的指定方法,返回结果。下面简单介绍一下 Laravel 路由调用过程。
定为到learnlaravel5/app/Providers/RouteServiceProvider.php
文件最后的mapWebRoutes
方法,给所有路由统一加进了一个路由组,定义了一个命名空间和一个中间件:
protected function mapWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/routes.php');
});
}
往上看,你会发现命令空间的定义地方:
protected $namespace = 'App\Http\Controllers';
那么命名空间、类、方法是如何传递的?
现在让我们定为到learnlaravel5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
的dispatch
方法,在return
前增加一行var_dump($controller);
:
public function dispatch(Route $route, Request $request, $controller, $method)
{
$instance = $this->makeController($controller);
var_dump($controller);
return $this->callWithinStack($instance, $route, $request, $method);
}
这样可以清晰看见加载情况了。
记住最后注释掉添加的var_dump($controller);
Laravel使用了完整的面向对象程序架构,对控制器的调用进行了超多层封装,所以最简单的探测方式就是手动抛出错误,这样就会完整地显示调用栈的情况。
现在让我们回到HomeController的index方法里,在return之前增加一行throw new \Exception('到此一游', 1);
,然后执行一下登录操作:
留意上图第三行,这里就是驱动了HomeController。