首頁 > 後端開發 > php教程 > 使用Laravel建立休息資源

使用Laravel建立休息資源

William Shakespeare
發布: 2025-02-20 11:50:10
原創
521 人瀏覽過

使用Laravel建立休息資源

在這一部分中,我們將開始使用REST接口。在Laravel上創建REST API並不是很困難。我們需要記住的是,我們正在與Emberjs打交道,並且我們不想從頭開始寫一個新的適配器。像往常一樣,您可以在github上找到此部分的源代碼。

>

鑰匙要點

    >使用ember.js約定在用laravel構建REST API時確保兼容並簡化開發過程。
  • >使用工匠命令行工具在Laravel中創建資源控制器,以有效地管理靜止資源,而無需手動定義CRUD操作。
  • >通過在Laravel中的特定名稱空間中分組,增強API結構和可訪問性,可以有效地組織路線。 >
  • >在控制器中實現錯誤處理和響應格式以管理數據檢索並確保強大的API端點。
  • >利用Laravel的雄辯和API資源類別將模型數據轉換為JSON響應,從而促進了與Ember.js等前端框架的輕鬆集成。
  • 從哪裡開始?
  • 這是一個很難的問題。 Ember擁有自己的工作流程和邏輯。如果我們開始牢記這種邏輯來寫下我們的休息,我們將節省一些時間,我們將擁有一個不錯的體系結構和可重複使用的東西。我認為Ember在其休息建築上做出了不錯的選擇。看看Ember如何期望數據。
  • >
>假設我們要檢索用戶。 Ember期望這樣的事情:

如果我們想檢索用戶列表,Ember會期望這樣的JSON:>

第一個需要“用戶”,但是第二個需要“用戶”。第二個是複數。 Ember也為此規定了一些規則。如果您沒有通過以下方式自己指定複數

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }
登入後複製
登入後複製
登入後複製
登入後複製
emberjs將做出假設並要求“公式”。有時候,框架本身提供了這樣的東西很高興,但是另一方面,如果您忘記了這些細節,事情可能會失控。

在與Ember更深入的風險之前,警告:Ember是困難而強大的。花點時間學習它的工作原理。

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }
登入後複製
登入後複製
登入後複製
登入後複製
如果我們使事情有些複雜並在對象之間放置一些關係,例如,我們說用戶有一些照片。我們將如何輸出?

>

Ember.Inflector.inflector.irregular('formula', 'formulae');
登入後複製
登入後複製
登入後複製
這是一個一對多的關係。如果我們要求用戶,他的照片也將被拉。我們已經在拉拉維爾(Laravel)建立了一些關係,如果您想要並在Ember上消耗這些關係,可以使用它們。

>

>我從Ember開始,看看該框架如何想要數據。如果您知道如何構建結構,那就容易了。驗證和從數據庫中獲取數據很容易,但是建立一個可靠的REST接口和一個智能的界面,這是困難的部分。

準備其餘的

當您開發某些東西時,模型可能會非常有幫助。即使您是一名大師程序員,並且討厭處理Photoshop或GIMP,也有很好的原型工具。我使用了balsamiq,而我的頭版原型是:

>

使用Laravel建立休息資源

讓我們開始構建它。 Open/App/views/index.php。這是我們的單頁應用程序。我們在本系列的第一部分中創建了此文件。

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }
登入後複製
登入後複製
登入後複製
登入後複製

允許我解釋這一點。 NAV標籤負責導航。帶有類標題區域的UL標籤是文本,該文本用作徽標,該徽標鏈接到應用程序的第一個級別。我還添加了一個帶有類別列表的下拉菜單。如果您想了解更多信息,請前往基礎5個文檔。在大多數情況下,它只是複制/粘貼操作,所以不必擔心此部分。 >

>另外,我在內容區域使用了Foundation的網格系統。這將充滿所有信息,並在導航時進行更改。所有內部更新將由Ember處理。我們將在這裡僅構建3個模板。一個用於用戶,一張用於一張照片,一張用於著陸頁。

>

