1.安装composer
2.安装laravel
composer create-project laravel/laravel learnlaravel5
3.nginx配置
server { charset utf-8; client_max_body_size 128M; listen 80; server_name 127.0.0.60; root "E:/vhost/laravel/learnlaravel5/public/"; location / { index index.php index.html index.htm; try_files $uri $uri/ /index.php$is_args$args; } location ~ /.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; try_files $uri =404; } }
浏览器输入127.0.0.60
4.激活用户登录注册功能
php artisan make:auth
浏览器输入127.0.0.60
5.连接数据库
(1)修改配置———-.env 文件
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel5 DB_USERNAME=root DB_PASSWORD=root
(2)数据库迁移
新建数据库 laravel5
php artisan migrate
执行的数据迁移文件在database/migrations下
生成的数据表
6.Eloquent
是 Laravel 的 ORM
使用
(1)使用 artisan 生成 Model 类
php artisan make:model Goods
app 目录,增加了Goods.php
namespace App; use Illuminate/Database/Eloquent/Model; class Goods extends Model { // }
(2)使用 artisan 生成 Migration(数据迁移)
a. 生成php文件
php artisan make:migration create_goods_table
新生成的文件 database/migrations/2017_10_10_061425_create_goods_table.php
修改up()
use Illuminate/Database/Schema/Blueprint; use Illuminate/Database/Migrations/Migration; class CreateGoodsTable extends Migration { public function up() { Schema::create('goods', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('img')->nullable(); $table->integer('price'); $table->integer('storage'); $table->timestamps(); }); } public function down() { // } }
b. 把 PHP 代码变成 MySQL 中的数据表
php artisan migrate
生成数据表goods
(3)使用 artisan 生成 Seeder(数据填充)
解决手动向数据库中填入假数据的问题
php artisan make:seeder GoodsSeeder
新生成的文件 database/seeds/GoodsSeeder.php
修改文件 run()
use Illuminate/Database/Seeder; class GoodsSeeder extends Seeder { public function run() { DB::table('goods')->delete(); for ($i=1; $i < 11; $i++) { $basePrice = rand(1,100); /App/Goods::create([ 'name' => 'Title '.$i, 'img' => 'img '.$i, 'price' => $basePrice*$i, 'storage' => $i*1000, ]); } } }
把 GoodsSeeder注册到系统内
database/seeds/DatabaseSeeder.php
文件
use Illuminate/Database/Seeder; class DatabaseSeeder extends Seeder { public function run() { $this->call(GoodsSeeder::class); } }
执行seed
php artisan db:seed
注:
如果找不到类,执行
composer dump-autoload
7.路由
(1)命名空间
Laravel 5 全面引入了 psr-4 命名空间标准:命名空间和实际文件所在的文件夹层级一致,文件夹首字母大写即为此文件的约定命名空间
eg:
app/User.php
的使用时的类名为:/App/User
app/Http/routes.php
//闭包路由 Route::get('/', function () { return view('welcome'); }); Route::auth(); //[email protected] 路由 Route::get('/home', [email protected]');
(2)闭包路由使用闭包作为此条请求的响应代码,方便灵活,很多简单操作直接在闭包里解决即可
eg:
Route::get('now', function () { return date("Y-m-d H:i:s"); });
编辑config/app.php
'timezone' => 'Asia/Shanghai',
浏览器输入http://127.0.0.60/now
调用控制器中的方法:使用字符串初始化类得到对象,调用对象的指定方法,返回结果
查看方法
vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php的dispatch()
var_dump($controller);
最简单地探测方式其实是手动抛出错误,这样就可以看到完整的调用栈:
eg:
在 HomeController 的 index 方法里的 return 之前增加
throw new /Exception("我的error", 1);
vendor/laravel/framework/src/Illuminate/Routing/Controller.php最终驱动了 HomeController
public function callAction($method, $parameters){ return call_user_func_array([$this, $method], $parameters); }
8.前台实践
(1)修改路由
去掉Route::get(‘/’, function () { return view(‘welcome’); });
将/home 那行修改为 Route::get('/', [email protected]')
(2)查看HomeController 的 index
app/Http/Controllers/HomeController.php的index()
public function index(){ return view('home'); }
返回名字叫 home 的视图给用户
注:
blade 是 Laravel 视图系统,resources/views/home.blade.php,对视图文件进行预处理,简化一些重复性很高的 echo、foreach 等 PHP 代码, 还提供了一个灵活强大的视图组织系统
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">Dashboard</div> <div class="panel-body"> You are logged in! </div> </div> </div> </div> </div> @endsection
基视图是 resources/views/layouts/app.blade.php
[email protected](‘content’) … @endsection之间的代码,会被放到基视图的 @yield('content')
中进行输出
浏览器输入127.0.0.60,显示登录页面
去掉登录,HomeController,构造函数,注释掉$this->middleware(‘auth’);
这句代码会在控制器类初始化的时候自动载入一个名为 auth 的中间件,这会导致首页需要登录
(3)向视图输出数据
修改index()
public function index() { return view('home')->withGoods(/App/Goods::all()); }
修改视图文件 resources/views/home.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">Goods Management</div> <div class="panel-body"> <div id="content"> <table class="table"> <thead> <tr> <th>#</th> <th>Name</th> <th>img</th> <th>Price</th> <th>Storage</th> </tr> </thead> <tbody> @foreach ($goods as $key => $one) <tr> <th scope="row">{{ $one->id }}</th> <td> <a href="{{ url('one/'.$one->id) }}"> <h4>{{ $one->name }}</h4> </a> </td> <td> {{ $one->img }} </td> <td> ¥{{ $one->price }} </td> <td> {{ $one->storage }} </td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> </div> </div> @endsection
9.后台实践
(1)生成控制器
用 Artisan 工具来生成控制器文件
php artisan make:controller Admin/HomeController
artisan 建立的文件夹及控制器文件
(2)添加路由
用路由组来将后台页面置于“需要登录才能访问”的中间件下
路由组可以给组内路由一次性增加 命名空间、uri 前缀、域名限定、中间件 等属性,并且可以多级嵌套
Route::group(['middleware' => 'auth', 'namespace' => 'Admin', 'prefix' => 'admin'], function() { Route::get('/', [email protected]'); });
访问这个页面必须先登录,若已经登录,则将 http://127.0.0.60/admin
指向 App/Http/Controllers/Admin/HomeController 的 index 方法
登录由 middleware 定义, /admin 由 prefix 定义,Admin 由 namespace 定义,HomeController 是实际的类名
(3)构建首页
index方法—–App/Http/Controllers/Admin/HomeController 增加index()
namespace App/Http/Controllers/Admin; use Illuminate/Http/Request; use App/Http/Requests; use App/Http/Controllers/Controller; class HomeController extends Controller { public function index() { return view('admin/home'); } }
视图—–在 resources/views/admin下增加home.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">Dashboard</div> <div class="panel-body"> <a href="{{ url('admin/goods') }}" class="btn btn-lg btn-success col-xs-12">管理商品</a> </div> </div> </div> </div> </div> @endsection
测试 http://127.0.0.60/admin登录成功后
此时点开商品管理会报错,添加商品管理功能
(4)商品列表
a.添加路由
Route::group(['middleware' => 'auth', 'namespace' => 'Admin', 'prefix' => 'admin'], function() { Route::get('/', [email protected]'); Route::get('goods', [email protected]'); });
b.新建控制器
php artisan make:controller Admin/GoodsController
c.添加index()
namespace App/Http/Controllers/Admin; use Illuminate/Http/Request; use App/Http/Requests; use App/Http/Controllers/Controller; use App/Goods; class GoodsController extends Controller { public function index() { return view('admin/goods/index')->withGoods(Goods::all()); } }
注:
Article 类和当前控制器类不在一个命名空间路径下,不能直接调用。需要主动导入 /App/Goods
d.新建视图
resources/views/admin/goods/index.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">商品管理</div> <div class="panel-body"> @if (count($errors) > 0) <div class="alert alert-danger"> {!! implode('<br>', $errors->all()) !!} </div> @endif <a href="{{ url('admin/goods/create') }}" class="btn btn-lg btn-primary">新增</a> <table class="table table-hover"> <thead> <tr> <th>#</th> <th>Name</th> <th>img</th> <th>Price</th> <th>Storage</th> <th></th> </tr> </thead> <tbody> @foreach ($goods as $key => $one) <tr> <th scope="row">{{ $one->id }}</th> <td> <a href="{{ url('one/'.$one->id) }}"> {{ $one->name }} </a> </td> <td> {{ $one->img }} </td> <td> ¥{{ $one->price }} </td> <td> {{ $one->storage }} </td> <td> <a href="{{ url('admin/one/'.$one->id.'/edit') }}" class="btn btn-success">编辑</a> <form action="{{ url('admin/one/'.$one->id) }}" method="POST" style="display: inline;"> {{ method_field('DELETE') }} {{ csrf_field() }} <button type="submit" class="btn btn-danger">删除</button> </form> </td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> </div> @endsection
http://127.0.0.60/admin/goods
(5)商品添加
资源控制器是 Laravel 内部的一种约定,约定了一系列对某一种资源进行“增删改查”操作的路由配置
eg:
Route::resource(‘goods’, ‘GoodsController’);
可得到多条路由配置
HTTP 方法 | URL 路径 | Action |
GET | /goods | index |
GET | /goods/create | create |
POST | /goods | store |
GET | /goods/{goods} | show |
GET | /goods/{goods}/edit | edit |
PUT/PATCH | /goods/{goods} | update |
delete | /goods/{goods} | destory |
a.配置资源路由
Route::group(['middleware' => 'auth', 'namespace' => 'Admin', 'prefix' => 'admin'], function() { Route::get('/', [email protected]'); Route::resource('goods', [email protected]'); });
b.新增
<1>添加create
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20388.html