laravel使用总结(一)
安装
composer create-project laravel/laravel learnlaravel5 --prefer-dist v5.3.*
安装成功之后会自动生成一个key
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled class file has been removed.
> php artisan key:generate
Application key [base64:z6FDVhrWJfYFyjjFpJp3tmIsbqvcSAPHsHjDBN3oNpE=] set successfully.
查看目录
tree
目录结果
├── app
│ ├── Console
│ │ └── Kernel.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ ├── Auth
│ │ │ │ ├── ForgotPasswordController.php
│ │ │ │ ├── LoginController.php
│ │ │ │ ├── RegisterController.php
│ │ │ │ └── ResetPasswordController.php
│ │ │ └── Controller.php
│ │ ├── Kernel.php
│ │ └── Middleware
│ │ ├── EncryptCookies.php
│ │ ├── RedirectIfAuthenticated.php
│ │ └── VerifyCsrfToken.php
│ ├── Providers
│ │ ├── AppServiceProvider.php
│ │ ├── AuthServiceProvider.php
│ │ ├── BroadcastServiceProvider.php
│ │ ├── EventServiceProvider.php
│ │ └── RouteServiceProvider.php
│ └── User.php
├── artisan
├── bootstrap
│ ├── app.php
│ ├── autoload.php
│ └── cache
├── composer.json
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── compile.php
│ ├── database.php
│ ├── filesystems.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── ModelFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ └── 2014_10_12_100000_create_password_resets_table.php
│ └── seeds
│ └── DatabaseSeeder.php
├── gulpfile.js
├── package.json
├── phpunit.xml
├── public
│ ├── css
│ │ └── app.css
│ ├── favicon.ico
│ ├── index.php
│ ├── js
│ │ └── app.js
│ ├── robots.txt
│ └── web.config
├── readme.md
├── resources
│ ├── assets
│ │ ├── js
│ │ │ ├── app.js
│ │ │ ├── bootstrap.js
│ │ │ └── components
│ │ │ └── Example.vue
│ │ └── sass
│ │ ├── app.scss
│ │ └── _variables.scss
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ ├── errors
│ │ └── 503.blade.php
│ ├── vendor
│ └── welcome.blade.php
├── routes
│ ├── api.php
│ ├── console.php
│ └── web.php
├── server.php
├── storage
│ ├── app
│ │ └── public
│ ├── framework
│ │ ├── cache
│ │ ├── sessions
│ │ └── views
│ └── logs
└── tests
├── ExampleTest.php
└── TestCase.php
app目录是开发的核心目录
- app/Console 主要是和自定义Artisan命令相关
- app/Exceptions 异常捕获相关,可以编写自定义异常
- app/Http/Controllers 控制器相关
- app/Http/Middleware 中间件,进入控制器之前,可以对URL进行拦截做权限判断,登录判断等
- app/Http/request 默认不存在,可以通过命令生成,主要是和参数验证相关
- app/Http/Providers 服务提供者类
- app/Http/Jobs 默认不存在,可以通过命令生成,用于存放队列任务。可以将耗时任务放到这里
- bootstrap 启动时,需要加载一些必要的文件
- config 存放配置文件,也可以自定义配置文件
- database 数据库相关,可以通过代码生成数据库表和产生一些测试数据
- public/index,php 系统默认入口文件,需要在服务器端指定
- resources 资源文件
- routes 路由文件,laravel的路由会有一个统一的入口文件,就是在这里配置的
路由
单个路由
- Route::get($uri, $callback);
- Route::post($uri, $callback);
- Route::put($uri, $callback);
- Route::patch($uri, $callback);
- Route::delete($uri, $callback);
路由群组
Route::group(['namespace'=>'Admin','prefix'=>'api'],function() {
//Admin 命名空间 api 路由前缀
Route::post('/admin/test1', 'AdminController@tes1');
Route::get('/admin/test2', 'AdminController@tes2');
Route::get('/admin/test3', 'AdminController@test3');
Route::group(['middleware' => ['login.auth']], function () {
// 使用 login.auth 中间件
Route::Get('/admin/index', 'TestController@index');
Route::Put('/admin/update', 'MemberController@update');
Route::post('/admin/store', 'MemberController@store');
});
});
中间件
1.使用命令生成中间件
php artisan make:middleware checkAge
2.会在 app/Http/Middleware 目录下生成 checkAge.php,可以在handle方法中判断参数是否合法 或者做登录验证
<?php
namespace App\Http\Middleware;
use Closure;
class checkAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$input = $request->input();
if(!isset($input['age']) || $input['age']>120){
$return_value = array(
'code' =>config('statuscode.parameter_error'),
'message' =>'error',
);
return response()->json($return_value);
}
return $next($request);
}
}
3. 还需要在Kernel.php文件中注册这个中间件
protected $routeMiddleware = [
'checkAge'=>\App\Http\Middleware\AuthorityAuth::class,
];
控制器
1.使用命令生成中间件,控制器会默认生成到 App\Http\Controllers 目录下,并且会自动生成Admin控制器
php artisan make:controller Admin/LoginController.php
2.关于控制器的命名空间
默认情况下,RouteServiceProvider 中载入 routes.php 文件,并且该路由群组指定定了群组中路由控制器所在的命名空间。如果你在 App\Http\Controllers 目录下选择使用 PHP 命名空间嵌套或组织控制器,只需要使用相对于App\Http\Controllers 命名空间的指定类名即可。因此,如果你的完整控制器类是App\Http\Controllers\Admin\LoginController,你可以像这样注册路由:
Route::get('foo', 'Admin\LoginController@method');
响应
1.引入相应相关包
use Illuminate\Support\Facades\Response;
2.返回json和jsonp数据
return response()->json($return_value);
return response()->jsonp($return_value);
3.添加响应头
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
3.添加Cookie
return response($content)
->header('Content-Type', $type)
->cookie('name', 'value', $minutes);
参数验证
1.使用命令生成验证文件 会在app/Http/Requests 目录下生成 LoginRequest.php文件
php artisan make:request LoginRequest
2.修改验证文件 rules方法为验证规则,response为验证失败返回的数据
public function authorize()
{
return true;
}
public function response(array $errors)
{
$fields = array();
foreach($errors as $key=>$error){
}
$return_value = array(
'code' =>config('statuscode.parameter_error'),
'fields' =>$fields
);
return response()->json($return_value);
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'data.param1' =>'required',
'data.param2' =>'required|in:1,2,3',
'data.param3' =>'required',
];
}
3.引入验证文件 需要将默认的参数类型替换为LoginRequest
use App\Http\Requests\LoginRequest.php;
public function login(LoginRequest $request){
}
异常捕获
目录/app/Exceptions下有一个Handle.php文件 这里可有两个方法可以捕获异常
- report 方法用于记录异常或将其发送到外部服务
$reflector = new \ReflectionClass($exception);
$exception_name = $reflector->getShortName();
if($exception_name !== 'ValidationException'){
$file = $exception->getFile();
$line = $exception->getLine();
$message = $exception->getMessage();
$error = array(
'exception_name' =>$exception_name,
'uri' =>\Request::getRequestUri(),
'file' =>$file,
'line' =>$line,
'message' =>$message,
);
ExceptionLog::error('Exception',$error,'exception');
}
- render 方法负责将异常转换成 HTTP 响应发送给浏览器
$reflector = new \ReflectionClass($exception);
$exception_name = $reflector->getShortName();
$file = $exception->getFile();
$line = $exception->getLine();
$message = $exception->getMessage();
$exception_value = array(
'code' =>config('statuscode.fail_server'),
'fields'=>array(
'server_error'=>array(
'field' =>'server_error',
'message' =>$message,
'file' =>$file,
'line' =>$line
)
)
);
$return_value = array(
'code' =>'500',
'message' =>'/error?code=500',
'file' =>$file,
'line' =>$line,
'error_message' =>$message,
);
return response()->json($return_value);
自定义 Artisan 命令行工具
生成文件
php artisan make:command Task #app/Console/Commands目录下会生成一个Task.php文件
打开文件 并编辑 修改文件如下
protected $signature = 'Task:Calculate'; ##命令
protected $description = 'Calculate Data'; ##描述
public function handle()
{
sleep(1);
echo "Calculate Data"; ##计算任务
}
注册命令
## 编辑 app/Console/Kernel.php
protected $commands = [
\App\Console\Commands\Task::class
];
查看命令
root@ubuntu:/www# php artisan --list | grep Task
Task
Task:Calculate Calculate Data
运行命令
php artisan Task:Calculate ##输出calculate data
Service Provider
laravel 实现了 IOC注册了特定的服务 这里通过curl插件做一下演示
服务提供者需要在每个环境下都要加载,只要把它放在这个数组下面就可以了
1.安装
composer require ixudra/curl ##通过composer安装插件
2.注册服务
Ixudra\Curl\CurlServiceProvider::class ##编辑 config/app.php文件 在providers文件中添加服务
3.使用
use Ixudra\Curl\Facades\Curl;
$response = Curl::to('http://local.laravel.com/api')
->get();
任务调度
利用linux的crontab 可以部署不同的任务 如果有多个任务需要部署 则需要编辑多个crontab任务
laravel的 app/Console/Kernel.php文件 提供了一个 schedule 方法 这里可以定义不同的时间 执行不同的命令
//每天凌晨2点执行计算任务
$schedule->command('Task:Calculate')
->withoutOverlapping()
->dailyAt('2:00');
//每小时执行计算任务
$schedule->command('Task:Calculate')
->hourly();
注册服务 监听sql
希望根据不同环境加载 则编辑app/Providers/AppServiceProvider 文件
public function register()
{
if ($this->app->environment() !== 'production') {
$this->dbQuerySql();;
}
public function dbQuerySql(){
\DB::listen(
function ($sql) {
foreach ($sql->bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
} else {
if (is_string($binding)) {
$sql->bindings[$i] = "'$binding'";
}
}
}
if(env('DEBUG_SQL_INSERT')){
//只记录 insert sql语句
$sql_type = strstr($sql->sql,"insert");
if(!$sql_type)
return;
}
$query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
$query = vsprintf($query, $sql->bindings);
$log = array(
'query'=>$query,
);
Log::debug('sql_log',$log,'sql_log');
}
);
}
}
队列
laravel实现了队列服务 目的是将耗时的任务延时处理 从而尽快返回请求 队列支持数据库,Redis等类型。 配置文件在config/queue.php文件中
使用数据库来驱动队列
创建数据库
php artisan queue:table //生成数据库队列的 migration
php artisan migrate //创建该数据库队列表
创建队列
php artisan make:job SleepJob
队列创建完成之后 会在app/Jobs目录下生成一个SleepJob.php文件
public function handle()
{
//在handle方法中执行耗时操作
$value = array(
'time'=>date('Y-m-d H:i:s')
);
file_put_contents('./tmp.log',json_encode($value).PHP_EOL,FILE_APPEND);
sleep(2);
}
执行队列
dispatch(new \App\Jobs\SleepJob());
修改配置 异步执行job
- 编辑.env文件QUEUE_DRIVER=database
查看jobs表数据
{
"displayName":"App\Jobs\SleepJob",
"job":"Illuminate\Queue\CallQueuedHandler@call",
"maxTries":null,
"timeout":null,
"data":{
"commandName":"App\Jobs\SleepJob",
"command":"O:17:"App\Jobs\SleepJob":4:{s:6:"*job";N;s:10:"connection";N;s:5:"queue";N;s:5:"delay";N;}"
}
}
消费队列数据
$ php artisan queue:work
Processing: App\Jobs\SleepJob
队列数据执行完成之后 会自动从数据库中移出
重启队列
队列的数据 只会加载一次 如果修改了代码则需要重启队列
$ php artisan queu:restart
Broadcasting queue restart signal.
守护进程Supervisor
为了防止队列挂掉 则可以配合守护进程
laravel使用总结(一)的更多相关文章
- TODO:Laravel增加验证码
TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...
- TODO:Laravel 内置简单登录
TODO:Laravel 内置简单登录 1. 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...
- TODO:Laravel 使用blade标签布局页面
TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...
- TODO:搭建Laravel VueJS SemanticUI
TODO:搭建Laravel VueJS SemanticUI Laravel是一套简洁.优雅的PHP开发框架(PHP Web Framework).可以让你从面条一样杂乱的代码中解脱出来:它可以帮你 ...
- Bringing Whoops Back to Laravel 5
You might be missing the "prettier" Whoops error handler from Laravel 4. If so, here's how ...
- 在 Laravel 中使用图片处理库 Integration/Image
系统需求 PHP >= 5.3 Fileinfo Extension GD Library (>=2.0) … or … Imagick PHP extension (>=6.5.7 ...
- Laravel Composer and ServiceProvider
Composer and: 创建自定义类库时,按命名空间把文件夹结构组织好 composer.json>autoload>classmap>psr-4 composer dump-a ...
- Laravel 5.x 请求的生命周期(附源码)
Laravel最早接触是刚开始实习的时候,那时通过网上的学习资料很快便上手,开发模块接口.后来没有什么深入和总结,但是当我刚开始学Laravel的时候,我对Laravel最大的认识就是,框架除了路由. ...
- Laravel 5.3 登录注册底层实现详解
每个控制器都使用 trait 来引入它们需要的方法 */ 用于处理用户登录认证 用于处理新用户注册 包含重置密码逻辑 用于处理重置密码邮件链接 认证需要的视图 包含了应用的基础布局文件 ...
- Laravel - 安装与配置
有多重途径可以安装Laravel,下面是通过composer安装laravel的方法.Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.c ...
随机推荐
- SVG新手入门
特点 矢量图 属性:形状的参数(都没有单位) 添加事件跟html一样 修改样式跟html一样 属性操作: setAttribute/getAttribute 图形 <svg width=&quo ...
- TensorFlow多线程输入数据处理框架(二)——输入文件队列
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 一个简单的程序来生成样例数据. #!/usr/bin/env python # -*- coding: UTF-8 ...
- Linux下自动还原MySQL数据库的Shell脚本
创建shell脚本topjui_source.exp,内容如下: #!/usr/bin/expect spawn echo "###### running... ######" s ...
- 最小公倍数的最小和(Minimum Sum LCM )
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> u ...
- iOS 加载Viewcontroller的几种方法
// 一.根据StoryboardID(需要在Storyboard设置),通过ViewController所在的Storyboard来加载: UIStoryboard *storyboard = [U ...
- 二分查找 BestCoder Round #36 ($) Gunner
题目传送门 /* 题意:问值为x的个数有几个,第二次查询就是0 lower/upper_bound ()函数的使用,map也可过,hash方法不会 */ #include <cstdio> ...
- Linux下mysql新建账号及权限设置各种方式总结
来自:http://justcoding.iteye.com/blog/1941116 1.权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连接服务器A以进行数据库操作,需要服务 ...
- 488 Zuma Game 祖玛游戏
回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球.每一次,你可以从手里的球选一个,然后把这个球插入到一串球中的某个位置上 ...
- c库函数-字符串
一 strok:从字符串中按照分隔符提取所有字串 char s[] = "水发产品,47.6,不合格,mg/kg,17-05-21 15:04;"; char *delim = ...
- JS进阶-闭包的几种常见形式
作用域链: //作用域链 var a = 1; function test() { var b =2; return a; } alert(test());//弹出1: alert(b);//不能获取 ...