首页 > 后端开发 > php教程 > 使用Laravel建立休息资源

使用Laravel建立休息资源

William Shakespeare
发布: 2025-02-20 11:50:10
原创
516 人浏览过

使用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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板