@artman328
2015-06-16T02:03:11.000000Z
字数 14561
阅读 1175
php
laravel
前提条件:
系统中有 PHP 5.4+
1. 按照官方指南安装;
2. 到 https://github.com/overtrue/latest-laravel 下载 laravel-master.tar.gz,解压。
d:
cd \proj\laravel
php artisan serve
如果命令行有输出:
Laravel development server started on http://localhost:8000/
然后打开浏览器,输入网址:http://localhost:8000/,能够看到输出页面,说明安装成功。
建立模型 -> 确定路由 -> 编写控制器和响应函数(使用模型) -> 编写视图
1)建立数据库迁移文件
2)执行迁移建表
3)建立对应的模型
路由文件: app/Http/routes.php
Route::请求命令(url,匿名响应函数 或 控制器@响应函数);
请求命令:get, post, put, delete ...
如:
Route::get("students","StudentController@list");
Route::get("something",function(){
return "<h1>您请求了 something.</h1>";
});
在项目文件夹中执行:
php artisan make:controller 控制器名称 [--plain]
可选参数 --plain 要求不要生成任何函数。
控制器将会被生成在: app/Http/Controllers/控制器名称.php
在其中编写函数以响应请求。
如果在某控制器的一个响应函数里,有:
return view("something");
那就要有一个 resources/views/something.blade.php 的视图文件相对应。
如果上面是 "myview.something", 则对应文件是:resources/views/myview/something.blade.php,以便组织视图。
将 Laravel 框架完整压缩包解压到某处,将 laravel 文件夹更名为你选择的名称,这个文件夹就是你的项目文件夹。
0、修改应用程序命名空间(默认是App)。在命令行(切换到项目文件夹下)执行:
php artisan app:name Song
1、修改 config/database.php 文件,将其中的:
'default' => 'mysql';
改为:
'default' => 'sqlite';
根据配置文件内容:
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path().'/database.sqlite',
'prefix' => '',
],
可以看出,mysqlite 的数据库文件是在 storage 文件夹中,名为 database.sqlite。 我们当然可以更改其名字,在此我们不做更改。
2、在 storage 文件夹中建立一个空文件,名为:database.sqlite。
3、建立数据迁移文件,计划建立存储歌曲的表。进入命令窗口,切换到项目所在文件夹,执行以下命令:
php artisan make:migration create_songs_table --create songs
命令执行后,会在 database/migrations 文件夹下生成一个包含 create_songs_table 的 php 文件。这是建立歌曲表的迁移文件(相当于建表计划)。
4、根据需要,修改迁移文件中建表的内容为:
$table->increments('id');
$table->string('name');
$table->string('slug')->unique();
$table->string('lyrics');
//$table->timestamps(); 本行注释掉了
5、执行以上迁移。在命令行执行:
php artisan migrate
成功执行后,数据库中就建立了一个叫做 songs 的表。
6、插入实验数据。在命令行执行:
php artisan tinker
进入一个交互环境,在这个环境中,Laravel 框架的注册服务都可以使用,如 DB 等。
>>>DB::table('songs')->get()
[]
>>>
以上输出说明 songs 表已经存在,只不过尚未有数据。
>>>DB::table('songs')->insert(['name'=>'Hello','slug'=>'hello','lyrics'=>'Hello Lyrics'])
true
>>>
以上就插入了一条记录。你可以根据需要多插入几条记录。
用 exit 或按 CTRL+C 退出交互界面。
7、编写路由。我们希望用 http://127.0.0.1:8000/songs 这个网址看到歌曲列表。找到 app/Http/routes.php 文件,加入以下一行:
Route::get('songs','SongController@index');
保存。
8、回到命令行,执行以下语句:
php artisan make:controller SongController
命令成功执行后,会生成一个控制器文件: app/Http/Controllers/SongController.php,打开它,你会发现它自动生成了许多函数,包括 index() 。
9、在 index() 函数中,加入以下语句:
$songs = DB::table('songs')->get();
//以上这句需要在这个文件的顶部加入: use DB; 否则出错
return view('songs.songlist',['songlist'=>$songs]);
10、编写视图
视图文件的默认文件夹在: resources/views 里,但根据第9条,我们的视图是 "songs.songlist", 那么,我们的视图应该是:
resources/views/songs/songlist.blade.php
因此,你要在 resources/views 下建立一个叫做 songs 的文件夹,再在其中建立一个叫做 songlist.blade.php 的文件。在这个文件中,写入以下 HTML 内容:
<h1>我喜爱的歌</h1>
<ul>
@foreach($songlist as $song)
<li><a href="songs/{{ $song->slug }}">{{ $song->name }}</a></li>
@endforeach
</ul>
11、将以上所有文件保存后,在命令行输入:
php artisan serve
然后打开浏览器,在地址栏输入:
http://127.0.0.1:8000/songs
你应该能在浏览器里看到你的歌名列表,否则,请仔细检查以上步骤错误的地方。
12、下面我们来处理以上列表的链接,用于查看每首歌的详情。注意以上列表中每首歌的链接形式为:
http://127.0.0.1:8000/songs/歌曲的slug
因此,在 app/Http/routes.php 中,加入以下路由:
Route::get('songs/{slug}','SongController@show');
13、在控制器文件 app/Http/Controllers/SongController.php 的 show($slug) *函数体中,加入以下语句:
*原来参数是
$song = DB::table('songs')->where('slug',$slug)->first();
return view('songs.song')->with('thesong',$song);
14、在 resources/views/songs/ 文件夹下建立名为 song.blade.php 的文件,加入以下内容:
<h2>{{ $thesong->name }}</h2>
@if($thesong->lyrics)
<article>
{{ $thesong->lyrics }}
</article>
@endif
15、以上文件保存后,请进入:
http://127.0.0.1:8000/songs
然后点击歌曲名的链接,你应该能够看到每首歌的歌名和歌词(如果有歌词的话)。
16、下面我们来实现删除一首歌的功能。把 resources/views/songs/songlist.blade.php 内容改为:
<h1>我喜爱的歌</h1>
<ul>
@foreach($songlist as $song)
<li><a href="songs/{{ $song->slug }}">{{ $song->name }}</a> <a href="/songs/delete/{{ $song->slug }}">删除</a></li>
@endforeach
</ul>
这样,删除一首歌的链接就是:
http://127.0.0.1/songs/delete/歌曲的slug
17、在 app/Http/routes.php 中,加入以下路由:
Route::get('songs/delete/{slug}','SongController@destroy');
18、打开 app/Http/Controllers/SongController.php, 将函数 destroy($id)
改成 destroy($slug)
,然后再函数体中加入:
$song = DB::table('songs')->where('slug',$slug)->first();
if($song){
DB::delete("delete from songs where slug='$slug'");
}
return Redirect::to('songs');//此句要求在文件顶部加入: use Redirect;
19、歌曲删除完后,你不得不到 tinker 界面再次添加记录。但我们可以使用 Laravel 提供的 seed 机制为数据库提供大量样本数据。请到项目文件夹的命令行界面,执行以下命令:
composer require fzaninotto/Faker --dev
安装 Faker 的目的是为我们产生一些样本数据。
20、在 database/seeds 文件夹下建立一个叫做 SongTableSeeder.php 的文件,输入以下内容:
<?php
use Illuminate\Database\Seeder;
class SongTableSeeder extends Seeder {
public function run()
{
$faker = Faker\Factory::create('zh_CN');//创建一个伪造器
//伪造器使用请参照:https://github.com/fzaninotto/Faker
DB::table('songs')->delete(); //删除原有数据
for($i=0;$i<20;$i++){
DB::table('songs')->insert(
[
'name'=>$faker->sentence,
'slug'=>$faker->slug,
'lyrics'=>$faker->text
]
);
}
}
}
21、修改 database/seeds/DatabaseSeeder.php 文件,在其 run() 函数的最后一行输入:
$this->call('SongTableSeeder');
22、为了让 Laravel 知道我们新建了一个类 SongTableSeeder , 在命令行执行一次:
composer dumpautoload -o
23、在命令行执行:
php artisan db:seed
如果看到 Seeded SongTableSeeder
提示,说明数据库里已经有了20条样本数据。
24、接着,我们来设计“添加歌曲”功能。首先,打开 resources/views/songs/songlist.blade.php 文件,在
<a href="/songs/addnew">添加歌曲</a>
25、在 app/Http/routes.php 中,加入以下内容:
Route::get("songs/addnew", "SongController@addnew");
请把此行放到 "songs/{slug}" 路由之前。
26、在 app/Http/Controllers/SongController.php 中,写一个 addnew() 函数,在其中加入以下内容:
return view('songs.new');
27、创建 resources/views/songs/new.blade.php 文件, 在其中加入以下内容:
{!! Form::open() !!}
{!! Form::text('name','',['class'=>'myclass','placeholder'=>'请输入歌名']) !!}
<!--
以上将生成以下输出:
<input type="text" name="name" class="myclass" placeholder="请输入歌名"/>
你也可以直接写成此句。
-->
<br/>
{!! Form::text('slug','',['placeholder'=>'请输入链接记号'])!!}
<br/>
{!! Form::textarea('lyrics','','placeholder'=>'请输入歌词'])!!}
<br/>
{!! Form::submit("保存")!!}
{!! Form::reset("重置")!!}
{!! Form:close() !!}
28、在 app/Http/routs.php 中,加入以下语句:
Route::post("songs/addnew","SongController@savenew");
29、在 app/Http/Controllers/SongController.php 中,添加以下函数:
public function savenew(Request $r){
$name = $r->input('name');
$slug = $r->input('slug');
$lyrics = $r->input('lyrics');
DB::table('songs')->insert(['name'=>$name,'slug'=>$slug,'lyrics'=>$lyrics]);
Redirect::to("songs");
}
到此为止,我们已经实现了添加新歌曲的功能。
30、下面我们来实现修改歌曲信息。在 app/Http/routes.php 中,添加以下路由:
Route::get("songs/{slug}/modify","SongController@modify");
31、在 app/Http/Controllers/SongController.php 中,添加以下函数:
public function modify($slug){
$song = DB::table('songs')->where('slug',$slug)->first();
return view('songs.modify')->with('song',$song);
}
32、在 resources/views/songs 下,建立 modify.blade.php 文件,输入以下内容:
{!! Form::open() !!}
{!! Form::text('name',$song->name,['class'=>'myclass','placeholder'=>'请输入歌名']) !!}
<br/>
{!! Form::text('slug',$song->slug,['placeholder'=>'请输入链接记号'])!!}
<br/>
{!! Form::textarea('lyrics',$song->lyrics,'placeholder'=>'请输入歌词'])!!}
<br/>
{!! Form::submit("保存")!!}
{!! Form::reset("重置")!!}
{!! Form:close() !!}
33、在 app/Http/routes.php 中,添加以下路由:
Route::post("songs/{slug}/modify","SongController@savemodify");
34、在 app/Controllers/SongController.php 中,添加以下函数:
public function savemodify($slug,Request $r){
$name = $r->input('name');
$slug = $r->input('slug');
$lyrics = $r->input('lyrics');
DB::table('songs')->where('slug',$slug)->update(['name'=>$name,'slug'=>$slug,'lyrics'=>$lyrics]);
Redirect::to("songs");
}
35、为每一首歌添加修改链接,在 resources/views/songs/songlist.blade.php 中,将:
<li><a href="songs/{{ $song->slug }}">{{ $song->name }}</a> <a href="/songs/delete/{{ $song->slug }}">删除</a></li>
修改成:
<li><a href="songs/{{ $song->slug }}">{{ $song->name }}</a> <a href="/songs/{{ $song->slug }}/modify">修改</a> <a href="/songs/delete/{{ $song->slug }}">删除</a></li>
现在,歌曲列表中的每一首歌都应该能够被修改了。
36、下面,我们为歌曲列表加上分页功能。在 app/Http/Controllers/SongController.php 的 index() 方法中,把:
DB::table('songs')->get();
改成:
DB::table('songs')->paginate(10);
37、在 resources/views/songs/songlist.blade.php 的最后一行,添加:
{!! $songlist->render() !!}
这样,歌曲列表就实现了分页功能(因为没有定义样式,分页格式并不好看)
整个管理系统能够管理销售——记录客户信息、销售信息、货运信息并能够对这些信息进行统计和分析。
我们在这只开发客户信息维护、客户地区分布分析、交易地区分布分析等功能。
软件系统的设计——单页应用+传统“请求-响应”回合式应用。
1、建立项目文件夹 sale, 在其中安装 Laravel 5 框架。
2、从从命令行进入项目文件夹,执行:
php artisan app:name Sale
3、创建地区(Zone)对象,并自动生成建表计划(migration)。
php artisan make:model Zone
执行后,在 app 文件夹下生成了 Zone.php 模型文件,并在 database/migration 下生成了 xxxx_xx_xx_xxxxxx_create_zones_table.php (x代表数字,所有x组成了日期时间戳)的建表计划。
4、修改上述建表计划文件,在:
$table->increments("id");
下面添加:
$table->string("name")->unique();
$table->string("description")->nullable()->default('');
5、创建客户(Client)对象,并自动生成建表计划。
php artisan make:model Client
6、在生成的建表计划xxxx_xx_xx_xxxxxx_create_clients_table.php中,在:
$table->increments("id");
下面添加:
$table->string('name'); //客户名称
$table->string('type'); //客户类型
$table->string('telephone'); //电话
$table->string('email'); //电邮
$table->string('address'); //地址
$table->integer('deals'); //交易次数
$table->decimal('amount',12,2); //交易总额
$table->integer('zone_id')->unsigned();
$table->foreign('zone_id')->references('id')->on('zones'); //定义外键
7、在 app/Zone.php 类定义体中,添加以下代码:
public function clients(){
return $this->hasMany('Sale\Client');
}
将来可用 the_zone_obj.clients() 获得 the_zone_obj 这个地区对象中的所有客户。
8、在 app/Client.php 类定义体中,添加以下代码:
public function zone(){
return $this->belongsTo('Sale\Zone');
}
将来可用 the_client_obj.zone() 获得 the_client_obj 这个客户对象所属的地区。
9、配置数据库。到 config/database.php 中,将:
'default' => 'mysql',
该为:
'default' => 'sqlite',
10、在 storage 文件夹下建立一个叫做 database.sqlite 的文件作为数据库文件。
11、执行建表计划:
php artisan migrate
12、为框架安装 fzaninotto/faker 包,用于样例数据的生成。
composer require fzaninotto/faker --dev
13、在 database/seeds 文件夹,建立一个文件: ZoneTableSeeder.php, 输入一下内容:
<?php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class ZoneTableSeeder extends Seeder {
public function run(){
DB::table('zones')->delete();
DB::table('zones')->insert(['name'=>'西南地区','created_at'=>new DateTime,'updated_at'=>new DateTime]);
DB::table('zones')->insert(['name'=>'西北地区','created_at'=>new DateTime,'updated_at'=>new DateTime]);
DB::table('zones')->insert(['name'=>'东北地区','created_at'=>new DateTime,'updated_at'=>new DateTime]);
DB::table('zones')->insert(['name'=>'华南地区','created_at'=>new DateTime,'updated_at'=>new DateTime]);
}
}
14、在 database/seeds 文件夹,建立一个文件: ClientTableSeeder.php, 输入一下内容:
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use Sale\Client;
class ClientTableSeeder extends Seeder {
public function run(){
DB::table('clients')->delete();
$faker = Faker\Factory::create('zh_CN');
for($i=0;$i<100;$i++){
$c = new Client;
$c->name = $faker->company;
$c->type = $faker->randomElement(['个人','企业','事业单位','国家机构']);
$c->telephone = $faker->phoneNumber;
$c->email = $faker->email;
$c->address = $faker->address;
$c->deals = $faker->numberBetween(0,200);
$c->amount = $faker->randomFloat(2,0,1000000);
$c->zone_id = $faker->randomElement([1,2,3,4]);
$c->save();
}
}
}
15、在项目文件夹命令行执行:
composer dumpautoload -o
让Laravel能够找到我们刚刚建立的两个 Seeder 类。
16、在 database/seeds/DatabaseSeeder.php 的 run() 函数中加入以下语句:
保存,然后在项目文件夹命令行执行:
php artisan migrate:rollback
php artisan migrate
php artisan db:seed
以上最后两行可合并为: php artisan migrate --seed
至此,我们就为地区表和客户表添加了样例数据。
17、在 app/Http/routes.php 中,加入以下内容:
//头部
use Sale\Zone;
use Sale\Client
//路由
Route::get('zones',function(){
return Zone::all();
});
Route::get('clients',function(){
return Client::all();
});
18、在项目文件夹命令行,执行:
php artisan serve
然后,在浏览器中浏览:
localhost:8000/zones
和
localhost:8000/clients
应当能够看到 json 格式的数据。
19、确定路由:
(1)、"/" 指向首页,上面是一个单页布局,用于管理客户;
(2)、"zones" 返回地区列表数据(格式待定);
(3)、"clients" 返回客户列表数据(格式待定);
(4)、"zones/create" 用于保存新增地区记录;
(5)、"clients/create" 用于保存新增客户记录;
(6)、"clients/delete/{id}" 用于删除客户;
20、编辑 app/Http/routes.php, 内容如下:
Route::("/", function(){
return view('index');
});
21、在 resources/views 文件夹建立 index.blade.php 文件,输入以下内容:
@extends("layout")
22、在 resources/views 文件夹建立 layout.blade.php 文件,输入以下内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>销售管理系统</title>
<link rel="stylesheet" type="text/css" href="{{ asset('/themes/default/easyui.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset('/themes/icon.css') }}">
<script type="text/javascript" src="{{ asset('/js/jquery.min.js')}}"></script>
<script type="text/javascript" src="{{ asset('/js/jquery.easyui.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('/js/easyui-lang-zh_CN.js') }}"></script>
</head>
<body class="easyui-layout">
<div data-options="region:'north',border:false" style="height:60px;background:#B3DFDA;padding:10px">north region</div>
<div data-options="region:'west',split:true,title:'West'" style="width:150px;padding:10px;">west content</div>
<div data-options="region:'east',split:true,collapsed:true,title:'East'" style="width:100px;padding:10px;">east region</div>
<div data-options="region:'south',border:false" style="height:50px;background:#A9FACD;padding:10px;">south region</div>
<div data-options="region:'center',title:'Center'"></div>
</body>
</html>
23、到 jeasyui.com 下载软件包解压,把解压后的文件 jquery.min.js、jquery.easyui.min.js、locale/easyui-lang-zh_CN.js拷贝到项目文件夹下的 public/js 文件夹中(自己建立 js 文件夹)。把 themes 文件夹整个拷贝到 public 文件夹中。
24、这时,用浏览器浏览:
localhost:8000
应当能够看到一个单页布局。
25、把 resources/views/layout.blade.php 中的包含 region:'east' 的那一行删除,就删除了布局中的右边栏。然后,在包含 region:'center' 的那个 div 中,加入 @yield('content')
,作为内容占位。
26、编辑 index.blade.php 文件,内容如下:
@extends("layout");
@section('content')
<table id="client-list" title="Basic DataGrid" style="width:100%;height:100%">
<thead>
<tr>
<th data-options="field:'id',width:80">客户编号</th>
<th data-options="field:'name',width:100,sortable:true">客户名称</th>
<th data-options="field:'type',width:80,sortable:true">客户类型</th>
<th data-options="field:'telephone',width:80">电话</th>
<th data-options="field:'email',width:250">电邮</th>
<th data-options="field:'address',width:160,sortable:true">地址</th>
<th data-options="field:'deals',width:160,align:'right',sortable:true">交易次数</th>
<th data-options="field:'amount',width:160,align:'right',sortable:true">交易总额</th>
</tr>
</thead>
</table>
<script>
$(function(){
$("#client-list").datagrid({
url: "clients",
method: 'get',
pagination: true
});
});
</script>
@endsection
27、修改 app/Http/routes.php, 内容如下:
<?php
use Sale\Zone;
use Sale\Client;
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
Route::get('/', function(){
return view('index'); // resources/views/index.blade.php
});
Route::get('home', 'HomeController@index');
Route::get('zones',function(){
return Zone::all();
});
Route::get('clients',function(Request $r){
$page = $r->input('page')?$r->input('page'):1;
$rows = $r->input('rows')?$r->input('rows'):10;
$sort = $r->input('sort')?$r->input('sort'):'';
$order = $r->input('order')?$r->input('order'):'';
$count = DB::table('clients')->count();
$items = DB::table('clients')->skip(($page-1)*$rows)->take($rows)->orderBy($sort,$order)->get();
return ['total'=>$count,'rows'=>$items];
});
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
28、用浏览器浏览 localhost:8000,应当能够看到客户列表,列表具有分页、排序功能。