代码之家  ›  专栏  ›  技术社区  ›  Luca Cattide

Laravel 5.6-路由API资源404错误

  •  1
  • Luca Cattide  · 技术社区  · 8 年前

    深入查看 official docs ,我阅读了有关使用 apirources 更精确地定义API控制器的路由的内容-尤其是如果它们不包含任何HTML。这是我的情况。

    我正在进行一个Laravel5.6项目,该项目使用Ajax来获取 vue>components中的数据。直到今天,我一直在使用普通的控制器-放置在 /app/http/controllers 中,并使用 route::resources 在 /routes/web.php中声明。

    直到今天,当我试图将它们重构为docs建议时,它一直工作得很好,如下所示:

    /app/http/controllers/api/itemcontroller.php 。

    <?PHP
    
    //定义命名空间
    //之前:app\http\controllers;
    命名空间应用程序\http\controllers\api;
    
    使用app\item;
    使用照明\http\request;
    //重构后添加
    使用app\http\controllers\controller;
    将app\http\resources\item用作itemresource;
    
    类itemController扩展控制器
    {
    /**
    *显示资源列表。
    *
    *@返回\照亮\http\response
    */
    公共功能索引()
    {
    返回itemresource::collection(item::all());
    }
    
    /**
    *将新创建的资源存储在存储器中。
    *
    *@参数\照亮\http\request$request
    *@返回\照亮\http\response
    */
    公共函数存储(请求$REQUEST)
    {
    $item=new item();
    
    $item->codice=$request->codice;
    $item->data_acquisto=$request->data_acquisto;
    $item->serial=$request->序列号;
    $item->labeled=$request->labeled;
    $item->Estensione_Garanzia=$request->Estensione_Garanzia;
    $item->stato=$request->stato;
    $item->data_dismissione=$request->data_dismissione;
    $item->codice=$request->codice;
    
    $item->save();
    
    返回response()->json([
    'success'=>'item salvato'
    )
    }
    
    /**
    *显示指定的资源。
    *
    *@参数\应用程序\项目$项目
    *@返回\照亮\http\response
    */
    公共功能展示(项目$item)
    {
    / /
    }
    
    /**
    *更新存储中的指定资源。
    *
    *@参数\照亮\http\request$request
    *@参数\应用程序\项目$项目
    *@返回\照亮\http\response
    */
    公共函数更新(请求$request,项$item)
    {
    / /
    }
    
    /**
    *从存储中删除指定的资源。
    *
    *@参数\应用程序\项目$项目
    *@返回\照亮\http\response
    */
    公共功能销毁(项目$item)
    {
    / /
    }
    }
    
    
    

    /routes/api.php。

    //default stuff
    […]
    
    //资源
    路由::api资源([
    'componente'=>'componentController',
    'condizione'=>'condizioncontroller',
    'fornitore'=>'fornitoreController',
    'gruppo'=>'gruppocontroller',
    'gruppermesso'=>'gruppermessoController',
    'componente'=>'componentController',
    '项目'=>'项目控制器',
    'locazione'=>'locazionecontroller',
    'permesso'=>'permessoController',
    'Tipologia'=>'TipologiaController',
    'utente'=>'utentecontroller'
    )
    
    
    

    现在加载时(on get/index().),我得到一个没有错误消息的异常,由这个引发:

    symfony\component\httpkernel\exception\notfoundhttpexception

    以下是摘录:

    我对拉拉维尔很陌生。这是第一个项目。也许我错过了什么?

    提前感谢所有人的帮助。apiResources更精确地定义API控制器的路由-尤其是如果它们不包含任何HTML。这是我的情况。

    我正在进行一个Laravel5.6项目,该项目使用Ajax获取内部数据。VUE组件。直到今天,我还在使用普通的控制器/app/Http/Controllers和Route::resources在中声明/routes/web.php.

    直到今天,当我试图将它们重构为docs建议时,它一直工作得很好,如下所示:

    /app/http/controllers/api/itemcontroller.php

    <?php
    
    // Definizione Namespace
    // before: App\Http\Controllers;
    namespace App\Http\Controllers\API;
    
    use App\Item;
    use Illuminate\Http\Request;
    // Added after refactoring
    use App\Http\Controllers\Controller;
    use App\Http\Resources\Item as ItemResource;
    
    class ItemController extends Controller
    {
        /**
         * Display a listing of the resource.
         *
         * @return \Illuminate\Http\Response
         */
        public function index()
        {
            return ItemResource::collection(Item::all());
        }
    
        /**
         * Store a newly created resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request)
        {
            $item = new Item();
    
            $item->codice = $request->codice;
            $item->data_acquisto = $request->data_acquisto;
            $item->serial = $request->serial;
            $item->labeled = $request->labeled;
            $item->estensione_garanzia = $request->estensione_garanzia;
            $item->stato = $request->stato;
            $item->data_dismissione = $request->data_dismissione;
            $item->codice = $request->codice;
    
            $item->save();
    
            return response()->json([
                'success' => 'Item salvato'
            ]);
        }
    
        /**
         * Display the specified resource.
         *
         * @param  \App\Item  $item
         * @return \Illuminate\Http\Response
         */
        public function show(Item $item)
        {
            //
        }
    
        /**
         * Update the specified resource in storage.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \App\Item  $item
         * @return \Illuminate\Http\Response
         */
        public function update(Request $request, Item $item)
        {
            //
        }
    
        /**
         * Remove the specified resource from storage.
         *
         * @param  \App\Item  $item
         * @return \Illuminate\Http\Response
         */
        public function destroy(Item $item)
        {
            //
        }
    }
    

    /路由/api.php

    // Default stuff
    [...]
    
    // Resources
    Route::apiResources([
        'componente' => 'ComponenteController',
        'condizione' => 'CondizioneController',
        'fornitore' => 'FornitoreController',
        'gruppo' => 'GruppoController',
        'gruppoPermesso' => 'GruppoPermessoController',
        'componente' => 'ComponenteController',
        'item' => 'ItemController',
        'locazione' => 'LocazioneController',
        'permesso' => 'PermessoController',
        'tipologia' => 'TipologiaController',
        'utente' => 'UtenteController'
    ]);
    

    现在加载(获取/index(),我收到一个无错误消息的异常,由以下内容引发:

    symfony\component\httpkernel\exception\notfoundhttpexception

    以下是它的摘录:

    enter image description here

    我对拉拉维尔很陌生。这是第一个项目。也许我错过了什么?

    提前感谢大家的帮助。

    2 回复  |  直到 7 年前
        1
  •  1
  •   paratechX    7 年前

    只是对你答案的一个补充,因为我想解决一个类似的问题。不要更改第17行的$namespace,而是查看mapapirouts()并调整其中的命名空间。

    ->namespace($this->namespace . "\API")
    

    这将在api/subdirectory中查找api.php中路由的控制器。

    其他路由(即web.php中)将保留其原始名称空间。这样,您仍然可以使用常规的非API路由。

        2
  •  0
  •   Luca Cattide    8 年前

    最后解决了这个问题。

    正如@ts8060所建议的,我添加了默认值 /api Ajax调用中路径的前缀。即。:

    url: '/api/item' 指向 /app/Http/Controllers/API/ItemController (到) index() 方法)。

    我完全跳过了段落中提到的api前缀部分(对于需要的人可以找到它 here )

    另外,正如一个懒散的社区用户告诉我的(学分:dadibom),我在 /app/Http/Providers/RouteServiceProvider.php 在第17行,为了将呼叫重定向到正确的目的地 ../Controllers/API 文件夹):

    从

    protected $namespace = 'App\Http\Controllers';
    

    到

    protected $namespace = 'App\Http\Controllers\API';
    

    就这样。

    再次感谢大家的宝贵帮助。