AMcoder - javascript, python, java, html, php, sql

Laravel Validation Request & API route POST պարամետր

Ես բախվում եմ Ձևաթղթի խնդրանքի վավերացման և այն API-ի մեկ երթուղու հետ վարվելու մի փոքր խնդրի հետ:

Այն ռեսուրսը, որը ես պետք է ստեղծեմ, կախված է մեկ այլ ռեսուրսից:

(Այստեղ էլփոստի կարգավորումները պատկանում են վարձակալին)

Այսպիսով, իմ երթուղու տեսքը պետք է լինի նման՝ /api/tenants/{id}/email_settings

Եվ իմ խնդրանքի վավերացումը ակնկալում է մի քանի դաշտեր, ներառյալ վարձակալի ID-ն.

public function rules() {
    return [
        'email' => 'bail|required|email|unique:email_settings,email',
        'name' => 'bail|required',
        'username' => 'bail|required',
        'password' => 'bail|required'
        'imapHost' => 'bail|required',
        'imapPort' => 'bail|required',
        'imapEncryption' => 'bail|required',
        'imapValidateCert' => 'bail|required',
        'smtpHost' => 'bail|required',
        'smtpPort' => 'bail|required',
        'smtpEncryption' => 'bail|required',
        'tenantId' => 'bail|required',
    ];
}

Եվ հարցումն ուղարկում եմ այսպես.

try {
    const response = await this.tenantForm.post('/api/tenants')
    let newTenant = helpers.getNewResourceFromResponseHeaderLocation(response)
    let tenantId = parseInt(newTenant.id);
    try {
        await this.emailSettingsForm.post('/api/tenants/' + tenantId + '/email_settings')
        this.requestAllTenants()
    } catch ({response}) {
        $('.second.modal').modal({blurring: true, closable: false}).modal('show');
    }
} catch ({response}) {
    $('.first.modal').modal({blurring: true}).modal('show');
}

Այսպիսով, tenantId-ը փոխանցվում է որպես պարամետր, և ոչ թե հարցման մարմնում՝ հարգելու REST կոնվենցիան: Բայց խնդիրը իմ Controller-ում է, երբ ես միաձուլում եմ տվյալները ռեսուրսը ստեղծելու համար, վավերացումն արդեն կատարվել է միայն մարմնի տվյալների վրա մինչև միաձուլումը:

public function store(EmailSettingValidation $request, $tenant_id) {
    $emailSetting = $this->emailSettingService->create(
        array_merge($request->all(), compact($tenant_id))
    );
    return $this->response->created($emailSetting);
}

Այսպիսով, ո՞րն է այն ճիշտ վարվելու լավագույն միջոցը:

  • Անցնե՞լ ID-ն մարմնի մեջ: Թվում է, թե խառնաշփոթ
  • Օգտագործե՞լ Validator-ը ձեռքով վավերացնելու համար: Ես կնախընտրեի պահպանել Ձևի վավերացումը
  • Հեռացնե՞լ tenantId կանոնը և ստուգել այն ձեռքով:

Որևէ առաջարկություն: Շնորհակալություն

09.11.2018

  • Ունե՞ք մոդել ձեր վարձակալի սեղանի համար: 09.11.2018
  • @TravisBritz Այո, բայց ինչո՞ւ է դա կարևոր: 09.11.2018

Պատասխանները:


1

Եթե ​​դուք սահմանում եք ձեր api երթուղին այսպես.

Roue::post('tenants/{tenant}/emails_settings', 'Controller@store');

և փոփոխեք ձեր վերահսկիչի մեթոդը, որպեսզի մոդելը մուտքագրեք փոփոխական անունով, որը համապատասխանում է ձեր երթուղու սահմանմանը.

public function store(EmailSettingValidation $request, Tenant $tenant) {}

այնուհետև Laravel-ը ավտոմատ կերպով կգտնի Վարձակալին ID-ով և կներարկի այն վերահսկիչի մեջ՝ գցելով ModelNotFoundException (404), եթե այն գոյություն չունի: Դա պետք է հոգ տանի ID-ի վավերացման մասին:

Լիազորումն այլ հարց է։

