Laravel5.5框架基础学习

本文深入解析Laravel框架的核心功能,包括MVC架构、路由管理、控制器设计、模型操作、视图展示、数据库交互、文件上传、邮件发送及缓存机制。同时介绍了Laravel的缓存系统、队列服务和用户认证功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

为什么要使用框架?

框架提供了很多功能,比如数据库(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

MAIL_USERNAME=zhaozhiliang03@163.com

MAIL_PASSWORD=163coxxdexxx

MAIL_ENCRYPTION=ssl

    public function mail()
    {
//        // 这个成功了
//        Mail::raw('邮件内容', function ($message){
//            $message->from('zhaozhiliang03@163.com', '慕课网');
//            $message->subject('邮件主题 测试');
//            $message->to('390382430@qq.com');
//        });

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

    }

缓存

介绍:

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('zhaozhiliang03xxxx@163.com', '慕课网');
        $message->subject('邮件主题 测试');
        $message->to('390382xxx@qqxxxx.com');
    });

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

控制器中

public function queue()
{
    dispatch(new SendEmail("390382430@qq.com"));
    return 'queue';
}

php artisan queue:listen

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值