0.1配置
1.模板继承
2.控制器
3.git
4.支付宝支付的流程
5.路由
6.中间件
7.请求
8.laravel 学习笔记 —— 神奇的服务容器
PHPStrom注册码获取:在"http://idea.qinxi1992.cn/"网址上获取
更新php curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6
1.通过Artisan命令make:provider可以简单生成一个新的提供者:
php artisan make:provider RiakServiceProvider
2.安装调试工具 composer require barryvdh/laravel-debugbar
创建软连接 ln -s /etc/apache2/mods-available/rewrite.load ./mods-enabled/
在config/app.php 中的服务提供者列表中添加 Barryvdh\Debugbar\ServiceProvider::class, 在别名配置数组中添加
'Debugbar' => Barryvdh\Debugbar\Facade::class,
在终端输入:php artisan vendor:publish
连接远程mysql mysql -h 192.168.1.133 -uadmin -p
公钥在家目录下面 cd ~/.ssh
安装redis:composer require predis/predis 1.0.*
字符串序列号base64_encode(string) 反序列化base64_decode(string)
3.卸载MYSQL brew unlink mysql
laravel官网 https://laravel.com/
laravel中文文档 http://laravel-china.org
1.配置<span id="0.1"></span>top
1.先下载composer:https://getcomposer.org/download/
2.将composer指令移动到bin目录下,同时修改composer.phar为composer sudo mv composer.phar /usr/local/bin/composer
3.赋权限 chmod +x /usr/local/bin/composer
1.模板继承<span id="1"></span>top
****1.****@extends('laout.app')
继承模板
****2.****@yield('content')
,是模板中要被替换的部分
在新的模板中用@section('content)
之间写要替换的部分$endsection
****3.****@include('inc.nav')
包含模板
在替换的莫版内,如果不希望html标签被转译,使用大括号内两个感叹号
@section
<p>{!! spdt_content->content !!}</p>
@endsection
这个时候打印出来的是“<p>内容</p>”
需要解析用双括号 <p>{{ spdt_content->content }}</p> 打印出来“内容”
PHP中两种跳转页面的方式
1.header("location:index.html") //PHP前不能有输出
2.echo "<script>location='index.html'</script>"; //什么时候都可以跳转
模板里面取图片的值:http://{{env('QINIU_DOMAIN')}}/{{$data['pic']}}
2.控制器<span id="2"></span>top
****1.****创建控制器********
终端输入php artisan make:controller ServerController
****2.****控制器路由********
Route()::get('/',HomeController@index)
表示访问的是HomeController控制器里面的index方法
HomeController控制器里面加载home模板
public function index(){
return view('home');
}
<?php
$dir = dirname(FILE);
?>
在PHP5.3中,增加了一个新的常量DIR,指向当前执行的PHP脚本所在的目录。
例如当前执行的PHP文件为 /www/website/index.php
则FILE等于'/www/website/index.php'
而DIR等于'/www/website'
现在我们要包含当前文件目录或子目录下的文件,可以直接使用:
<?php
require_once DIR . '/path/to/test.inc.php';
?>
****3.****控制器中间件********
Route::get('profile', [
'middleware' => 'auth',
'uses' => 'UserController@showProfile'
]);
不过,在控制器构造器中指定中间件会更为方便。在控制器构造器中使用 ****middleware**** 方法,你可以很容易地将中间件指定给控制器。你甚至可以对中间件作出限制,仅将它提供给控制器类中的某些方法。
class UserController extends Controller
{
/**
* 添加一个 UserController 实例。
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log', ['only' => [
'fooAction',
'barAction',
]]);
$this->middleware('subscribed', ['except' => [
'fooAction',
'barAction',
]]);
}
}
****4.****由资源控制器处理的行为********
动词 | 路径 | 行为(方法) | 路由名称 |
---|---|---|---|
GET | ****/photo**** | index | photo.index |
GET | ****/photo/create**** | create | photo.create |
POST | ****/photo**** | store | photo.store |
GET | ****/photo/{photo}**** | show | photo.show |
GET | ****/photo/{photo}/edit**** | edit | photo.edit |
PUT/PATCH | ****/photo/{photo}**** | update | photo.update |
DELETE | ****/photo/{photo}**** | destroy | photo.destroy |
Remember, since HTML forms can't make PUT, PATCH, or DELETE requests, you will need to add a hidden _method field to spoof these HTTP verbs:<input type="hidden" name="_method" value="PUT">
****5.****部分资源路由********
声明资源路由时,你可以指定让此路由仅处理一部分的行为:
Route::resource('photo', 'PhotoController', ['only' => [
'index', 'show'
]]);
Route::resource('photo', 'PhotoController', ['except' => [
'create', 'store', 'update', 'destroy'
]]);
****6.****命名资源路由********
所有的资源控制器行为默认都有一路由名称;不过你可以在选项中传递一个 ****names**** 数组来重写这些名称:
Route::resource('photos', 'PhotosController',
['names' => ['create' => 'photo.build']]);
/user/{admin_user}
Route::resource('user', 'AdminUserController', ['parameters' => [
'user' => 'admin_user'
]]);
****7.****附加资源控制器********
如果想在资源控制器中默认的资源路由之外加入其它额外路由,则应该在调用 ****Route::resource**** 之前 定义这些路由。否则,由 ****resource**** 方法定义的路由可能会不小心覆盖你附加的路由:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
8.隐式控制器
Laravel 让你能够轻易地通过定义单个路由来处理控制器类中的各种行为。首先,使用 ****Route::controller**** 方法来定义路由。****controller**** 方法接受两个参数。第一个参数是控制器所处理的基本 URI,第二个是控制器的类名称
Route::controller('users', 'UserController');
接下来,只要在控制器中加入方法。方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成:
<?php
namespace App\Http\Controllers;
class UserController extends Controller
{
/**
* 响应对 GET /users 的请求
*/
public function getIndex()
{
//
}
/**
* 响应对 GET /users/show/1 的请求
*/
public function getShow($id)
{
//
}
/**
* 响应对 GET /users/admin-profile 的请求
*/
public function getAdminProfile()
{
//
}
/**
* 响应对 POST /users/profile 的请求
*/
public function postProfile()
{
//
}
}
正如你在上述例子中所看到的,index 方法会响应控制器所处理的根 URI,在这个例子中是 users。
分派路由名称
如果你想要 命名 控制器中的某些路由,你可以在 controller 方法中传入一个名称数组作为第三个参数:
Route::controller('users', 'UserController', [
'getShow' => 'user.show',
]);
##9.****依赖注入与控制器
一.构造器注入
Laravel ********服务容器******** 用于解析所有的 Laravel 控制器。因此,在此构造器中,你可以对控制器需要的任何依赖使用类型提示。依赖会自动被解析并注入控制器实例之中。
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;
class UserController extends Controller
{
/**
* 用户保存库实例。
*/
protected $users;
/**
* 创建新的控制器实例。
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
}
当然,你也可以对任何的 Laravel contract 使用类型提示。若容器能够解析它,你就可以使用类型提示。
二.方法注入
除了构造器注入之外,你也可以对控制器行为方法的依赖使用类型提示。例如,让我们对 Illuminate\Http\Request 实例的其中一个方法使用类型提示:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 保存一个新的用户。
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
若你想要控制器方法能预期从路由参数获得输入值,只要在你其它的依赖之后列出路由参数即可。例如,如果你的路由被定义成这个样子:
Route::put('user/{id}', 'UserController@update');
你依然可以做 ****Illuminate\Http\Request**** 类型提示并通过类似下面例子这样来定义你的控制器方法,访问你的路由参数 ****id****
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 更新指定的用户。
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
##10.****路由缓存
********注意:**** ****路由缓存并不会作用在基于闭包的路由。要使用路由缓存,你必须将所有闭包路由转换为控制器类。********
若你的应用程序完全通过控制器使用路由,你可以利用 Laravel 的路由缓存。使用路由缓存可以大幅降低注册你应用程序全部的路由所需的时间。在某些情况下,你的路由注册甚至可以快上一百倍!要生成路由缓存,只要运行 ****route:cache**** 此 Artisan 命令:
php artisan route:cache
这就可以了!现在你的缓存路由文件将被用来代替 ****app/Http/routes.php**** 这一文件。请记得,若你添加了任何新的路由,就必须生成新的路由缓存。因此你可能希望只在你的项目部署时才运行 ****route:cache**** 这一命令。
要移除缓存路由文件而不生成新的缓存,请使用 ****route:clear**** 命令:
php artisan route:clear
3.<span id="3">git</span>top
echo "# lesson -laravel(17课)" >> README.md //
git init
git add README.md
git commit -m 'first commit'
git remote add origin https://github.com/q646448149/workspace.git//关联远程连接
git push -u origin master//关联后,我们将代码push到git服务器上
4.<span id="4"></span>支付宝支付流程top
支付宝文档网站 https://doc.open.alipay.com
必备条件:
1.实名认证
2.企业账户
3.签约手机支付功能
流程
1.RSA私钥及公钥的生成
https://doc.open.alipay.com/doc2/detail?treeld=4&articleld=103242&docType=1
openssl //进入openssl
genrsa -out rsa private key.pem 1024
rsa -in rsa private key.pem -pbuout -out rsa public key.pem
Windows用户开发者可以在OpenSSL官方网站下载
Windows的OpenSSL安装包进行安装。
http://www.openssl.org/
1.支付宝商户后套上传rsa_public_key.pem,生成alipay_public_key.pem,格式要一直
2.替换demo中的参数和pem文件
3。唤起支付
##5.****路由****<span id="5"></span>****top
5-1.基本路由
5-2.为多重动作注册路由
5-3.生成URLs路由
5-4.路由参数
5-5.正则表达式限制参数
5-6.路由命名
5-7.路由群组和命名路由
5-8.路由群组
路由的参数都会被放在「大括号」内。当运行路由时,参数会通过路由闭包
来传递。
内网地址改成外网 $notify_url = "http://".$_SERVER['HTTP_HOST'].'/service/pay/notify';
1.基本路由<span id="5-1"></span>T
uri指的是地址后面的参数
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Route::get('/', function () {
return 'Hello World';
});
Route::post('foo/bar', function () {
return 'Hello World';
});
Route::put('foo/bar', function () {
//
});
Route::delete('foo/bar', function () {
//
});
2.为多重动作注册路由<span id="5-2"></span>T
Route::match(['get', 'post'], '/', function () {
return 'Hello World';
});
或者,你甚至可以通过 any 方法来使用注册路由并响应所有的 HTTP 动作:
Route::any('foo', function () {
return 'Hello World';
});
3.生成URLs路由<span id="5-3"></span>T
你可以通过 url 辅助函数生成应用程序路由:
$url = url('foo');
4.路由参数<span id="5-4"></span>T
有时候你可能需要指定路由参数,但是让路由参数的存在是可选的。这时可以在参数名称后面加上 ? 来实现:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
5.正则表达式限制参数<span id="5-5"></span>T
你可以在路由实例上使用 where
方法来限制路由参数格式。where 方法接受参数的名称和定义参数应该如何被限制的正则表达式:
Route::get('user/{name}', function ($name) {
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})
->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
6.命名路由<span id="5-6"></span>T
1.命名路由让你可以更方便的为特定路由生成 URL 或进行重定向。你可以使用as
数组键指定名称到路由上:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
2.还可以指定路由名称到控制器动作:
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
3.除了可以在路由的数组定义中指定路由名称外,你也可以在路由定义后方链式调用 name 方法:[等同于2的效果]
Route::get('user/profile', 'UserController@showProfile')->name('profile');
7.路由群组和命名路由<span id="5-7"></span>T
如果你使用了 路由群组
,那么你可以在路由群组的属性数组中指定一个as
关键字,这将允许你为路由群组中的所有路由设置相同的前缀名称:
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// 路由名称为「admin::dashboard」
}]);
});
对命名路由生成 URLs#
一旦你在指定的路由中分配了名称,则可通过 route 函数来使用路由名称生成 URLs 或重定位:
$url = route('profile');
$redirect = redirect()->route('profile');
如果路由定义了参数,那么你可以把参数作为第二个参数传递给 route 方法。指定的参数将自动加入到 URL 中:
Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
//
}]);
$url = route('profile', ['id' => 1]);
8.路由群组<span id="5-8"></span>T
路由群组允许你共用路由属性,例如:中间件、命名空间,你可以利用路由群组到多个路由中套用这些属性,而不需在每个路由上都设置一次。共用属性被指定为数组格式,当作****Route::group**** 方法的第一个参数:
1.中间件---
要想指定中间件到所有群组内的路由中,则可以在群组属性数组里使用 middleware
参数。中间件将会依照列表内指定的顺序运行:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// 使用 Auth 中间件
});
Route::get('user/profile', function () {
// 使用 Auth 中间件
});
});
2.命名空间#
另一个常见的例子是,指定相同的 PHP 命名空间给控制器群组。可以使用 ****namespace**** 参数来指定群组内所有控制器的命名空间:
Route::group(['namespace' => 'Admin'], function()
{
// 控制器在「App\Http\Controllers\Admin」命名空间
Route::group(['namespace' => 'User'], function()
{
// 控制器在「App\Http\Controllers\Admin\User」命名空间
});
});
请记住,默认 ****RouteServiceProvider**** 会在命名空间群组内导入你的 ****routes.php**** 文件,让你不用指定完整的 ****App\Http\Controllers**** 命名空间前缀就能注册控制器路由。所以,我们只需要指定在基底 ****App\Http\Controllers**** 根命名空间之后的部分命名空间。
3.路由前缀
通过路由群组数组属性中的 ****prefix****,在路由群组内为每个路由指定的 URI 加上前缀。例如,你可能想要在路由群组中将所有的路由 URIs 加上前缀 ****admin****:********
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// 符合「/admin/users」URL
});
});
你也可以使用 prefix 参数去指定路由群组中共用的参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// 符合 accounts/{account_id}/detail URL
});
});
#6.****中间件****<span id="6"></span>****top
#****简介
HTTP 中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 本身使用中间件来验证用户的身份,如果用户未通过身份验证,中间件将会把用户导向登录页面,反之,当用户通过了身份验证,中间件将会通过此请求并接着往下执行。
当然,除了身份验证之外,中间件也可以被用来运行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的标头。而日志中间件则可以记录所有传入应用程序的请求。
Laravel 框架已经内置了一些中间件,包括维护、身份验证、CSRF 保护,等等。所有的中间件都放在app/Http/Middleware
目录内。
#****创建中间件
要创建一个新的中间件,则可以使用 ****make:middleware**** 这个 Artisan 命令:
php artisan make:middleware AgeMiddleware
此命令将会在 ****app/Http/Middleware**** 目录内设定一个名称为 ****AldMiddleware**** 的类。在这个中间件内我们只允许请求的 age 变量大于 200 时才能访问路由,否则,我们会将用户重定向到「home」这个 URI 上。
<?php
namespace App\Http\Middleware;
use Closure;
class AgeMiddleware
{
/**
* 运行请求过滤器。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') <= 200) {
return redirect('home');
}
return $next($request);
}
}
如你所见,若是 age 小于 200,中间件将会返回 HTTP 重定位给用户端,否则,请求将会进一步传递到应用程序。只需调用带有 $request 的 $next 方法,即可将请求传递到更深层的应用程序(允许通过中间件)。
HTTP 请求在实际碰触到应用程序之前,最好是可以层层通过中间件。每一层都可以对请求进行检查,甚至完全拒绝请求。
##****前置中间件**** / ****后置中间件
<?php //前置中间件
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// 运行动作
return $next($request);
}
}
<?php //后置中间件
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 运行动作
return $response;
}
}
#7.****请求****<span id="7"></span>****top
##****获取请求
要通过依赖注入的方式获取 HTTP 请求的实例,就必须在控制器的构造器或方法中,使用 ****Illuminate\Http\Request**** 类型提示。当前的请求实例便会自动由 ********服务容器********注入:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 保存新的用户。
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
#8.****服务容器****<span id="8"></span>****top
容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是********对象、对象的描述(类、接口)或者是提供对象的回调********,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 “解耦” 、“依赖注入(DI)”。本文就从这里开始。
面向对象编程,有以下几样东西无时不刻的接触:接口、类还有对象。这其中,**接口是类的原型**,一个类必须要遵守其实现的接口;**对象则是一个类实例化后的产物**,我们称其为一个实例。当然这样说肯定不利于理解,我们就实际的写点中看不中用的代码辅助学习。
对,一个类要被容器所能够提取,必须要先注册至这个容器。既然 laravel 称这个容器叫做服务容器,那么我们需要某个服务,就得先注册、绑定这个服务到容器,那么提供服务并绑定服务至容器的东西,就是 服务提供者(ServiceProvider)。
服务提供者主要分为两个部分,register(注册) 和 boot(引导、初始化),具体参考文档。register 负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot 部分。