Laravel5.5框架基础学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013862108/article/details/86548210

为什么要使用框架?

框架提供了很多功能,比如数据库(DB),缓存(Cache), 会话(Session), 文件上传等。

不但为前期开发提供了方便,更为后期项目性能优化(缓存技术由文件缓存换成Redis), 平台的改变

(数据库由 Oracle 换成 MySQL)提供了技术保障。

选择框架 标准? 选择流行框架的优点?

文档齐全     社区活跃     后期支持好

Laravel的版本选择?

LTS   非LTS

LTS  (Long  Time Support) 长期支持

Laravel 遵守“早发布,常发布” 的版本发布准则,这是开源届通常的做法。

5.1   5.5  都是LTS 版本。

下载Larvavel  / 安装  Laravel

https://laravel-china.org/docs/laravel-specification/5.5

www.golaravel.com/download

安装方法其二:

  1. 通过 Composer Create-Project命令安装Laravel

      composer create-project  laravel/laravel  —prefer-dis [别名]

      composer create-project laravel/laravel laravel55_demo --prefer-dist "5.5.*"

      composer search laravel

   2.  Laravel 安装器 

       composer global require “laravel/installer”

       laravel new blog   //实验失败了todo

MVC 概述?

Model 是应用程序中用于处理应用程序数据逻辑的部分

View 处理应用程序中显示的部分

Controller  是应用程序中处理用户交互的部分

     1.  从Model中获取数据,并输入到View中

     2. 接收View 中的用户操作,然后做出相应的响应

Laravel 核心目录文件 

bootstrap  //框架启动

路由:

将用户的请求转发给相应的程序进行处理

作用就是 建立url 和程序之间的映射

请求类型 get post put  patch  delete

基本路由:

//基础路由 get
Route::get('/basic',function (){
    return "hello basic1";
});

//基础路由
Route::post('basic2',function (){
    return 'Basic2';
});

多请求路由:

//多请求路由

Route::match(['get','post'],'mulity1',function (){
    return 'mulity1';
});

Route::any('mulity2',function (){
    return 'multy2';
});

路由参数:

Route::get('user/{name?}',function($name = null){
    return 'User-name:'.$name;
});

Route::any('member/{id}', ['uses' => 'MemberController@info'])->where('id','[0-9]+');

//正则表达式; name必须符合正则表达式
Route::get('user/{name?}',function ($name = 'sean'){
    return 'User-name-'.$name;
})->where('name', '[A-Za-z]+');

Route::get('user/{id}/{name?}',function ($id, $name= 'seandd'){
   return 'User-id-'.$id.'-name-'.$name;
})->where(['id'=>'[0-9]+', 'name'=>'[A-Za-z]+']);

路由别名:

Route::get('user/member-center',['as'=>'center',function(){
    //return 'member-center';
    return route('center');
}]);

路由群组:

Route::group(['prefix'=>'member'],function (){
   Route::get('user/center',['as'=> 'center', function(){
       return route('center');
   }]);

    Route::any('mulity2',function (){
        return 'member-multy2';
    });
});

路由中输出视图:

Route::get('view', function (){
   return view('welcome');
});

控制器:

怎么新建一个控制器?

控制器 和路由怎样进行关联?

Route::get('member/info', 'MemberController@info');

Route::get('member/info',['uses'=> 'MemberController@info']);
Route::any('member/info',['uses'=> 'MemberController@info']);

Route::any('member/info',[
    'uses'=> 'MemberController@info',
    'as' => 'memberinfo'
    ]);

//传参数 ,注意 不要加$
Route::any('member/{id}', ['uses' => 'MemberController@info'])
->where('id','[0-9]+');

Route::group(['middleware'=>['web']],function (){
    Route::any('session1',['uses'=>'StudentController@session1']);
    Route::any('session2',['as'=> 'session2','uses'=>'StudentController@session2']);
});


