9月17日知識點記錄


一.Laravel控制器

基礎控制器(組織請求處理邏輯)

通過路由來指定控制器行為:
Route::get('user/{id}','UserController@showProfile');//路由所帶參數也會被傳遞到showProfile方法
命名控制器路由:
Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
$url = route('name')//生成命名控制器路由的 URL
$url = action('FooController@method');//生成指向控制器行為的 URL
$action = Route::currentRouteAction();//取到正在運行的控制器行為名稱

中間件和控制器:

Route::get('profile', [
    'middleware' => 'auth',
    'uses' => 'UserController@showProfile'
]);//將 中間件 指定給控制器路由

在控制器構造器中使用 middleware 方法,你可以很容易地將中間件指定給控制器。你甚至可以對中間件作出限制,僅將它提供給控制器類中的某些方法。

 public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);

        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
}

RESTful 資源控制器資源

控制器讓你可以輕松地創建與資源相關的 RESTful 控制器,
使用 make:controller Artisan 命令,我們可以快速地創建一個像這樣的控制器
php artisan make:controller 控制器名稱
Route::resource('photos', 'PhotosController');//在控制器中注冊資源化路由
這一條路由聲明會創建多個路由,用來處理各式各樣和相片資源相關的的 RESTful 行為。同樣地,生成的控制器有著各種和這些行為綁定的方法,包含要處理的 URI 及方法對應的注釋。
由資源控制器處理的行為:

動詞 路徑 行為(方法) 路由名稱
GET /photos index photo.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

部分資源路由:(聲明資源路由時,你可以指定讓此路由僅處理一部分的行為)

Route::resource('photos', 'PhotosController',
                ['only' => ['index', 'show']]);
Route::resource('photos', 'PhotosController',
                ['except' => ['create', 'store', 'update', 'destroy']]);

命名資源路由(所有的資源控制器行為默認都有路由名稱;不過你可以在選項中傳遞一個 names 數組來重寫這些名稱)
Route::resource('photos', 'PhotosController', ['names' => ['create' => 'photo.build']]);
嵌套資源(有時你可能會需要定義「嵌套」資源路由。例如,相片資源可能會附帶多個「評論」。要「嵌套」此資源控制器,可在路由聲明中使用「點」記號)
Route::resource('photos.comments', 'PhotoCommentController');//photos/{photos}/comments/{comments}通過類示URL訪問
附加資源控制器(如果想在資源控制器中默認的資源路由之外加入其它額外路由,則應該在調用 Route::resource 之前 定義這些路由。否則,由 resource 方法定義的路由可能會不小心覆蓋你附加的路由)

隱式控制器

通過定義單個路由來處理控制器類中的各種行為,
使用 Route::controller 方法來定義路由
Route::controller('users', 'UserController');//controller 方法接受兩個參數。第一個參數是控制器所處理的基本 URI,第二個是控制器的類名稱
只要在控制器中加入方法。方法的名稱應由它們所響應的 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()
    {
        //
    }
}

分派路由名稱
命名控制器中的某些路由,可以在 controller 方法中傳入一個名稱數組作為第三個參數
Route::controller('users', 'UserController', [ 'getShow' => 'user.show', ]);

依賴注入與控制器

構造器注入
方法注入...都不太懂

路由緩存

若你的應用程序完全通過控制器使用路由,你可以利用 Laravel 的路由緩存。使用路由緩存可以大幅降低注冊全部路由所需的時間。
要生成路由緩存,只要運行 route:cache 此 Artisan 命令
php artisan route:cache
這就可以了!現在你的緩存路由文件將被用來代替 app/Http/routes.php 這一文件。請記得,若你添加了任何新的路由,就必須生成新的路由緩存。因此你可能希望只在你的項目部署時才運行 route:cache 這一命令。
要移除緩存路由文件而不生成新的緩存,請使用 route:clear 命令
php artisan route:clear

二.Laravel請求

獲取請求:要通過依賴注入的方式獲取 HTTP 請求的實例,就必須在控制器的構造器或方法中,使用 Illuminate\Http\Request 類型提示

public function store(Request $request)
{
    $name = $request->input('name');

    //
}

