# laravel筆記

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

創(chuàng)建軟連接 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.****創(chuàng)建控制器********
終端輸入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,指向當前執(zhí)行的PHP腳本所在的目錄。
例如當前執(zhí)行的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;

/**
 * 創(chuàng)建新的控制器實例。
 *
 * @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.企業(yè)賬戶
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用戶開發(fā)者可以在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 本身使用中間件來驗證用戶的身份,如果用戶未通過身份驗證,中間件將會把用戶導向登錄頁面,反之,當用戶通過了身份驗證,中間件將會通過此請求并接著往下執(zhí)行。
當然,除了身份驗證之外,中間件也可以被用來運行各式各樣的任務,CORS 中間件負責替所有即將離開程序的響應加入適當的標頭。而日志中間件則可以記錄所有傳入應用程序的請求。
Laravel 框架已經內置了一些中間件,包括維護、身份驗證、CSRF 保護,等等。所有的中間件都放在 app/Http/Middleware 目錄內。

#****創(chuàng)建中間件
要創(chuàng)建一個新的中間件,則可以使用 ****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 部分。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容