# laravel笔记

0.119字数 4146阅读 403

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 部分。

推荐阅读更多精彩内容