如果控制器方法也有輸入數據是從路由參數傳入的,只需將路由參數置于其它依賴之后
EP:Route::put('user/{id}', 'UserController@update');

public function update(Request $request, $id)
{
    //
}

基本請求信息:Illuminate\Http\Request 的實例提供了多種方法來用于檢查應用程序的 HTTP 請求。Larevel 的 Illuminate\Http\Request 繼承了 Symfony\Component\HttpFoundation\Request 類
獲取請求的 URI

$uri = $request->path();//path 方法會返回請求的 URI;
if ($request->is('admin/*')) {
     //is 方法可以驗證接收到的請求 URI 與指定的規則是否相匹配,*號為通配符
}
$url = $request->url();//使用 url 方法,可以獲取完整的網址

獲取請求的方法

$method = $request->method();//method方法會返回此次請求的http動作
if ($request->isMethod('post')) {
    //isMethod方法來驗證http動作是否和指定的字符串是否相匹配
}

獲取輸入數據

特定值:$request->input('name');``$request->字段名;
$request->input('name', 'Sally');//第二個參數中傳入一個默認值。當請求的輸入數據不存在于此次請求時,就會返回默認值
$request->input('products.0.name');//如果是「數組」形式的輸入數據,則可以使用「點」語法來獲取數組
$request->has('name')//確認是否有值
$input = $request->all();//獲取所有輸入數據
如果想獲取輸入數據的子集,則可以使用 only 及 except 方法。這兩個方法都接受單個數組或是動態列表作為參數
$input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card');
舊輸入數據:Laravel 可以讓你將本次的輸入數據保留到下一次請求發送前。對于在表單驗證失敗后重新填入表單值相當有用
將輸入數據閃存至 Session$request->flash();
$request->flashOnly('username', 'email'); $request->flashExcept('password');//數據的子集保存至 Session
閃存輸入數據至 Session 后重定向return redirect('form')->withInput(); return redirect('form')->withInput($request->except('password'));
獲取舊輸入數據->若要獲取上一次請求后所閃存的輸入數據,則可以使用Request
實例中的old方法。old方法提供一個簡便的方式從 Session 取出被閃存的輸入數據
$username = $request->old('username');
Laravel 也提供了全局輔助函數old。如果你要在 Blade 模板 中顯示舊輸入數據,可以使用更加方便的old輔助函數{{ old('username') }}
從請求中取出Cookie值$value = $request->cookie('name');

上傳文件

獲取上傳文件,可以使用 Illuminate\Http\Request 實例中的 file 方法獲取上傳的文件。file 方法返回的對象是 Symfony\Component\HttpFoundation\File\UploadedFile 類的實例,該類繼承了 PHP 的 SplFileInfo 類,并提供了許多和文件交互的方法
$file = $request->file('photo');
$request->hasFile('photo')//確認上傳的文件是否存在
$request->file('photo')->isValid()//驗證上傳的文件是否有效
$request->file('photo')->move($destinationPath); $request->file('photo')->move($destinationPath, $fileName);//將文件從緩存位置(由你的 PHP 配置決定)移動至你指定的永久保存位置

三.視圖

視圖包含你應用程序所用到的 HTML,它能夠將控制器和應用程序邏輯在呈現邏輯中進行分離。視圖被存在 resources/views 目錄下
因為這個視圖被保存在 resources/views/greeting.php,所以我們可以像這樣使用全局的輔助函數 view 來返回
Route::get('/', function () { return view('greeting', ['鍵' => '值']); });//view 輔助函數的第一個參數會對應到 resources/views 目錄內視圖文件的名稱;傳遞到 view 輔助函數的第二個參數是一個能夠在視圖內取用的數據數組
視圖文件也可以被存放在 resources/views 的子目錄內。. (小數點)的表示法可以被用來表示在子目錄內的視圖文件
return view('home.user.index', $data);
判斷視圖文件是否存在
view()->exists('emails.customer')//在視圖文件存在時返回 true
return view('greetings', ['name' => 'Victoria']);//傳遞一個數組的數據給視圖
$view = view('greeting')->with('name', 'Victoria');//使用 with 來傳遞額外數據給視圖

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容