Route::group(['middleware'=> ['activity']],function (){
    Route::any('activity1', ['uses' => 'StudentController@activity1']);
    Route::any('activity2', ['uses' => 'StudentController@activity2']);
});

关联控制器后,路由的特性怎么用?

视图:

  1. 可以 不使用特殊模版 PHP 来作为视图; 
  2. 使用blade 模版
public function info($id)
{
    //return view('member-info');   //对应resources/views/member-info.php

    return view('member/info',[     //也可以使用. 号 member.info ; 对应resources/views/member/info.blade.php
        'name' => '天秤',
        'age'=> 18
    ]);
}

模型:

怎样新建模型

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{

。。。。。

}

怎样使用模型

操作数据库 有哪几种方式?

  1. DB facade(原始查找)
  2. 查询构造器
  3. Eloquent ORM

使用 DB facade 实现CURD?

练习使用的数据库表:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `sex` tinyint(3) unsigned NOT NULL DEFAULT '10' COMMENT '性别',
  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '新增时间',
  `updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1024 DEFAULT CHARSET=utf8 COMMENT='学生表';
use Illuminate\Support\Facades\DB;

public function test1()
{
    //新增
    $bool = DB::insert('insert into student(name, age) values(?,?)', ['imooc', 20]);
    dump($bool);

    //更新
    DB::update('update student set age=? where name=?', [22, 'sean']);

    //删除
    DB::delete('delete from student where id> ?',[1002]);

    //查询
    $students = DB::select('select * from student');
    dump($students);
}

使用查询构造器 实现CURD?

查询构造器(query builder)

使用PDO参数绑定,以保护应用程序免于SQL 注入,因此传入的参数不需要额外转译特殊字符

use Illuminate\Support\Facades\DB;

public function query1()
{
    //新增
    $bool = DB::table('student')->insert(['name'=>'imooc2', 'age'=> 18]);
    dump($bool);

    $id = DB::table('student')->insertGetId(['name'=> 'sean2', 'age'=> 19]);
    dump($id);

    DB::table('student')->insert([
        ['name'=> 'name1','age'=> 18],
        ['name'=> 'name2', 'age'=> 19],
        ]);

    //更新
    $row = DB::table('student')->where('id',1005)->update(['age'=> 30]);
    dump($row);

    DB::table('student')->increment('age',3);
    $row = DB::table('student')->decrement('age');
    $num = DB::table('student')->where('id', 1005)->decrement('age',3);
    DB::table('student')->where('id', 1005)->decrement('age',3,["name"=>'imooc']);

    //删除
    $num = DB::table('student')->where('id', '>=', 1005)->delete();


    //查询
    //获取所有数据
    $students = DB::table('student')->get();
    $student = DB::table('student')->orderBy('id','desc')->first();
    $student = DB::table('student')->where('id','>=', 1002)->get();
    dump($student);

    $student = DB::table('student')->whereRaw('id >? and age > ?', [1001, 20])->get();
    $student = DB::table('student')->whereRaw('id > ? and age > ?',[1001, 19])->pluck('name');

    $student = DB::table('student')->whereRaw('id > ? and age > ?',[1001, 19])->lists('name');
    dump($student);

    //lists  废弃了?
    $student = DB::table('student')->lists('name', 'id');

    $students = DB::table('student')->select('id','name','age')->get();

    DB::table('student')->orderBy('id','desc')->chunk(2, function ($student){
        dump($student);
    });

    //聚合函数
    $num = DB::table('student')->count();
    $max = DB::table('student')->max('age');
    $min = DB::table('student')->min('age');
    $avg = DB::table('student')->avg('age');
    $sum = DB::table('student')->sum('age');
    dump($max, $min, $avg, $sum);
}

Eloquent ORM 简介

是一个优美简洁的ActiveRecord 实现,用来实现数据库操作

每个数据表都有一个与之对应的“模型” 用于和数据表交互。

如何创建模型?
 

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    //指定表名
    protected $table = 'student';

    //指定主键
    protected $primaryKey = 'id';

    //允许 批量 赋值的字段
    protected $fillable = ['name','age'];

    //指定不允许批量赋值的字段
    protected $guarded = [];

    //自动维护时间戳
    public $timestamps = true;

    protected function getDateFormat()
    {
        return time();
    }

//    protected function asDateTime($val)
//    {
//        //没有 作用  todo;
//        //return $val;
//        return date('Y-m-d H:i:s',time());
//    }

}

ORM CURD操作?

新增:

通过模型新增数据(涉及到自定义时间戳); 使用模型的Create方法新增数据(涉及到批量赋值)

修改:

通过模型更新;   结合查询语句批量更新

删除:

通过模型删除; 通过主键值删除; 根据指定条件删除;


public function orm1()
{
   //查询操作
    $students = Student::all();
    var_dump($students);

    $student = Student::find(1002);
    $student = Student::findOrFail(1002);
    $students = Student::get();

    $students = Student::where('id','>','1001')->orderBy('age','desc')->first();
    dump($students);

    $students = Student::chunk(2,function ($students){
        var_dump($students);
    });

    $num = Student::count();

    $max = Student::where('id','>',1001)->max('age');
    dump($max);

    //新增操作
    //使用模型新增数据
    $student = new Student();
    $student->name = 'sean3';
    $student->age = 18;
    $bool = $student->save();
    dump($bool);

    //新增方法二:
    $student = Student::create(
        ['name'=>'imooc', 'age'=>33]
    );

    //不存在 再创建
    $student = Student::firstOrCreate(
        ['name'=> 'imoocs']
    );

    //不存在 ,创建对象
    $student = Student::firstOrNew(
        ['name'=> 'imoocsss']
    );

    $bool = $student->save();
    dump($bool);

    //更新操作
    $bool = Student::where('id', '>', 1012)->update(
        ['age'=> 41]
    );
    dump($bool);

    //删除操作
    //通过模型删除
    $student = Student::find(1014);
    $bool = $student->delete();

    //通过主键删除
    $num = Student::destroy(1013);
    var_dump($num);

    //通过主键 删除 多个
    $num = Student::destroy(1012, 1011);
    $num = Student::destroy([1012, 1011]);
    var_dump($num);

    //通过条件删除
    $num = Student::where('id','>',1009)->delete();
    var_dump($num);
}

Blade 模版引擎简介

和其他流行的PHP模版引擎不一样,Blade并不限制你在视图(view)中使用原生PHP代码

所有Blade视图页面都将被编译成 原生PHP代码并缓存起来, 除非你的模版文件被修改了,否则不会重新编译。

模版继承?

涉及的内容: section  yield  extends  parent 

layouts.blade.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>laravel 模版继承- @yield('title')</title>
    <style>
……….
    </style>
</head>
<body>
<div class="header">
    @section('header')
    头部
    @show
</div>

<div class="main">
    <div class="sidebar">
        @section('sidebar')
        侧边栏
        @show
    </div>

    <div class="content">
        @yield('content', '主要内容区域')
    </div>
</div>

<div class="footer">
    @section('footer')
    底部
    @show
</div>
</body>
</html>

student/section1.blade.php

@extends("layouts")

@section('header')
    @parent
    section1-header
@stop


@section('sidebar')
    @parent
    section1-sidebar
@stop

@section('content')
    section1-content
    <!---1. 模版中输出PHP变量--->
    <p>{{$name}}</p>

    <!---2. 模版中调用PHP代码----->
    <P>{{ time() }}</P>
    <p>{{ date('Y-m-d H:i:s', time()) }}</p>
    <p>{{ in_array($name, $arr) ? 'true': 'false' }}</p>
    <p>{{ var_dump($arr) }}</p>
    <p>{{ isset($name) ? $name : 'default' }}</p>
    <p>{{ $name1 or 'default' }}</p>

    <!----3. 原样输出------>
    {{--<p>@{{ $name }}</p>--}}

    {{-- 4。模版中的注释--}}

    <!---5. 引入子视图---->
    @include('student.common1',['message'=>'错误信息'])

    @if($name == 'sean')
        I'm sean
    @elseif($name == 'imooc')
        I'm imooc
    @else
        Who am I?
    @endif

    @if(in_array($name, $arr))
        true
    @else
        false
    @endif

    <br/>

    @unless($name != 'sean')
        I'm sean
    @endunless

    @for($i=0; $i< 10; $i++)
        <p>{{ $i }}</p>
    @endfor

    @foreach($students as $student)
        <p>{{$student->name}}</p>
    @endforeach

    @forelse($students as $student)
        <p>{{$student->name}}</p>
    @empty
        <p>null</p>
    @endforelse

    <a href="{{ url('url') }}">url()</a>
    <a href="{{action('StudentController@urlTest')}}">action()</a>
    <!--好像不行 用 route 方式-->
    {{--<a href="{{ route('url') }}">route()</a>--}}

@stop

模版中语法:

模版中输出PHP变量; 模版中调用PHP代码;原样输出;模版中的注释;引入子视图; 模版中流出控制语句;模版中URL

模版中的URL

url()  ;   action();

Controller 之 Request,  Session ,   Response,  Middleware

Controller 之Request Laravel 中的请求使用的是 symfony/http-foundation组件。

请求里面存放了$_GET, $_POST, $_COOKIE, $_FILES, $_SERVER等数据。

public function request1(Request $request)
{
    //1. 取值
    echo $request->input('name');
    echo $request->input('sex','未知');

    if($request->has('name')){
        echo $request->input('name');
    } else {
        echo '无该参数';
    }

    $res = $request->all();
    dd($res);

    //判断请求类型
    echo $request->method();
    if($request->isMethod('GET')){
        echo 'Yes';
    } else {
        echo 'No'
    }

    $bool = $request->ajax();
    dd($bool);

    //$res = $request->is('student/*');  //路由
    $res = $request->is('request1');

    echo $url = $request->url();
}

controller 之 Session

Laravel 支持了多种session 后端驱动,并提供清楚统一的API.也内置如Memcached, Redis 和数据库的后端驱动。默认使用“file” 的Session 驱动。

配置文件在 config/session.php ;

Laravel 中使用session有三种方式

  1. HTTP request类的session()方法
  2. session() 辅助函数
  3. Session facade

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

    Route::any('session1',['uses'=>'StudentController@session1']);

    Route::any('session2',['as'=> 'session2','uses'=>'StudentController@session2']);

});


public function session1(Request $request)
{
    //1.HTTP request session();
    $request->session()->put('key1', 'value1');

    //2. session函数
    session()->put('key2','value2');
    echo session()->get('key2');

    //3. Session facades 类
    //Session::put('key3','value3');
    Session::put('key3','value3');

    //以数组的形式 放到Session中
    Session::put(['key4'=> 'value4']);

    //把数据放到Session 的数组中
    Session::push('student', 'sean');
    Session::push('student','imooc');

    $res = Session::get('student','default');
    var_dump($res);

    //判断session 中某个可以是否存在
    if(Session::has('key1')){
        $res = Session::all();
    } else {
        echo '你们老大不在';
    }

    //删除session 中指定key的值
    //Session::forget('key2');

    //清空所有session 信息
    //Session::flush();

    //没成功 ?? todo
    $bool = Session::flash('key-flash','val-flash');
    dump($bool);

    $res = Session::pull('student','default');
    $res = Session::all();
    dump($res);

    //第一次访问存在,第二次不存在  没做通??
    echo $res = Session::get('key-flash');
    dump($res);
}

Controller 之Response

常见的响应类型

字符串;  视图;  Json;  重定向;

public function response()
{
    $data = [
        'errCode'=>0,
        'errMsg'=> 'success',
        'data'=> 'sean',
        ];
    //3. 响应json
    return response()->json($data);

    //4. 重定向
    return redirect('session2');

    //4. 重定向,带数据(session flash类型
    return redirect('session2')->with('message','我是数据');

    //action
    return redirect()->action('StudentController@session2')->with('message','我是数据2');
    return redirect()->route('session2')->with('message','我是数据3');

    //返回上一个页面
    return redirect()->back();
}

Controller 之 Middleware

中间件的作用?

Laravel 中间件提供一个方便的机制来过滤进入应用程序的HTTP请求。

场景:

有一个活动,在指定日期后开始,如果活动没开始只能访问宣传页面;

涉及新建中间件;  注册中间件; 使用中间件;中间价的前置和后置操作

Route::any('activity0', ['uses' => 'StudentController@activity0']);

Route::group(['middleware'=> ['activity']],function (){
    Route::any('activity1', ['uses' => 'StudentController@activity1']);
    Route::any('activity2', ['uses' => 'StudentController@activity2']);
});

控制器:

//活动宣传页面
public function activity0(){
    return "活动快要开始了,敬请期待";
}

//活动进行中
public function activity1(){
    return "活动1进行中";
}

public function activity2(){
    return "活动2进行中";
}

中间件:

namespace App\Http\Middleware;

use Closure;
class Activity
{
    //前置操作
//    public function handle($request, Closure $next)
//    {
//        if(time() < strtotime('2019-01-18')){
//            return redirect('activity0');
//        }
//
//        return $next($request);
//    }

    //后置操作  没做通 todo;
    public function handle($request, Closure $next)
    {
//        if(time() < strtotime('2019-01-15')){
//            return redirect('activity0');
//        }
        $response = $next($request);
        var_dump($response);
        echo '我是后置操作';
    }
}

表单案例 todo

Artisan 控制台

Artisan简介:

Artisan 是Laravel 中自带的命令行工具的名称

由 Symfony Console 组件驱动

提供了一些对应用开发有帮助的命令

查看所有可用的Artisan 命令

php artisan

php artisan  list

查看命令的帮助信息(help)

php artisan help migrate

Artisan 基本使用

创建控制器

php artisan make:controller StudentController

创建模型

php artisan make:model Student

创建中间件

php artisan make:middleware Activity

Laravel中用户认证(Auth)

生成Auth所需文件:

php artisan make:auth

php artisan migrate

如果是mysql5.7下可能会报错解决方法如下:加上Schema:defaultStringLength(191)


use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        Schema::defaultStringLength(191);
    }
………………

}

数据迁移

新建迁移文件,有两种

新建一个student表的迁移文件

php artisan make:migration create_students_table —table [数据表名称] —create [是否建立新的数据表]

php artisan make:migration create_students_table  —create=students

生成模型的同时生成迁移文件

php artisan make:model Student -m

下一步在迁移文件中 增加字段

下一步 php artisan migrate

数据填充

如何 创建一个填充文件?

php artisan make:seeder StudentTableSeeder

use Illuminate\Database\Seeder;

class StudentTableSeeder extends Seeder
{
    public function run()
    {
        //
        DB::table('students')->insert([
            ['name' => 'sean', 'age'=>18],
            ['name' => 'mooc', 'age'=>20],
        ]);
    }
}

如何执行单个填充文件?

php artisan db:seed —class=StudentTableSeeder

如何批量执行填充文件?

php artisan db:seed

Laravel中的文件上传?

Laravel 的文件系统是基于Frank de Jonge的Flysystem 扩展包

提供了简单的接口,可以操作本地端空间, Amazon S3  , Rackspace Cloud Storage

可以非常简单的切换不同保存方式,但仍使用相同的API 操作

配置文件config/filesystems.php

public function upload(Request $request)
{
    if($request->isMethod('POST')){
        var_dump($_FILES);
        exit;

        $file = $request->file('source');
        if($file->isValid()){
            $originalName = $file->getClientOriginalName();
            $ext = $file->getClientOriginalExtension();
            $type = $file->getClientMimeType();
            $realPath = $file->getRealPath();   //临时绝对路径

            $file = date('Y-m-d-H-i-s').'-'.uniqid().'.'.$ext;
            $bool = Storage::disk('uploads')->put($file, file_get_contents($realPath));
            var_dump($bool);
        }
    }

    return view('student.upload');
}

邮件

Laravel 的邮件功能基于热门的SwiftMailer 函数库之上,提供了一个简洁的API

Laravel 为 SMTP, Mailgun, Mandrill, Amazon, SES, PHP的mail函数, 以及sendmail 提供了驱动从而允许你快速通过

本地或云服务发送邮件。

配置文件config/mail.php

发送邮件两种格式 一种纯文本,一种是(html)

MAIL_DRIVER=smtp

MAIL_HOST=smtp.163.com

MAIL_PORT=465

[email protected]

MAIL_PASSWORD=163coxxdexxx

MAIL_ENCRYPTION=ssl

    public function mail()
    {
//        // 这个成功了
//        Mail::raw('邮件内容', function ($message){
//            $message->from('[email protected]', '慕课网');
//            $message->subject('邮件主题 测试');
//            $message->to('[email protected]');
//        });

        //from  subject ,to 这些都要有
        Mail::send('student.mail', ['name'=> 'sean'], function ($message){
            $message->from('[email protected]', '慕课网2');
            $message->subject('邮件主题 测试2');
            $message->to('[email protected]');
        });

    }

缓存

介绍:

Laravel 为各种不同的缓存系统提供一致的API

Laravel支持各种常见的后端缓存系统,如File, Memcached 和Redis

主要方法如:

put()  ; add();   forever();   has();   get();   pull();   forget();

配置:

config/cache.php 

  public function cache1()
    {
        //put
        //Cache::put('key1', 'val1', 10);
        //add  如果已经存在 就返回false
//        $bool = Cache::add('key2', 'val2', 10);
//        dd($bool);

        //forever()
        $bool = Cache::forever('key3', 'val3');
        dump($bool);

        //has
        if(Cache::has('key1')){
            $val = Cache::get('key3');
            var_dump($val);
        }else{
            echo 'No';
        }

        //pull
        $bool = Cache::pull('key1');
        dump($bool);

        //forget  删除缓存
        $bool = Cache::forget('key2');
    }

错误 和 日志

debug 模式;配置文件config/app.php

Laravel日志工具基于monolog库,提供了 single, daily, syslog, 和 errorlog 日志模式

    public function error(){
        //$name = 'sean';
        //var_dump($name);
        //return view('student.error');

//        $student = null;
//        if($student == null){
//            //abort('503');
//            abort('404');
//        }

        //Log::info('这是一个info 级别的日志');
        //Log::warning("这是warning 级别日志");
        Log::error('这是一个数组',['name'=>'sean','age'=>19]);
    }

队列:

Laravel队列服务为各种不同的后台提供了统一的API

允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度。

主要步骤:

  1. 迁移队列需要的数据表
  2. 编写任务类
  3. 推送任务到队列
  4. 运行队列监听器
  5. 处理失败任务

php artisan queue:table

php artisan migrate

php artisan make:job SendEmail

public function handle()
{
    //
    Mail::raw('队列测试',function ($message){
        $message->from('[email protected]', '慕课网');
        $message->subject('邮件主题 测试');
        $message->to('[email protected]');
    });

    //Log::info('已发送邮件-'.$this->email);
}

控制器中

public function queue()
{
    dispatch(new SendEmail("[email protected]"));
    return 'queue';
}

php artisan queue:listen

猜你喜欢

转载自blog.csdn.net/u013862108/article/details/86548210