laravel 笔记

路由
      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.teamsession是一个数组,则可以向后追加
        $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);用户id2让他属于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绑定单例 
              绑定testTestService实例 
              $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,



你可能感兴趣的:(laravel)