09.11.2018
  • Ձեր լուծումը լավ է աշխատում (եթե մենք երթուղու վրա ավելացնենք միջնակարգ ծրագրերի «կապերը», բայց երբ Վարձակալը գոյություն չունի, այն վերադարձնում է 500: Հարցման արդյունք չկա [App\Tenant] մոդելի և ոչ 404-ի համար, և ես չգիտեմ ինչու: :/ 09.11.2018
  • @guillaumehanotel սա Laravel-ի ո՞ր տարբերակն է: 09.11.2018
  • Սա 5.5 տարբերակն է 09.11.2018
  • @guillaumehanotel Ձեր web միջնակարգ ծրագրերի խումբը ներառում է \Illuminate\Routing\Middleware\SubstituteBindings::class,-ը: 09.11.2018
  • Այո, բայց ես սահմանել եմ իմ երթուղիները api.php-ում, որպեսզի վեբ խումբը չկիրառվի 09.11.2018
  • Արդյո՞ք api խումբը ներառում է 'bindings'-ը: Այն պետք է լռելյայն 09.11.2018
  • Դուք նույնպես վերանվանել եք {id} երթուղու պարամետրը՝ {tenant}, ճի՞շտ է: 09.11.2018
  • Այո, դա այդպես է, բայց կապերը չեն աշխատում, քանի դեռ ես հստակ չեմ նշել երթուղիներում: Բայց ես օգտագործում եմ Dingo փաթեթը իմ API-ն անելու համար, այնպես որ, գուցե դա է պատճառը: Եվ այո {վարձակալ} 09.11.2018
  • Կրկնում եմ, որ ձեր լուծումն աշխատում է, բայց երբ ես միտումնավոր կեղծ ID եմ դնում, դա սխալ է 500 և ոչ 404 09.11.2018
  • Այո, ես հասկացա այդ մասը, բայց 500-ը այնքան էլ ցանկալի արդյունք չէ: Կարծում եմ, որ Դինգո փաթեթի օգտագործումը դա բացատրում է: 09.11.2018

  • 2

    Այսպիսով, լուծումը, որը ես գտա 404-ը գործարկելու համար, հետևյալն է.

    09.11.2018

    3

    Travis Britz-ը և Guillaumehanotel-ն ունեն ձեր պատասխանի կեսը, բայց դուք դեռևս բաց եք թողնում մի մանրուք:

    Travis Britz-ից- Այո, ներառեք tenant_id-ը URI-ում, որպեսզի այն ներարկվի վերահսկիչի մեջ: Guillaumehanotel-ից- Օգտագործել է նաև Eloquent findOrFail այդ ID-ն ձեր կարգավորիչում: (կամ ցանկացած դաս, որը Վերահսկիչն օգտագործում է դա անելու համար, օրինակ՝ պահեստ կամ սպասարկման դաս):

    Այնուամենայնիվ, վերջին կտորը, որը դուք բացակայում եք, սխալի հետ վարվելն է: Դուք կարող եք դա անել Controller-ում, եթե ցանկանում եք, բայց ես ընդհանուր առմամբ սիրում եմ իմ ամբողջ համակարգի համար կանոն դարձնել, որ Illuminate\Database\Eloquent\ModelNotFoundException Բացառությունները, որոնք դուրս են գալիս findOrFail()-ից, միշտ պետք է հանգեցնեն 404-ի:

    Գնացեք app/Exceptions/Handler.php: Համոզված եմ, որ Laravel-ը ավտոմատ կերպով ստեղծում է այս ֆայլի մսի և կարտոֆիլի տարբերակը ձեզ համար, բայց եթե դուք դեռ չունեք այն, այն պետք է նման լինի հետևյալին.

    <?php
    
    namespace App\Exceptions;
    
    use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
    
    /**
     * Class Handler
     * @package App\Exceptions
     */
    class Handler extends ExceptionHandler
    {
        /**
         * Render an exception into an HTTP response.
         *
         * For our API, we need to override the call
         * to the parent.
         *
         * @param  \Illuminate\Http\Request $request
         * @param  \Exception $e
         * @return \Illuminate\Http\Response
         */
        public function render($request, Exception $error)
        {
            $exception = [
                'title' => 'Internal Error',
                'message' => $error->getMessage();
            ];
            $statusCode = 500;
            $headers = [
                'Content-Type', 'application/json'
            ];
    
            return response()->json($exception, $statusCode, $headers, JSON_PRETTY_PRINT);
        }
    }
    

    Laravel-ը հիմնականում ունի համակարգային try/catch, որն առաջինն ուղարկում է բոլոր սխալները: Ահա թե ինչպես են սխալները վերածվում մի բանի, որը զննարկիչը կարող է իրականում մեկնաբանել, երբ դուք վրիպազերծման ռեժիմում եք, այլ ոչ թե ուղղակիորեն սպանել գործընթացը: Սա նաև հնարավորություն է տալիս կիրառել մի քանի հատուկ կանոններ։

    Այսպիսով, այն ամենը, ինչ դուք պետք է անեք, այն է, որ Handler::render()-ին ասեք, որ փոխի լռելյայն սխալի կոդը, որն առաջանում է, երբ տեսնում է սխալի տեսակը, որը կարող է առաջանալ միայն findOrFail()-ից: (Այսպիսի բանն է պատճառը, որ միշտ լավ է անել ձեր սեփական «անվանված բացառությունները», նույնիսկ եթե նրանք բացարձակապես ոչինչ չեն անում, բացի ժառանգելու բազային \Exception դասը:)

    Պարզապես ավելացրեք սա հենց նախքան render()-ը որևէ բան վերադարձնի.

    if ($error instanceof Illuminate\Database\Eloquent\ModelNotFoundException) {
        $statusCode = 404;
    }
    
    09.11.2018
  • Սա արդեն Laravel-ի լռելյայն վարքագիծն է: 500 կարգավիճակի կոդի պատճառը նրանց կողմից օգտագործվող արտաքին գրադարանն է (dingo/api), որն ունի իր բացառությունների մշակումը: 10.11.2018
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..