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 ...
随机推荐
- 安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御
本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受 ...
- Docker镜像文件操作
1什么是Docker镜像 Docker镜像是由文件系统叠加而成(是一种文件的存储形式).最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统.Docker用户几乎永 ...
- jQuery笔记之工具方法extend插件扩展
jQuery工具方法 $.extend()插件扩展(工具方法) $.fn.extend()插件扩展(实例方法) 浅度克隆.深度克隆 两个方法基本是一样的,唯一不同的就是调用方式不一样 -------- ...
- Queue Sequence HDU - 4441
码力不行啊... 错误记录: 171行后面对find2的使用错误,原来写的是p=find2(rt,p1),然后再加上一句能过样例但很假的特判 事实上,现在是要寻找最大的j,使得d2[1..j-1]=p ...
- BestCoder Round #54 (div.2) 1003 Geometric Progression
题目传送门 题意:判断是否是等比数列 分析:高精度 + 条件:a[i] * a[i+2] == a[i+1] * a[i+1].特殊情况:0 0 0 0 0是Yes的,1 2 0 9 2是No的 代码 ...
- JAVA Map的使用
学JAVA那么多天了,所以就不写那啥了,哈哈 Map 是一个很实用的东西,它查询的速度也是飞快的.还有很多好的地方, 至于好在哪里,我也说不清. 还是用代码来说吧: import java.util. ...
- yum install perl-ExtUtils-MakeMaker
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/per ...
- 做OJ项目时遇到的坑
1.js代码写在Dom加载前,导致highcharts在ie8能够显示,而ie高版本和其他浏览器不能显示 我的理解:由于IE8和其他浏览器的js解析机制不同,ie8是在等dom全部加载完才开始执行js ...
- Java replaceAll不区分大小写
Java 中replaceAll如何忽略大小写呢? 方式一:在正则表达式前面添加(?i) @Test public void test_replaceAll33(){ String input = & ...
- C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接
随着Xamarin.Form项目接近尾声,仔细一算才发现过来大半年时间了. 期间除了刚开始有闲情写写,现在总算有空来总结一下了. 来先说 Plugin.BLE (https://github.com/ ...