路由 1.resource路由 定义 Route::resource('home','HomeController'); 创建 php artisan make:controller HomeController --resource HomeController内容 public function index()//显示文章的首页 //get public function create()//文章的创建操作 //post public function store(Request $request)//文章插入操作 //get public function show($id)//文章详情 //get public function edit($id)//文章的修改页面 //put patch public function update(Request $request, $id)//更新操作 //delete public function destroy($id)//文章删除操作 2.模拟put提交 设置表单为post 设置一个隐藏表单 name='_method' value='PUT' 3.路由参数限制 Route::get('/home/{id}','HomeController')->where(['id'=>'\d+'])//where('id','\d+'); 多个参数 Route::get('/home/{artic}-{id}','HomeController')->where(); 3.Laravel 路由分组 一几个相同特性的路由可一份成一个组 比如 Route::get(Admin/index,admin\controller@index) Route::get(Admin/login,admin\controller@login) 路由分组 Prefix表示路由前缀,namespace表示controller的命名空间,middleware表示中间件 as表示路由的别名 Route::group([‘prefix’=>Admin,’namespace’=>’admin’],function(){ Route::get(‘index’,controller@index) Route::get(login,controller@login) }); 4.路有别名 Prefix表示路由前缀(常用在路由组里面),namespace表示controller的命名空间(常用在路由组里面),middleware表示中间件 as表示路由的别名 ,uses表示用到的controller 栗子 Route::get('home',[prefix='admin',middleware='loginMiddle',as=>'home',uses='HomeController@home']) 其中别名home使用 route('home')表示的就是这个路由,如果需要想路由传值 route('home',['id'=>10]); 5.创建一个404页面 Route::get('/404',function(){ return view('errors.404'); }); 在视图文件夹下创建404模板 默认情况下访问一个不存在的路由时会跳转到404路由 中间件 1.创建中间件php artisan make:middleware 创建之后 需要在kinal.php文件中进行配置 有三种选择 $middleware 表示全局使用 $middlewareGroups 表示约定路由组时使用调用[middleware=>] 或者route::get()->middleware() $routeMiddleware 表示需要手动引入 'login' => \App\Http\Middleware\LoginMiddleware::class, 2. 中间件实现记录路由访问情况 创建一个中间件 $str=’[’.date(‘Y-M-D’).’]’.$request->ip().’------->’$request->path(); File_put_contents(‘request.log’,$str,FILE_APPEND); 创建一个记录的log日志 时间配置可以在config 下 app配置php public function handle($request, Closure $next) { $str='['.date('Y-M-D').']'.$request->ip().'------->'.$request->path(); File_put_contents('request.log',$str.'\n\r',FILE_APPEND); return $next($request); } 登录检测 php artisan make:middleware LoginMiddleware 配置时间在app下的 timezone = prc 控制器 restful 路由 Route::resource(); 饮食控制器 Route::controller('good','GoodController'); php artisan make:controller GoodController --plain 1.设计技巧 用户模块 UserController 商品模块 ShopController 文章管理模块 ArticalController 主要方法 add() insert() updata() delete() 请求 1.基本信息获取 $request->method();//获取请求的方法get post $request->isMethod('get');判断请求的方法是不是get返回bool $request->path();获取除域名的路径 $request->url();获取完整的url $request->ip();获取用户的ip $request->getPort();获取端口号 2.提取请求参数 $request->input('name');//获取name $reuest->input('name','saaa');如果有name获取值,没有使用后面的默认值 $request->has('name');判断是否有name返回布尔值 $request->all();获取所有的参数 $request->only(['name','password']);表示只要name 和 passwor $request->except(['name']);表示除了name都要 $request->header();表示获取请求头信息 $request->header();表示获取请求头信息 4.文件操作 $request->hasFile('文件名');检测文件是否上传 $request-file('文件名')->move('保存的路径','保存的文件名') 5.cookie操作 设置cookie 1.\Cookie::queue('key','val',10);设置cookie有效时间10分钟 2.return response('')->withCookie('key',value,10);response 必须加 获取cookie 1.\Cookie::get('key'); 2.$request->cookie('key'); 删除cookie Cookie::forget('key') 6.闪存 3.back()->with(old());返回并读取闪存 1.$request->flash();//把提交的内容存到闪存里 old('name');读取闪存 $request->session()->flash('status', 'Task was successful!'); 2.$request->flashOnly('name','password');将部分内容存入闪存 3.$request->flashExcept('_token');除了token都保存到闪存内 4.\Session::flash('key','value');自定义闪存 调用session('key'); //跳回原来的页面 back(); 7.session $request->session()->get('key');获取session $request->session()->get('key','我是默认值');获取session如果不存在就用默认值 $request->session()->all(); session 中获取所有数据 request->session()->has('users');判断session中有没有session $request->session()->put('key', 'value');添加session $request->session()->push('user.teams', 'developers');user.team在session是一个数组,则可以向后追加 $request->session()->pull('key', 'default'); 数据从 session 内取出,并且删除它 从 Session 中移除数据 $request->session()->forget('key');删除session $request->session()->flush();删除所有session 响应 response('')->withCookie('name','1223',1)响应并设置一个cookie response('')->cookie('name','1223',1); response()->json(['name'=>'李四','age'=>20]);返回json response()->download($pathToFile);文件下载 response()->file($pathToFile);显示一个文件而不是下载 redirect('/sss');页面跳转 response()->view('');响应一个视图 模板 1.传值方法 view()->with($data)->with($list) view(‘moban’,[‘date’=>$date,’list’=>$list]) view(‘moban’,compact(data,list)); 模板 @{{}}表示屏蔽后面的解析 $name=null {{$name or ‘sssss’}} 表示变量如果不存在,使用or后面的值 模板的三目 Isset($name)?$name:’bucunzai’; 模板不解析html {!!$str !!} @forelse($a as $v)//是对foreach的补充 {{$v}} @empty//表示没有内容 “没有内容” @endforelse 模板的继承 @include(‘’),引入模板 想引入模板传值 @include(‘moban ’,[‘page’=>’shouye’]) 父级模板 <div>div> @yield(‘content’)//标识一段内容 <divdiv> 子模板模板继承 @extend(父级模板) @section(‘content’)//对父级模板里的东西进行填充 <div>对content进行填充 <div> @endsection @section('leftside') this is parent left @show 字幕版继承 @extends('parent') @section('leftside') son left @parent//对父模板进行输出 @endsection 在模板中使用函数;{{asset('')}};引入css.js.img 数据库 数据库支持 mysql,Postgres,SQLite,SQLServer 配置文件database.php 基本操作 1.DB::select();查询sql语句 2.DB::insert();插入操作 3.DB::delete();删除操作 4.DB::update();更新操作 一般语句 1.DB::statement('drop table goods');执行删除表创建表等 事务操作 1.DB::beginTransaction();开启事务 2.DB::commit();提交事务 3.DB::rollback();回滚事务 操作多个数据库 1.首先把databse.php配置文件的mysql复制粘贴,改成自己的需求 DB::connection('复制的mysql配置名')->select();等语句;//delete insert update 构造器方法 1.DB::table()->insert(['key'=>'value']);return true; 2.DB::table()->insert([[key=>value],[key=>value],...]);插入多行 3.DB::table()->insertGetId([]);插入并获得最后返回最后的id 更新 4.DB::table()->where('id','=',2)->update();更新操作返回受影响行数 删除 5.DB::table()->where('id','<1','100')->delete(); 查询所有 6.DB::table()->get();//查询所有 7.DB::table()->first();查询一行 查询某个字段的值 8.DB::table()->value('name');对单个结果某个字段进行查询 9.DB::table()->lists(['name','age']);//对多个字段进行获取 连贯操作 连贯操作 1.DB::table()->select('name','age')->get();只查询操作 2.DB::table()->where('name','=','zhangsan')->first(); 3.DB::table()->where()->orWhere()->get();orwhere相当于 or 4.DB::table()->whereBetween()->get();在摸个范围相当于 between whereIn('id',[1,2,3]); 相当于 in orderBy('id','desc'); 分页 5.DB::table()->skip('跳过多少航')->take('获取多少条')->get() 连接表 6.DB::table('goods') ->leftJion('users','goods.id','=','user.id') ->where('good.id','=','10') ->get(); 统计 7.DB::table()->count('*'); 8.DB::table()->max('shop_price');求最大值 9.DB::table()->avg('shop_price');求平均 打印sql语句(放在路有文件下) Event::listen('illuminate.query',function($query){ var_dump($query); }) 数据迁移 创建表 artisan make:migration create_goods_table --create=goods 为表添加字段 php artisan make:migration add_price_to_goods --table=goods php artisan migrate: 执行所有迁移文件 migrate --force: 强制执行最新的迁移文件 migrate:rollback ** 回退到执行迁移前的状态 **migrate:reset 回退到所有迁移之前的初始状态 migrate:refresh 回退到初始状态 , 再次执行所有迁移文件 迁移文件记录在composer下的autoload_classmap.php中 创建表 $table->engine = 'InnoDB';//指定表引擎 整型 $table->bigIncrements('id');递增 ID(主键),相当于「unsigned big」型态。 $table->increments('id');递增的 ID (主键),使用相当于「unsigned int」的型 $table->tinyInteger('numbers'); 相当于 tinyint 型态。 $table->smallInteger('votes'); 相当于 smallint 型态 $table->mediumInteger('numbers'); 相当于 mediumint 型态。 $table->integer('votes'); 相当于 int 型态。。。 $table->enum('choices', ['foo', 'bar']); 相当于 enum 型态。 字符串型 $table->char('name', 4); 相当于 char 型态,并带有长度 $table->string('name', 100); 相当于 varchar 型态,并带有长度。 $table->string('email'); 相当于 VARCHAR 型态。 $table->text('description'); 相当于 text型态。 $table->float('amount'); 相当于 float 型态。 $table->decimal('amount', 5, 2); 相当于 decimal 型态,并带有精度与基数。 时间 $table->dateTime('created_at'); 相当于 DATETIME 型态。 $table->time('sunrise'); 相当于 time 型态。 ->first() 将此字段放置在数据表的「第一个」(仅限 MySQL) ->after('column') 将此字段放置在其它字段「之后」(仅限 MySQL) ->nullable() 此字段允许写入 NULL 值 ->default($value) 为此字段指定「默认」值 ->unsigned() 设置 integer 字段为 UNSIGNED ->comment('my comment')注释 $table->primary('id'); 加入主键。 $table->primary(['first', 'last']); 加入复合键。 $table->unique('email'); 加入唯一索引。 $table->unique('state', 'my_index_name'); 自定义索引名称。 $table->index('state'); $table->index(['account_id', 'created_at']);创建复合索引 unique()创建索引 $table->dropPrimary('users_id_primary'); 从「users」数据表移除主键。 $table->dropUnique('users_email_unique'); 从「users」数据表移除唯一索引。 $table->dropIndex('geo_state_index'); 从「geo」数据表移除基本索引。 $table->renameColumn('from', 'to');重命名字段 $table->dropColumn('votes');//删除字段 插入数据进行测试 php artisan make:seeder UsersTableSeeder DB::table('users')->insert('二维数组'); php artisan db:seed --class=UserTableSeeder插入特定的类的测试数据 如果想批量向多个表插入数据 就是用DatabaseSeeder类在里面写 $this->call(UsersTableSeeder::class);配置多行参数是你创建的数据填充的文件名 php artisan db:seed 插入数据Databaseseeder类直接运行调用其他类 模型 创建模型 php artisan make:model good 创建模型并创建数据迁移文件 php artisan make:model good -m 模型的约定 public $table 表名限定 public $primaryKey;//主键字段限定 public $timestamps//不使用添加的时间 protect $connection = 'connection1'; $fillable - 可批量赋值的属性(白名单) $guarded - 不可批量赋值的属性(黑名单) firstOrCreate(['name' => 'name1']) 先通过传入的 “字段/值” 组合,查找数据库中的记录,没有则会添加一条记录。 firstOrNew(['name' => 'name1']),先通过传入的 “字段/值” 组合,查找数据库中的记录,没有则会 ”返回一个新的模型实例“,得通过 save() 方法,来插入到数据库! 模型操作数据库 添加 $good=new App\Model\good(); $good->title='ssss'; $good->content='sssss'; $good->save(); /添加操作 查询 good::find(2); //查询一条数据(是按id查) good::where('id','>',3)->first();是按照条件取一行 good::all([' 列 1',' 列 2']);//无条件查多行 good::where('id','>',2)->get([' 列 1',' 列 2']);按条件查多行 修改 msg = Msg::find($id); //改操作(先获取); $msg->title = $_POST['title']; $msg->content= $_POST['content']; return $msg->save()//执行修改 删除 $msg = Msg::find($id);先获取再删除 return $msg->delete() 复杂查询 // select ... where id > 2 order by id desc; Msg::where('id','>',2)->orderBy('id','desc')->get(); // select .. where id>2 order by id desc limit 2,1; Msg::where('id','>',2)->orderBy('id','desc')->skip(2)->take(1)->get(); 统计 Msg::count(); Msg::avg('id'); Msg::min('id'); Msg::max('id'); Msg::sum('id'); 注意点 Goods::groupBy('cat_id')->get(['cat_id','avg(price)']) ); // 想要效果 : select cat_id,avg(price) from goods group by cat_id; // 实际效果 : select `cat_id`,`avg(price)` from goods group by cat_id; // 原因 : laravel 在字段名两边用反引号包住了 // 用 DB::raw() 方法 ,raw 是 " 裸 , 不修饰的 " 意思 Goods::groupBy('cat_id')->get(['cat_id',DB::raw('avg(price)')]) ); 模型关系 一对一 以下是user模型中的模型关联关系 public function userinfo()//用户信息表Userinfo模型 { return $this->hasOne('App\Userinfo','user_id'); //第一个can是要关联的模型,第二个是关联的字段 } 一对多 public function post()//文章表Post模型 { return $this->hasMany('App\Post','user_id'); //第一个can是要关联的模型,第二个是关联的字段 } 属于关系 public function country(){//国家表Country模型 return $this->belongsTo('App\Country','country_id'); } 多对多 public function group(){//分组表Group模型(用户组,管理员组,测试组...) return $this->belongsToMany('App\Group','group_user','user_id','group_id'); //group表 //中间表,//用户表与中间表关联字段//中间表和Group表的关联字段 } 以上是我们在User的模型中创建的关联关系 在controller中使用 $user=User::find(1); $rs=$user->userinfo()->first();查询用户详细信息 $rs=$user->post()->get();查询用户发表的文章 $rs=$user->country()->first();//查询用户属于哪个国家 $rs=$user->group()->get();//查询用户属于哪个组 //根据一对多的模型关系进行写入数据(注意:::一对多写入需要要写入的模型开启 protected $fillable=['title','content']允许写入) $user=User::find(1);//一对一 $post=new Post(['title'=>'测试','content'=>'我是一对多写入']); $user->post()->save($post); 多对多写入 $user=User::find(1); $user->group()->attach(2);用户id为2让他属于2号组信息(让他关联2号组信息) 多对多方式2 $user=User::find(1); $group=Group::find(2); $user->group->attach($group); 多对多模型关系的删除 $user=User::find(1); $group=Group::find(3); $user->group()->detach($group);移除用户1和组3的模型关系 同步 $user=User::find(1); $user->group()->sync([1,2,3]);//把1好用户和1,2,3组都关联起来(同步起来) 引入自定义函数 首先创建一个文件夹,创建一个php文件,声明一个函数 (注意点首先应该判断这个函数是否存在function_exists(aaa)) 创建好之后在composer.json里面的autoload配置files单元(没有就创建注意使用双引号) 值是一个数组里面是我们的函数文件(文件夹都写全); 最后执行composer dump-autoload;执行后就可以创建使用函数了 "autoload": { "classmap": [ "database" ], "psr-4": { "App\\": "app/" }, "files":[ "app/Comm/Cart.php" ] }, composer dump-autoload 引入自定义类 首先创建文件夹创建类文件 同上在autoload的'classmap'写类文件所在文件夹比如 "app/Tool"(注意以定用引号) 然后执行 composer dump-autoload 使用正确引入文件就行 use App\Tool\Cart;就可以使用自定义的类文件了 调试工具debugbar或者postman(测试接口测试) debugbar安装 composer require barryvdh/laravel-debugbar 注册如下服务提供者: Barryvdh\Debugbar\ServiceProvider::class, 服务 创建服务 1.需要创建一个文件夹 定义一个接口类 2.实现一个接口类 3.创建服务 4.注册服务 5.调用服务(即实现类) 6.服务详细 1.服务需要引入接口的实现类 protected $defer = true;//为true表示这个类只有在需要的时候加载,是性能高效 public function boot() public function register() { //第一个传入的是契约,即我们的接口,匿名函数return的是我们的接口的实现类 $this->app->bind('App\Helpers\Contracts\RocketShipContract', function(){ return new RocketLauncher(); }); } public function provides()//如果 protected $defer = true;则你就需要这个方法 { return ['App\Helpers\Contracts\RocketShipContract'];//返回接口类 } 7.服务用途 服务主要应用很广,比如支付接口等 外观注册 1.创建一个接口类 2.实现一个接口类 3.创建门面类 use Illuminate\Support\Facades\Facade; class TestClass extends Facade { protected static function getFacadeAccessor()//底层定义了强大的门面类实现外观 { return 'TestService';//返回的是我们想要使用的外观 } } 创建服务 修改 public function register() { //使用singleton绑定单例 绑定test与TestService实例 $this->app->singleton('test',function(){ return new TestService(); }); //如果使用singleton()就不需要注册服务的bind()方法了 /* $this->app->bind('App\Contracts\TestContract',function(){ return new TestService(); });*/ } 注册服务 App\Providers\TestServiceProvider::class, 外观 'TestClass' => App\Facades\TestClass::class,