您是否注意到我們所有的代碼都在腳本標籤中? Ember使用車把作為模板語言。文本/X Handlebars的類型是一種特殊的腳本類型。如果您使用了Ember和車把一段時間,則可能使用模板名稱。我沒有在此中指定它們,因為此模板將用作所有應用程序的容器。如果您沒有指定名稱,Ember將其用作應用程序模板。

資源控制器

>我開發了這個非常簡單的應用程序時,我發現在開發REST API時,資源控制器會派上用場。這就是其餘體系結構的重點 - 一切都是資源。所有資源都可以應用HTTP動詞:獲取,發布,刪除,put(更新)。並非所有動詞都需要。

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }
登入後複製
登入後複製
登入後複製
登入後複製
這就是我們通過工匠創建資源控制器的方式。該選項 - 除了從該控制器中刪除這兩種方法。我們不需要創建和編輯方法。創建方法處理創建該資源的圖形接口。當我們製作一個頁應用程序時,在ember之外創建視圖是不明智的。

>

>為類別創建另一個資源控制器。如您所見,僅在此控制器中提供顯示和索引方法。我認為顯示單個類別並檢索所有類別就足夠了。

>

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }
登入後複製
登入後複製
登入後複製
登入後複製

>另一個控制器是圖像控制器。為什麼如果我們已經有一個圖像控制器?因為我們需要一個終點來提供圖像。 Dropbox擁有我們的圖像,但我們無法從外部訪問它們。如果您想公開文件夾,則必須付款。那是第一個原因。第二個原因是我不希望每個圖像都公開。簡而言之,該控制器將從Dropbox中獲取圖像並將其提供給客戶端。

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }
登入後複製
登入後複製
登入後複製
登入後複製

,最後但並非最不重要的是usercontroller:

>
Ember.Inflector.inflector.irregular('formula', 'formulae');
登入後複製
登入後複製
登入後複製

路線

>現在我們擁有控制器,我們需要將這些控制器與其相關路線聯繫起來。讓我們更新 /app/routes.php。 首先,使用Route :: group。

{
      "user": {
        "id": 1,
        "name": "firstName",
        "lastname": "lastname,
        "photos": [1, 2, 3]
      },
    
      "photos": 
      [
          {
            "id": 1,
            "title": "Lorem Ipsum"
          },
          {
            "id": 2,
            "title": "Lorem Ipsum"
          }
      ]
    }
登入後複製
登入後複製
>在這裡,我們指定了一個前綴,即名稱空間。可以這樣訪問此組內部的所有內容:

>

<script type="text/x-handlebars">
    
        <!-- The navigation top-bar -->
        <nav  data-topbar>

            <ul >
                <li >
                    <h1><a href="#">Photo Upload</a></h1>
                </li>
            </ul>

            <section >

                <!-- Left Nav Section -->
                <ul >
                    <li >
                        <a href="#">Categories</a>
                        <ul >
                            <li><a href="#">Category1</a></li>
                            <li><a href="#">Category2</a></li>
                            <li><a href="#">Category3</a></li>
                            <li><a href="#">Category4</a></li>
                        </ul>
                    </li>
                </ul>

            </section>

            <div ></div>
            
        </nav><!-- END Navigation -->
        
        <!-- Content -->
        <div style="margin-top: 50px;">
            <!-- The content will be here -->
        </div><!-- END Content -->

    </script>
登入後複製
登入後複製
>另外,我們可以在該組內指定過濾器。例如,您可以添加一個auth :: Anterbasic('用戶名')過濾或創建一個並將其添加到該組中。您也可以使用其他身份驗證。

>

>在該組內添加三個控制器。 PhotoController,UserController和categoryController。

php artisan controller:make PhotoController --except=create,edit
登入後複製
登入後複製
>在該組之外添加ImageScontroller。我認為該控制器不需要一個名稱空間 - 圖像是圖像,給它們提供一個名稱空間是沒有意義的。

php artisan controller:make CategoryController --only=show,index
登入後複製
登入後複製
最後, /app/routes.php文件應該看起來像這樣:

>

php artisan controller:make ImagesController --only=show
登入後複製
請注意,由於Ember的要求,資源名稱是複數的。

