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
为了防止队列挂掉 则可以配合守护进程