laravel框架学习笔记

一、laravel的安装

  1、composer

    作用:主要管理php中的依赖关系(类似于yum源)

    可以安装的软件:

          curl       //主要用到微信开发中

          upload    //文本操作

          excel    //表格

          mail     //邮件

          log      //日志

          laravel    //框架

    安装:

        下载地址:https://getcomposer.org/

        没有php解释器,无法运行php命令

            yum install php-cli

        执行下载命令

        解压后为composer.phar,

        到该目录下运行命令将composer.phar重命名到/usr/local/bin/下

          mv composer.phar /usr/local/bin/ composer并检查是否重命名成功

        切换到composer的中国镜像:

          composer config -g repo.packagist composer https://packagist.phpcomposer.com

2、安装laravel

  1、进入项目目录

    cd /usr/local/apache2.4/htdocs/

    composer create-project --prefer-dist laravel/laravel blog

    或者安装自己想要的版本

    composer create-project --prefer-dist laravel/laravel blog 5.4.*

   2、配置Apache:

    进入到laracel根目录

    cd blog/

    chmod 777 -R storage/

    打开浏览器输入地址:localhost/blog/public/  显示Larave欢迎洁面,安装成功!!

二、laravel配置文件

    1、环境配置(.env文件)

        APP_KEY:环境变量解析(网站的密匙,保证网站的安全)

            生成密匙:php artisan key:generate

        APP_DEBUG:开发模式(默认为ture,上线需设置为false)

        获取配置信息:env('')方法,设置环境配置中未设置的变量env('','')

    2、系统配置(config目录下)

        读取配置:config('文件名.配置名'),如:config('app.timezone')

        修改配置(临时性的,不修改配置文件):config(['文件名.配置名'=>'值']);如:config(['app.timezone'=>'UTC']);

三、php artisan(php的工具匠):在项目根目录下才能执行

    本生就是一些php文件,可以在命令行模式下执行这些文件,可以完成创建控制器、创建中间件、生成密匙等。

    1、php artisan down:网站下线(页面为views/503.blade.php)

    2、php artisan up:网站上线

    3、php artisan route:list:查看路由列表

    4、php artisan make:controller 控制器名:新建控制器

四、路由

    1、路由类型

      Route::get($rul,$callback);

      Route::post($rul,$callback);

      Route::put($rul,$callback);

      Route::patch($rul,$callback);

      Route::delete($rul,$callback);

      Route::options($rul,$callback);

    2、get();

        Route::get('login','LoginController@index');

    3、post();

        Route::post('check','LoginController@check');

        受CSRF保护(保护网站不受跨站请求伪造(CSRF)攻击。保护表单安全。)

        需在表单内添加{{csrf_field()}}

    4、put();

        路由中书写:

             Route::put('putWeb','LoginController@putweb');  //请求

             Route::put('put','LoginController@put');    //处理

        控制器书写:

             public function putWeb(){

                return view('putweb');

              }    //请求

             public function put(Request $request){

                dd($request->input());

              }    //处理

    5、路由的三种常见形式:

        HTTP请求路由:

            Route::get('url信息','处理的逻辑地址或功能代码');

            Route::put('url信息','处理的逻辑地址或功能代码');

            Route::post('url信息','处理的逻辑地址或功能代码');

            Route::delete('url信息','处理的逻辑地址或功能代码');

        Resource路由:url和控制器中的7个标准RESTful动作相绑定

            Route::resource('url相关信息','控制器名称');

        控制器路由:url和控制器中的所有动作(只需要按照指定的规范来编写动作即可)

            Route::controller('url相关信息','控制器名称');

    6、路由的处理:

        (1)把路由的处理交给控制器中的某个动作处理

            Route::get('/','IndexController@index')

        (2)直接处理路由(使用闭包函数形式处理)

            Route::get('/',function(){

                });

        (3)路由参数:

            Route::get('view/{id}',function($id){

                });    //参数必传

            Route::get('view/{id?}',function($id=1){

                });    //可选参数

    7、控制器和路由

        (1)为控制器绑定路由时,可以直接使用HTTP请求形式的路由

          需要每一个URL绑定到控制器中的某一个动作上

            Route::get('/','IndexController@index');

        (2)RESTful形式的资源控制器路由(只支持7种路由)

            Route::resource('url相关信息','控制器名称');

        (3)隐式控制器路由

            Route::controller('url相关信息','控制器名称');

            访问index,方法名应为getIndex

            访问getViewMsg方法,地址为msg/view-msg

    8、路由组(以后台管理模块为例)

        Route::group(['namespace'=>'Admin','prefix'=>'admin','middleware'=>'adminLogin'],function(){

          Route::get('/','IndexController@index');//后台首页

          Route::resource('user','UserController');//后台用户管理模块

          Route::resource('goods','GoodsController');//后台商品管理模块

        });

        (注:namespace为命名空间,prefix为路由前缀,middleware为中间件)

    9、中间件

        简介:中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制。例如,Laravel 内置了一个中间件来验证用户是否经过认证(如登录),如果用户没有经过认证,中间件会将用户重定向到登录页面,而如果用户已经经过认证,中间件就会允许请求继续往前进入下一步操作。

           当然,除了认证之外,中间件还可以被用来处理很多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求,从而方便我们构建系统日志系统。

           Laravel 框架自带了一些中间件,包括认证、CSRF 保护中间件等等。所有的中间件都位于 app/Http/Middleware 目录下。

        创建中间件:php artisan make:middleware CheckToken

              在app/Http/MiddLeware目录下新建一个中间件类CheckToken

        注册中间件:中间件分三类,分别是全局中间件、中间件组和指定路由中间件;

              a、全局中间件:在app/Http/Kernel.php的数组属性$middleware中添加即可。

              b、分配中间件到指定路由:首先在app/Http/Kernel.php中添加自己的中间件key,定义后可以使用middleware方法将其分配到路由:

                Route::get('/',function(){

                  //

                })->middleware('key');或路由组参数方式。

              c、中间件组:通过使用HTTP Kernel提供的$middlewareGroups属性实现。

                Route::get('/', function () {   

                   //

                })->middleware('web');

                  Route::group(['middleware' => ['web']], function () {

                    //
                  });
                  默认情况下, RouteServiceProvider 自动将中间件组 web 应用到 routes/web.php 文件,将中间件组 api 应用到 routes/api.php
              d、中间件参数:中间件可以接收额外的参数。例如:中间件文件中
                    
