Justin's Words

Laravel 初上手

Laravel 初上手 11-07-2014

起步

路由

app/routes.php

1
2
3
4
Route::get('users', function()
{
return 'Users!';
});

访问 /users 将会看到 Users!

1
2
3
4
Route::get('/', function()
{
return View::make('hello');
});

访问 / 将会从 app/views/ 中找到 hello.blade.php 进行渲染。 路由也可以指向一个控制器类和动作方法:

1
Route::get('users', 'UserController@getIndex');

访问 /user 将会使用 UserController 类的 getIndex 方法

建立视图

视图之间的引用, 引用: users.blade.php

1
2
3
4
5
6
7
8
<!-- layout.blade.php -->
<html>
<body>
<h1>Laravel Quickstart</h1>

@yield('content')
</body>
</html>

layout.blade.php

1
2
3
4
5
6
<!-- users.blade.php -->
@extends('layout')

@section('content')
Users!
@stop

app/routes.php

1
2
3
4
Route::get('users', function()
{
return View::make('users');
});

访问 /users 生成的页面:

1
2
3
4
5
6
7
<html>
<body>
<h1>Laravel QuickStart</h1>

Users!
</body>
</html>

建立迁移文件

首先在app/config/database.php配置数据库连接信息,之后创建迁移文件:

1
php artisan migrage:make create_users_table

生成对应的迁移文件包含 updown 类在 app/database/migrations,在 up 方法写上对数据表做的更动,在 down 方法写上对应的回滚代码。 迁移文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function up()
{
// 生成 users 表,列为:id(increment), email(unique), name, timestamps(timestamp)
Schema::create('users', function($table)
{
$table->increments('id');
$table->string('email')->unique();
$table->string('name');
$table->timestamps();
});
}

public function down()
{
Schema::drop('users');
}

执行 migrate 命令来执行迁移动作:

1
php artisan margrate

将会生成两个表:migrationsusers。 执行回滚迁移:

1
php artisan migrate:rollback

Eloquent ORM

定义一个 Eloquent 模型用来查询关联的数据库表在 app/models,以下是一个 User.php

1
2
3
class User extends Eloquent {
protected $table = 'users';
}

不指定表时默认关联类名称的小写复数形态的数据库表也就是 users,不希望自动更新 update_atcreated_at 可以按下面处理:

1
protected $timestamps = false;

取出所有模型数据:

1
$users = User::all();

根据主键取出一条数据:

1
2
$user = User::find(1);
var_dump($user->name);

根据主键取出一条数据或抛出异常,让 App::error 处理并显示 404:

1
2
$model = User::findOrFail(1);
$model = User::where('votes', '>', 100)->firstOrFail();

注册异常处理,通过监听 ModelNotFoundException

1
2
3
4
5
6
use Illuminate\Database\Eloquent\ModelNotFoundException;

App::error(function(ModelNotFoundException $e)
{
return Response::make('Not Found', 404);
});

Eloquent 模型结合查询语法:

1
2
3
4
5
6
$users = User::where('votes', '>', 100)->take(10)->get();

foreach ($users as $user)
{
var_dump($user->name);
}

Eloquent 聚合查询:

1
$count = User::where('votes', '>', 100)->count();

显示数据

rootes.php 部署 with 方法:

1
2
3
4
5
Route::get('users', function()
{
$users = User::all();
return View::make('users')->with('users', $users);
});

users.blade.php

1
2
3
4
5
6
7
@extends('layout')

@section('content')
@foreach($users as $user)
<p>{ { $user->name }}</p>
@endforeach
@stop

Blade 使用两个大括号来输出数据,AngularJS 也是如此。

配置

引言

访问一个配置的值:

1
Config::get('app.timezone');

指定一个默认值不存在则返回:

1
$timezone = Config::get('app.timezone', 'UTC');

设置一个配置:

1
Config::set('database.default`, `sqlite`);

环境配置

app/config/local/ 可以创建与 app/config/ 下同名的配置文件对其进行覆盖,不过不能使用 testing 作为环境名称,这是为单元测试预留的。

访问当前应用环境

bootstrap/start.php

1
$enviroment = App::enviroment();

检查环境:

1
2
3
4
5
6
7
8
if (App::environment('local'))
{
// 当前为 local 运行环境
}
if (App::environment('local', 'staging'))
{
// 当前为 local 或 staging 运行环境
}

维护模式

维护方法 App::down 位于 app/start/global.php,启用:

1
php artisan down

禁用维护模式:

1
php artisan up

维护模式显示自定义视图,在 app/start/global.php 添加:

1
2
3
4
App::down(function()
{
return Response::view('maintenance', array(), 503);
});

请求的生命周期

发送给应用程序的所有请求都经由 public/index.php 脚本处理。如果是用的是 Apache 服务器,Larave 中包含的 .htaccess 文件将对所有请求进行处理并传递给 index.php。这是 Laravel 从接受客户端请求到返回响应给客户端的整个过程的开始。

  1. 请求进入 public/index.php 文件。
  2. bootstrap/start.php 文件创建应用程序对象并检测环境。
  3. 内部的 framework/start.php 文件配置相关设置并加载服务提供器。
  4. 加载应用程序 app/start 目录下的文件。
  5. 加载应用程序的 app/routes.php 文件。
  6. 将 Request 对象发送给应用程序对象,应用程序返回一个 Response 对象。
  7. 将 Response 对象发回客户端。

启动文件

启动文件被存放在 app/start 目录中,默认情况下内有 global.phplocal.phpartisan.php 三个文件。

路由

基本路由

基本 GET 路由

1
2
3
4
Route::get('/', function()
{
return 'Hello world';
});

基本 POST 路由

1
2
Route::post('foo/bar', function()
{ return 'Hello world'; });

为多个动作注册同一个路由:

1
2
Route::match(array('GET', 'POST'), '/', function()
{ return 'Hello World'; });

注册一个可以响应任何 HTTP 动作的路由:

1
2
Route:any('foo', function()
{ return 'Hello World'; });

仅支持 HTTPS 的路由:

1
2
Route:get('foo', array('https', function()
{ return 'Must be over HTTPS'; }));

实际开发中需要根据路由生成 URL,URL::to 方法可以满足此需求:

1
$url = URL::to('foo');

路由参数

1
2
3
4
Route::get('user/{id}', function($id)
{
return 'User '.$id;
});