ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
#轻松学会Laravel-高级篇 ###Composer快速入门 >Composer官网:[https://getcomposer.org/](https://getcomposer.org/) >Composer中文网:[http://www.phpcomposer.com](http://www.phpcomposer.com) ###通过composer.phar安装Composer 局部安装:将composer.phar文件复制到任意目录(比如项目根目录下),然后通过`php composer.phar`指令即可以使用Composer了 全局安装: composer下载:https://getcomposer.org/composer.phar ``` chmod u+x composer.phar mv composer.phar /bin/composer ``` ###Composer中国全量镜像 >http://pkg.phpcomposer.com/ 查看当前的镜像地址 ``` composer config -gl ``` Packagist 镜像用法: 全局配置 ``` composer config -g repo.packagist composer https://packagist.phpcomposer.com // 还原初始配置 composer config -g repo.packagist composer https?://packagist.org ``` 单个项目配置 打开命令行窗口(windows用户)或控制台(Linux、Mac 用户),进入你的项目的根目录(也就是 composer.json 文件所在目录),执行如下命令: ``` composer config repo.packagist composer https://packagist.phpcomposer.com ``` 注:如果没有composer.json文件,需要新建一个composer.json文件,还需要在里面写一对{}号,不然执行这个命令会报错 ###使用Composer ``` mkdir demo cd demo composer init composer config repo.packagist composer https://packagist.phpcomposer.com ``` 搜索(search) ``` composer search monolog ``` 展示(show) ``` composer show --all monolog/monolog ``` 申明依赖(require) vi composer.json ``` "require": { "monolog/monolog":"1.21.*", "symfony/http-foundation": "^3.2" }, ``` 安装(install) ``` composer install ``` 更新(update) vi composer.json ``` "require": { "monolog/monolog":"1.21.*" }, ``` composer update ###使用Composer安装Laravel 通过Composer Create-Project 命令安装 Laravel ``` composer search laravel composer show --all laravel/laravel composer create-project laravel/laravel --prefer-dist blog composer create-project laravel/laravel shop --prefer-dist "5.3.*" // 安装某个具体版本 ``` Laravel 安装器 ``` // 使用 Composer 下载 Laravel 安装包 composer global require "laravel/installer" // 再将 ~/.composer/vendor/bin 路径加到 PATH echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc // 重启一下 reboot // 测试Laravel 安装器是否安装成功 laravel // 安装laravel laravel new laravel2 // 下载最新的开发版本 laravel new test --dev ``` ###Artisan基本用法 查看所有可用的Artisan的命令(list) ``` php artisan php artisan list ``` 查看命令的帮助信息(help) php artisan help make:controller ``` composer create-project laravel/laravel laravel53 --prefer-dist "5.3.*" // 创建控制器 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 ``` 通过访问 http://192.168.99.100:8080/home 就可以进行注册登录了,如果访问出现了样式问题,只需要将 resources/views/layouts/app.blade.php 文件中引入css和引入js的路径改为如下即可: ``` {{ asset('css/app.css') }} {{ asset('js/app.js') }} ``` ###Laravel中的数据迁移 ######新建迁移文件 通过 `php artisan make:migration create_students_table` 来新建迁移文件。--table和--create参数可以用来指定数据表名称,以及迁移文件是否要建立新的数据表 生成模型的同时生成迁移文件 `php artisan make:model Student -m` ######下面咱们以students表来新建一个迁移文件 表结构如下 ``` create table if not exists students( id int auto_increment primary key, name varchar(255) not null default '' comment '姓名', age int unsigned not null default 0 comment '年龄', sex int unsigned not null default 10 comment '性别', created_at int not null default 0 comment '新增时间', updated_at int not null default 0 comment '修改时间' )engine=innodb default charset utf8 auto_increment=1001 comment='学生表'; ``` ``` php artisan make:migration create_students_table --create=students php artisan make:model Student -m ``` 2017_02_03_033958_create_students_table.php ``` // 编辑(自定义)迁移文件 public function up() { Schema::create('students', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->integer('age')->unsigned()->default(0); $table->integer('sex')->unsigned()->default(10); $table->integer('created_at')->default(0); $table->integer('updated_at')->default(0); }); } ``` 生成数据表 ``` php artisan migrate ``` ![](https://box.kancloud.cn/42a3320e968b9fbb10a26e25f4120dde_687x614.png) ###Laravel中的数据填充 创建一个填充文件,并完善填充文件 ``` php artisan make:seeder StudentTableSeeder ``` 执行单个填充文件 ``` php artisan db:seed --class=StudentTableSeeder ``` 批量执行填充文件 ``` php artisan db:seed ``` 数据填充实例 ``` php artisan make:seeder StudentTableSeeder ``` database/seeds/StudentTableSeeder.php ``` public function run() { DB::table('students')->insert([ ['name'=>'zhangsan', 'age'=>18], ['name'=>'lishi', 'age'=>20] ]); } ``` ``` php artisan db:seed --class=StudentTableSeeder ``` database/seeds/DatabaseSeeder.php ``` public function run() { // $this->call(UsersTableSeeder::class); // 批量执行填充,需要先引入一下 $this->call(StudentTableSeeder::class); } ``` ``` php artisan db:seed ``` ![](https://box.kancloud.cn/79d9655d041d931d3acbb1d36b3780b2_827x200.png) ![](https://box.kancloud.cn/891e6eafe45937b7cb909c20e5f71318_811x448.png) ![](https://box.kancloud.cn/578e71e8b9a6e3b94e53e3baee62e1b7_802x406.png) ###Laravel中的文件上传 Laravel的文件系统是基于Frank de Jonge的Flysystem扩展包,提供了简单的接口,可以操作本地端空间、Amazon、S3、Rackspace Cloud Storage,可以非常简单的切换不同保存方式,但仍使用相同的API操作 配置文件位置:config/filesystems.php 文件上传实例 config/filesystems.php ``` 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'visibility' => 'public', ], 'uploads' => [ 'driver' => 'local', 'root' => storage_path('app/uploads') ], 's3' => [ 'driver' => 's3', 'key' => 'your-key', 'secret' => 'your-secret', 'region' => 'your-region', 'bucket' => 'your-bucket', ], ], ``` routes/web.php ``` Route::any('/upload', 'StudentController@upload'); ``` app/Http/Controller/StudentController ``` <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class StudentController extends Controller { public function upload(Request $request){ if($request->isMethod('POST')){ $file = $request->file('source'); // 判断文件是否上传成功 if($file->isValid()){ // 获取原文件名 $oriFileName = $file->getClientOriginalName(); // 获取文件的扩展名 $ext = $file->getClientOriginalExtension(); // 获取文件的mime类型 $type = $file->getClientMimeType(); // 临时文件的绝对路径 $realPath = $file->getRealPath(); $filename = date('Y-m-d H-i-s') . '-'. uniqid() . '.' . $ext; $bool = Storage::disk('uploads')->put($filename, file_get_contents($realPath)); var_dump($bool); } exit; } return view('student.upload'); } } ``` resources/views/student/upload.blade.php(复制的是 Laravel中的用户认证(Auth)小节生成的login.blade.php) ``` @extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">文件上传</div> <div class="panel-body"> <form class="form-horizontal" role="form" method="POST" action="" enctype="multipart/form-data"> {{ csrf_field() }} <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> <label for="file" class="col-md-4 control-label">请选择文件</label> <div class="col-md-6"> <input id="file" type="file" class="form-control" name="source" required> </div> </div> <div class="form-group"> <div class="col-md-8 col-md-offset-4"> <button type="submit" class="btn btn-primary"> 确认上传 </button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection ``` ![](https://box.kancloud.cn/6391553cdbde3723dd472898df69689a_1280x763.png) ###Laravel中的邮件发送 配置文件:config/mail.php Mail::raw() 发送纯文本格式 Mail::send() 发送html格式 第一种发送方式 .env ``` MAIL_DRIVER=smtp MAIL_HOST=smtp.163.com MAIL_PORT=465 MAIL_USERNAME=jiezeal@163.com MAIL_PASSWORD=Internet678 MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=jiezeal@163.com MAIL_FROM_NAME='jiezeal' ``` routes/web.php ``` Route::any('/mail', 'StudentController@mail'); ``` app/Http/Controller/StudentController ``` use Mail; public function mail(){ // 第一种发送方式 发送纯文本 Mail::raw('邮件内容', function ($message){ $message->from('jiezeal@163.com', 'jiezeal'); $message->subject('邮件主题'); $message->to('jiezeal@foxmail.com'); }); } ``` ![](https://box.kancloud.cn/6b29fc8662e4a34dc4e1cde120656893_930x590.png) 第二种发送方式 app/Http/Controller/StudentController ``` public function mail(){ // 第二种发送方式 发送html Mail::send('student.mail', ['name' => 'jiezeal', 'age' => 18], function ($message){ $message->subject('邮件主题'); $message->to('jiezeal@foxmail.com'); }); } ``` resources/views/student/mail.blade.php ``` <h1>Hello {{ $name }} {{ $age }}</h1> ``` ![](https://box.kancloud.cn/587a95eadd8745ce5ce1090021e3bb52_945x632.png) ###Laravel中的缓存使用 配置文件位置:config/cache.php routes/web.php ``` Route::any('/cache1', 'StudentController@cache1'); Route::any('/cache2', 'StudentController@cache2'); ``` app/Http/Controller/StudentController ``` use Illuminate\Support\Facades\Cache; public function cache1(){ // put() 保存对象到缓存中 Cache::put('key1', 'val1', 10); // add() 也是添加缓存 如果key1存在则添加失败,不存在则添加成功 $bool = Cache::add('key1', 'val1', 10); var_dump($bool); $bool = Cache::add('key2', 'val2', 10); var_dump($bool); // forever() 永久的保存对象到缓存中 Cache::forever('key3', 'val3'); // has() 判断key是否存在 if(Cache::has('key3')){ $val = Cache::get('key3'); var_dump($val); }else{ echo 'No'; } } public function cache2(){ // get() 从缓存中获取对象 $val = Cache::get('key1'); var_dump($val); $val = Cache::get('key2'); var_dump($val); $val = Cache::get('key3'); var_dump($val); // 获取并删除缓存 $val = Cache::pull('key2'); var_dump($val); // forget() 从缓存中删除对象 $bool = Cache::forget('key3'); var_dump($bool); } ``` ###Laravel中的错误与日志 ######Debug模式 配置文件位置:config/app.php >进行本地开发时,应该配置APP_DEBUG环境变量为true,在上线环境,这个值应该永远为false HTTP异常 >有些异常描述来自服务器的HTTP错误码。例如,这可能是一个“页面未找到”错误(404),“认证失败错误”(401)亦或是程序出错造成的400错误 日志 >Laravel日志工具基于强大的Monolog库,提供了single、daily、syslog和errorlog日志模式,以及debug、info、notice、warning、error、critical和alert七个错误级别 routes/web.php ``` Route::any('/error', 'StudentController@error'); ``` app/Http/Controller/StudentController ``` use Illuminate\Support\Facades\Log; public function error(){ $name = 'zhangsan'; var_dump($name); return view('student.error'); $student = null; if($student == null){ // 对应 resource/views/errors/503.blade.php abort('503'); // 对应 resource/views/errors/500.blade.php abort('500'); } Log::info('这是一个info级别的日志'); Log::warning('这是一个warning级别的日志'); Log::error('这是一个error级别的日志', ['name' => 'zhangsan', 'age' => 18]); } ``` ![](https://box.kancloud.cn/da01e0593978b701ccb4bdd61fb16e46_1600x900.png) ![](https://box.kancloud.cn/10382f4bd3742f186682cc6a5058a25e_1600x898.png) 对应的是 resource/views/errors/404.blade.php ![](https://box.kancloud.cn/b5a93bee6ab83fb5a464ef19d3b4474e_1598x891.png) ###Laravel中的队列应用 Laravel队列服务为各种不同的后台队列提供了统一的API,允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高web请求速度 配置文件位置:config/queue.php 主要步骤 迁移队列需要的数据表 ``` php artisan queue:table php artisan migrate ``` 编写任务类 ``` php artisan make:job SendEmail ``` app/SendEmail.php ``` <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Mail; class SendEmail implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; protected $email; /** * Create a new job instance. * * @return void */ public function __construct($email) { $this->email = $email; } /** * Execute the job. * * @return void */ public function handle() { Mail::raw('队列测试', function ($message){ $message->subject('队列测试'); $message->to($this->email); }); } } ``` routes/web.php ``` Route::any('/queue', 'StudentController@queue'); ``` app/Http/Controller/StudentController ``` public function queue(){ dispatch(new SendEmail('jiezeal@foxmail.com')); } ``` 推送任务到队列 浏览器访问 http://192.168.99.100:8080/queue 运行队列监听器 ``` php artisan queue:listen ``` 处理失败任务 ``` php artisan queue:failed-table php artisan migrate // 查看执行失败的任务 php artisan queue:failed // 重新执行(ID为1)的那一条失败的任务 php artisan queue:retry 1 // 重新执行所有失败的任务 php artisan queue:retry all // 删除(ID为4)的那一条失败的任务 php artisan queue:forget 4 // 删除所有执行失败的任务 php artisan queue:flush ``` ![](https://box.kancloud.cn/c640914d498ed770da03c4222ac3349a_1600x900.png)