public function handle($request, Closure $next, $role)
                    {
                      if (! $request->user()->hasRole($role)) {
                        // Redirect...
                      }

                        return $next($request);
                    }
                    路由中书写:
                    中间件参数可以在定义路由时通过 : 分隔中间件名和参数名来指定,多个中间件参数可以通过逗号分隔
                    
Route::put('post/{id}', function ($id) {
                      //
                    })->middleware('role:editor');
              e、终端中间件:终端中间件,可以理解为一个善后的后台处理中间件。有时候中间件可能需要在 HTTP 响应发送到浏览器之后做一些工作,比如,Laravel 内置的 session 中间件会在响应发送到浏览器之后将 Session 数据写到存储器中,为了实现这个功能,需要定义一个终止中间件并添加 terminate 方法到这个中间件:
                    <?php

                    namespace IlluminateSessionMiddleware;

                    use Closure;

                    class StartSession
                    {
                        public function handle($request, Closure $next)
                        {
                            return $next($request);
                        }

                        public function terminate($request, $response)
                        {
                            // 存储session数据...
                        }
                    }

                  terminate 方法将会接收请求和响应作为参数。定义了一个终端中间件之后,还需要将其加入到 app/Http/Kernel.php 文件的全局中间件列表中。

                  当调用中间件上的 terminate 方法时,Laravel 将会从服务容器中取出一个该中间件的新实例,如果你想要在调用 handle 和 terminate 方法时使用同一个中间件实例,则需要使用容器提供的 singleton 方法以单例的方式将该中间件注册到容器中。关于服务容器我们就会在后面讲到,暂时不深入展开了。

    10、请求:

        (1)获取地址:
            $request->fullUrl();//输出当前url地址
            $request->path();//获取URL路由
            $request->url();//获取URL地址初参数
            $request->is('request');//判断路由是否为request,返回true或falst
      
  (2)获取请求类型:
            $request->method();//返回请求类型
            $request->isMethod('请求类型');//判断请求是否为特定请求
    11、闪存:闪存数据即 Flash Data,它的有效期是到下一个请求为止,主要用在短生命周期的变量传递
        (1)控制器方法中写入缓存:
            $request->flash();//全部写入闪存
            $request->flashOnly();//把谁写入到闪存
            $request->flaushExcept();//除了谁写入闪存
            或者在返回错误提示的时候存入缓存;
            return back()->with('errors','用户名长度有误')->withInput();//全部存入闪存
        (2)页面input中添加value="{{old('input的name')}}"
        详细:http://www.imooc.com/article/17873?block_id=tuijian_wz

     12、文件上传:
        (1)获取上传文件信息:
            $img=$request->file('input的name');或者
            $img=$request->input的name
        (2)判断文件是否上传
            $request->hasFile('input的name');
        (3)把文件移动到指定目录
            $ext=$request->file('img')->getClientOriginalExtension();//获取后缀名
            $newFile=time().rand().".".$ext//新文件名
            $request->file('img')->move('目的地址',$newFile);//移动到指定目录
        (4)
        (5)
    13、cookie
        查看:$requset->cookie();//查看所有的cookie
            或者Cookie::get();
        设置:Cookie::queue('key','value',生存时间);
            或者
              $cookie=cookie('key','value',生存时间);
              response('重定向')->cookie($cookie);
        (注:laravel框架把所有的cookie进行加密,所以$_COOKIE['name'] != $request->cookie())
    14、响应:所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器,如果响应数组的话,直接转换成json。
        (1)响应字符串
        (2)响应数组:转换成json
        (3)响应页面:return view('页面')->with(‘传递值’);
        (4)文件下载:
               return response()->download('文件所在路径');
               会报错,没有扩展
               xampp:在/opt/lampp/etc/php.ini,找到php_fileinfo.dll并开启
               重启apache
        (5)文件查看:return response()->file('文件所在路径');

