在Laravel裏,主要是對請求和響應作了對象化處理,因此要充分理解對象化編程的理念。php
從這裏開始要講Http的請求和響應,要先對http協議進行充分的預習和了解。html
在Laravel裏,主要是對請求和響應作了對象化處理,因此要充分理解對象化編程的理念。laravel
咱們的一個表單中提交上來的信息,是怎麼傳送到控制器裏進行處理的呢?編程
先來看個路由:api
Route::post('user', 'UserController@store');
這個路由就是用來提交表單信息的,接下來咱們來看看UserController中怎麼寫: 傳統的寫法:數組
<?phpnamespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Input; class UserController extends Controller { public function store() { $name = Input::get('name'); // } }
這裏的Input::get('name');就至關於php 的$_GET('name');下面咱們來看用Request對象怎麼寫:session
<?phpnamespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class UserController extends Controller { public function store(Request $request) { $name = $request->input('name'); // } }
這裏又出現了Request $request這種控制器方法依賴注入的寫法,看文檔就是有這個問題,好多概念不分前後,混在一塊兒講;總之你須要知道這樣寫,就能夠獲得一個$request對象。使用對象後,比起只是用$_GET('name');取得一個值,功能要強大不少,後面會有講到;
post
Request $request 這種(Typehint)寫法,其實不是輸入一個參數,而是注入了一個 對象,可是若是我要加入參數怎麼辦:寫在後面!:url
路由spa
Route::put('user/{id}', 'UserController@update');
控制器
<?phpnamespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class UserController extends Controller { public function update(Request $request, $id) { // } }
獲取發出請求的完整URL:
$url = $request->url();
獲取URL相對路徑:
$uri = $request->path();
判斷請求是否來自某個url:
if ($request->is('admin/*')) { // }
$method = $request->method(); if($request->isMethod('post')) { // }
$name = $request->input('name');
若是你不能肯定有沒有這個name,你能夠:
$name = $request->input('name', 'Sally');
這樣就能夠在name沒有的狀況下設置一個name及其默認值; 若是傳過來的是個數組:
$input = $request->input('products.0.name');
你能夠用這種方式取值,超級方便。
取所有值
$input = $request->all();
這將獲得一個數組;
限制取值
$input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card');
表單提交數據,通常刷新後就沒了,有時候你須要重複使用它們,通常能夠放它們放到Session裏:
$request->flash();
相似以前的知識,咱們能夠對request的值作一些限制:
$request->flashOnly('username', 'email'); $request->flashExcept('password');
更多的應用是在重定向的時候:
return redirect('form')->withInput(); return redirect('form')->withInput($request->except('password'));
withInput() 就能夠把request裏所有的值發給Session,若是須要進行一些限制,能夠這樣寫withInput($request->except('password'));
$username = $request->old('username');
在視圖中(這裏還沒講到blade模板,先記着),能夠在表單中這樣寫:
<input name="username" value="{{ old('username') }}"/>
這樣若是用戶表單填錯了,再重定向返回的時候,表單就能夠記住上次用戶輸入的數據;
文件請求是一種特殊的請求,涉及到文件在磁盤上的操做;
$file = $request->file('photo');
這裏獲取到的是一個文件對象;
if ($request->hasFile('photo')) { // }
if ($request->file('photo')->isValid()) { // }
$request->file('photo')->move($destinationPath); $request->file('photo')->move($destinationPath, $fileName);
$destinationPath 必須是一個完整的磁盤路徑,後面能夠加個$fileName給文件重命名;
對於上傳文件的操做還有一系列Api,請參考:Symfony\Component\HttpFoundation\File\UploadedFile
參考原文:http://laravelbase.com/collections/1/39