填充這些控制器

>現在我們可以開始構建一些東西。我不會在這裡介紹所有的休息,因為很難解釋所有事情 - 要更深入地了解更多內容,請參閱本系列。讓我們從照相控制器開始。

index()方法應返回數據庫中的最新照片。在這裡,我們可以做一些分頁,但我不希望事情變得太複雜。如果對評論有足夠的興趣,我們將在以後的文章中更新此應用程序。

>讓我解釋一下。我將所有內容插入了嘗試,捕捉並最終阻止。如果出現問題,請返回帶有狀態代碼的其他JSON。

php artisan controller:make UserController --only=show,index
登入後複製

>從數據庫中獲取9張照片。然後,拍攝每張照片,並以格式化的數組顯示,該數組將在以後轉換為JSON格式。

<span>Route<span>::</span>group(array('prefix' => 'api/v1'), function()
</span>    <span>{
</span>        
    
    <span>});</span>
登入後複製
如果一切順利,或者雄辯沒有拋棄異常,則會顯示正確的輸出。如果要顯示特定的狀態代碼,請捕獲所有可以通過雄辯拋出的例外,並顯示正確的狀態代碼。

>讓我們立即填寫show()方法。同樣,我們想用給定的ID檢索有關照片的所有信息。

構建自己的應用程序時,請不要忘記將驗證添加到用戶輸入中。

usercontroller的邏輯幾乎相同。這次,我們將要求用戶模型。

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }
登入後複製
登入後複製
登入後複製
登入後複製

>一切幾乎相同,只有模型和字段改變。輸出JSON。表演方法看起來像這樣:

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }
登入後複製
登入後複製
登入後複製
登入後複製

此功能通過給定的ID檢索用戶。

我們要處理的最後一個控制器是ImagesController。邏輯就像從文件系統中獲取圖像並為其服務一樣簡單。當您保存文件並使用本地文件系統或服務器文件系統檢索時,這很簡單。不幸的是,您無法將文件保存到Heroku,因此您將使用Dropbox並從此端點提供這些文件。

導入Dropbox客戶端和Flysystem適配器。如果我們的環境是本地的,那麼我們將與本地適配器一起使用Flysystem;如果環境正在生產,請使用Dropbox適配器。將Flysystem類分配給該控制器內部的私人變量。

Ember.Inflector.inflector.irregular('formula', 'formulae');
登入後複製
登入後複製
登入後複製
> Show方法將為該文件提供服務,而Dosty方法將從文件系統中刪除該文件。通過使用此庫,我們在應用程序中放了一定程度的抽象。

>

{
      "user": {
        "id": 1,
        "name": "firstName",
        "lastname": "lastname,
        "photos": [1, 2, 3]
      },
    
      "photos": 
      [
          {
            "id": 1,
            "title": "Lorem Ipsum"
          },
          {
            "id": 2,
            "title": "Lorem Ipsum"
          }
      ]
    }
登入後複製
登入後複製
destroy()函數非常簡單。只需使用刪除方法選擇該文件並傳遞要刪除的文件的名稱。如果找不到文件,請返回404。

>

<script type="text/x-handlebars">
    
        <!-- The navigation top-bar -->
        <nav  data-topbar>

            <ul >
                <li >
                    <h1><a href="#">Photo Upload</a></h1>
                </li>
            </ul>

            <section >

                <!-- Left Nav Section -->
                <ul >
                    <li >
                        <a href="#">Categories</a>
                        <ul >
                            <li><a href="#">Category1</a></li>
                            <li><a href="#">Category2</a></li>
                            <li><a href="#">Category3</a></li>
                            <li><a href="#">Category4</a></li>
                        </ul>
                    </li>
                </ul>

            </section>

            <div ></div>
            
        </nav><!-- END Navigation -->
        
        <!-- Content -->
        <div style="margin-top: 50px;">
            <!-- The content will be here -->
        </div><!-- END Content -->

    </script>
登入後複製
登入後複製
最後,ImageController應該看起來像這樣:

>