五、数据库迁移(migrate)

    1、数据库迁移简介

        (1)migrate简介:

            方便团队开发,一次更改,团队成员都会影响到

            直接使用php代码,而不是使用sql语句来操作数据库

        (2)配置数据库账号信息:.env配置文件

        (3)数据库迁移命令:php astisan migrate

            命令行工具:sublime插件,terminal

        (4)删除自带的用户认证模块:php astisan fresh 

    2、创建数据表

        (1)创建数据库文件

            文件所在目录:databases/migrations/数据库迁移文件

            文件名:年_月_日_时分秒_create_tableName_table.php

            创建命令:php artisan make:migration create_name_table

        (2)

            在up方法中(新增数据表):

              Schema::create('数据库名',function(Blueprint $table){

                $table->字段类型('字段名字');

                如:$table->increments('id');

              }) 

              执行数据库迁移命令:php artisan migrate

    3、数据库填充

        (1)创建模型类

            a、一个数据库模型类对应一个数据表

            b、目录:app/目录下直接创建

                文件名:表名.php(首字母大写)

            c、模型类结构:类名  extends Model

        (2)数据填充

            a、数据填充文件

                位置:databases/seeds/

                文件名:表名TableSeeder.php

                数据填充文件基本结构:类名 extends Seeder

                填充文件方法:

                    public function run(){

                        DB::table('表名')->delete();//清空原始数据

                        表名::create([

                          '字段名'=>'值'

                        ]);

                    }

            b、执行数据填充命令

                在databases/seeds/DatabaseSeeder.php文件中调用数据填充命令

                    在run方法中:$this->call('数据库填充文件类名');

                php artisan db:seed

                可能会痴线一些问题,会提示一些类不能用

                     a、引入类的完全命名空间

                     b、可以使用composer命令:composer dump-autoload

  六、数据库操作

    1、连接数据库(.env文件):

          DB_CONNECTION=mysql

          DB_HOST=127.0.0.1

          DB_PORT=3306

          DB_DATABASE=homestead

          DB_USERNAME=homestead

          DB_PASSWORD=secret

    2、执行原声的sql语句

         查询:DB::select('select * from tableName');  // 为使用根命名空间

         删除:DB::delete('delete from tableName where id=XX');

         新增:DB::insert('insert into tableName value()');

         修改:DB::update('update tableName set 字段="值"');

         执行一段命令:DB::statement('create database databaseName');

    3、事物机制:(判断执行的sql语句知否执行成功。)

         开启事物:DB::beginTransaction();

         事物回滚:DB::rollback();

         食物提交:DB::commit();

    4、连贯操作;

         查询:

            DB::table('tableName')->get();//查询所有数据

            DB::table('tableName')->find();//查询一条数据

            DB::table('tableName')->where(''id,'=',3)->first();//查询一条数据

         where():

            基本的>、<、=、<>条件,当为=时可省略

            可作区间条件:DB::table('tableName')->where([[''id,'>=',2],['id','<=',5]])->get();

            like匹配:DB::table('tableName')->where([[''name,'like','%2%'],[''id,'<=',5]])->get();//and形式

                DB::table()->where()->orwhere()->get();//or形式

            wherebetween&&whereNotBetween:

                DB::table('tableName')->whereBetween('id',[10,15])->get();

                DB::table()->whereNotBetween()->get()

            whereIn&&whereNotIn:

                DB::table()->whereIn('id',[1,2,4,6,7])->get();

                DB::table()->whereNotIn()->get();

            whereNull&&whereNotNull:

                DB::table()->whereNull('字段')->get()

                DB::table()->whereNotNull('字段')->get();

        value():

            DB::table('tableName')->where('id',2)->value('name');//只取出这个字段的值

        pluck():

            DB::table()->pluck();//取出一列数据

        聚合:

            DB::table()->count();//总数

            DB::table()->max('字段');//最大值

            DB::table()->min('字段');//最小值

            DB::table()->avg('字段');//平均值

            DB::table()->sum('字段');//求和

        使用mysql原生函数:

            例如:得到查询字段的总数

            DB::table('tableName')->select(DB::raw('count(*)' tot))->get();

  七、blade模版引擎

        引用简书文章http://www.jianshu.com/p/7d65f9eb94be

原文地址:https://www.cnblogs.com/yuyangphpweibo/p/7866388.html