composer create-project laravel/laravel learnlaravel5 --prefer-dist v5.3.*
> 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/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'); }); });
php artisan make:middleware checkAge
<?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); } }
protected $routeMiddleware = [ 'checkAge'=>\App\Http\Middleware\AuthorityAuth::class, ];
php artisan make:controller Admin/LoginController.php
Route::get('foo', 'Admin\LoginController@method');
use Illuminate\Support\Facades\Response;
return response()->json($return_value); return response()->jsonp($return_value);
return response($content) ->header('Content-Type', $type) ->header('X-Header-One', 'Header Value') ->header('X-Header-Two', 'Header Value');
return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
php artisan make:request LoginRequest
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', ]; }
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);
生成文件php
php artisan make:command Task #app/Console/Commands目录下会生成一个Task.php文件
打开文件 并编辑 修改文件以下css
protected $signature = 'Task:Calculate'; ##命令 protected $description = 'Calculate Data'; ##描述 public function handle() { sleep(1); echo "Calculate Data"; ##计算任务 }
注册命令vue
## 编辑 app/Console/Kernel.php protected $commands = [ \App\Console\Commands\Task::class ];
查看命令linux
root@ubuntu:/www# php artisan --list | grep Task Task Task:Calculate Calculate Data
运行命令laravel
php artisan Task:Calculate ##输出calculate data
laravel 实现了 IOC注册了特定的服务 这里经过curl插件作一下演示 服务提供者须要在每一个环境下都要加载,只要把它放在这个数组下面就能够了
1.安装web
composer require ixudra/curl ##经过composer安装插件
2.注册服务sql
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();
但愿根据不一样环境加载 则编辑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文件中
使用数据库来驱动队列json
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());
- 编辑.env文件QUEUE_DRIVER=database
{ "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.
为了防止队列挂掉 则能够配合守护进程