php artisan controller:make PhotoController --except=create,edit
登入後複製
登入後複製
我們提供的格式是HTML。好的,這有點奇怪。我們想提供圖像,而不是HTML。但是,這不是問題,因為瀏覽器會尋找文件格式並識別如何使用該文件。

繼續嘗試創建類別controller。我把它作為適合你的練習。

測試API

>我必須承認,我愛上了phpstorm,並且在測試REST API時,我使用了稱為REST客戶端的工具。這是一個圖形界面,簡化了測試。如果需要,也可以使用終端中的捲發。讓我們進行一些測試:

php artisan controller:make CategoryController --only=show,index
登入後複製
登入後複製
這就是返回的東西:

>

使用Laravel建立休息資源

使用PhpStorm的REST客戶端,我在JSON中獲得了相同的結果。

使用Laravel建立休息資源>,如果我想以更好的格式查看結果,我可以簡單地按JS圖標,而剩下的客戶端給我更好的表示。

>

>您還可以測試其他動詞,例如DELETE和POST。繼續進行測試。您還可以使用其他客戶進行測試:REST控制台和Postman是其中兩個。第一個僅在Chrome上可用,第二個Postman可在Chrome和Firefox上使用。郵遞員似乎更簡單,更友好。繼續嘗試。

結論

Laravel簡化了使用資源控制器構建REST API的工作。我們看到瞭如何通過使用Ember慣例構建界面。 Ember選擇了一個良好的界面,並堅持使用該邏輯,您可以輕鬆地在其他平台上重複使用代碼。

在這一部分中,我更多地關注概念,並且沒有做太多的編碼。填寫所有方法並添加驗證將不必要地擴展此帖子,而該帖子已經足夠長,並且在一個長系列中。開發時,您應始終驗證輸入。不要忘記它,測試,測試,測試。測試應該是您最好的朋友。

在本系列的最後一期中,我們將將它們全部放在一個功能齊全的實時應用程序中。

常見問題有關用Laravel

建立休息資源的問題

>如何在laravel中創建一個資源控制器?該命令是PHP Artisan Make:Controller Controllername -Resource。將“ ControlerName”替換為要給控制器的名稱。此命令將使用用於所有必要的CRUD操作的方法創建一個控制器。請記住,控制器的名稱應以單數形式,應該是有效的PHP類名稱。

>我如何使用Laravel API資源?

使用Laravel API資源,您首先需要創建資源類。可以使用Artisan Command Php Artisan Make:Resource ResourceName來完成此操作。創建資源類後,您可以在資源的Toarray方法中定義轉換。要從路線返回資源,您只需返回資源類的新實例,傳遞要轉換的數據。

如何自定義Laravel資源返回的數據? 🎜>您可以通過修改資源類中的Toarlay方法來自定義Laravel資源返回的數據。 ToArray方法是將雄辯的模型屬性映射到API響應屬性的地方。您可以根據需要添加,刪除或更改屬性。

在Laravel中的資源和集合之間有什麼區別?

在Laravel中,資源類代表一個單個模型,需要將其轉換為JSON結構,而資源收集類代表集合資源。資源集合用於將模型或集合轉換為JSON。 Artisan Command Php Artisan Make:Resource ResourceCenameCollection-收集。這將創建一個資源集合類,您可以在其中定義集合的轉換。

>如何從Laravel的路由返回資源集合?在Laravel中,您只需返回資源收集類的新實例,傳遞了要轉換的模型集合。

我可以將元數據添加到Laravel中的資源響應中嗎?是的,你可以將元數據添加到Laravel中的資源響應中。這可以通過定義資源上的方法來完成。使用方法應返回要在響應中包含的元數據數組。

>我如何處理laravel資源中的條件屬性?

laravel Resources提供一種方法時,有條件地將屬性添加到資源響應中。當方法接受兩個參數:確定是否應包括屬性的條件,以及屬性的值,如果條件為真。是的,Laravel Resources與Laravel的內置分頁完美搭配。當您分解Laravel雄辯的查詢時,Laravel將自動返回JSON響應,其中包括分頁結果以及分頁鏈接。如果要自定義分頁響應,則可以使用資源集合。

>

以上是使用Laravel建立休息資源的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板