백엔드 개발 PHP 튜토리얼 Laravel5.5 컨트롤러 매개변수 전달 순서 문제 및 해결 방법

Laravel5.5 컨트롤러 매개변수 전달 순서 문제 및 해결 방법

May 10, 2018 pm 04:34 PM
제어 장치 해결책

laravel 5.5의 컨트롤러는 메소드 매개변수 유형에 따라 자동으로 주입하는 기능을 제공합니다. 하지만 때로는 약간의 불편함이 있는데, 이는 메소드 매개변수의 주입이 매개변수 이름을 전적으로 기반으로 하지 않는다는 점에서 반영됩니다. 들어오는 매개변수의 순서가 변경되면 유형 불일치 오류가 발생합니다. 이 기사에서는 주입 원리에 대한 심층 분석을 통해 문제를 해결할 것입니다.

1. 컨트롤러 메소드 매개변수 주입 단계 설계

1. /routes/web.php

Route::get('/diary/show/{diary}/{page?}','Diary\DiaryController@list');
로그인 후 복사

2에 경로를 추가합니다. DiaryController.php 경로를 /app/Http/Controllers/Diary/에 넣습니다.

<?php
namespace App\Http\Controllers\Diary;
use App\Http\Controllers\Controller;
class DiaryController extends Controller
{
    public function show(\App\Diary $diary,$page=11){
        var_dump($diary->title,$page); 
  } 
}
로그인 후 복사

3. 모델 AppDiary를 빌드하고 데이터베이스에 설치합니다(생략됨)

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Diary extends Model
{
    protected $table=&#39;diary&#39;;
    public $timestamps = false;
}
로그인 후 복사

4. 컨트롤러 메서드에 액세스합니다

브라우저를 열고 다음을 입력합니다: "http://127.0.0.1//diary/show/4 /12"

이때, 데이터 테이블 다이어리의 id=4, 12의 title 필드 값이 출력됩니다

2. 인젝션 매개변수 종류 설명

참고: laravel은 {diary} 및 {page} 변수와 일치합니다. 요청 라우팅 및 컨트롤러 메서드에서 필수 메서드 매개 변수 유형이 생성되어 컨트롤러 메서드에 주입됩니다.

다른 매개 변수 유형에는 세 가지 상황이 있습니다.

1 매개 변수 유형이 UrlRoutable 인터페이스를 구현하는 경우(즉, 상속됨) IlluminateDatabaseEloquentModel에서) 모델에 해당하는 테이블에서 id 값이 경로의 매개변수 값과 일치하는 레코드를 찾아 모델 객체를 빌드합니다.

2. UrlRoutable 인터페이스는 구현되지 않음), laravel은 객체를 구축하고 이를 주입합니다 ;

3. 매개변수 유형이 기본 데이터 유형이고 이름이 라우팅 매개변수에 정의된 이름인 경우 값은 라우팅에서 가져옵니다.

4. 매개변수 유형이 기본 데이터 유형이지만 이름이 라우팅 매개변수 정의에 없는 경우 기본값이 있으면 기본값을 사용하고, 그렇지 않으면 시스템에서 오류가 발생합니다.

3. 주입된 매개변수에 대한 현재 문제 분석

Java의 Spring MVC 프레임워크를 참조하면 laravel의 매개변수 유형 주입에는 여전히 결함이 있으며, 주로 매개변수 이름에 따라 완전히 주입되지 않는다는 사실이 반영됩니다.

1. 컨트롤러 매개변수의 순서를 변경하면 매개변수 유형 전송 오류가 발생합니다. 예를 들어 DiaryController가 제어하는 ​​show 메소드의 매개변수 순서를 변경하면

<?php
namespace App\Http\Controllers\Diary;
use App\Http\Controllers\Controller;
class DiaryController extends Controller
{
    public function show($page,\App\Diary $diary){
        var_dump($diary->title,$page); 
  } 
}
로그인 후 복사

2. 매개변수 유형은 기본 데이터 유형(2(3) 참조)이므로 이름에 따라 삽입되는 매개변수가 아니므로 다음과 같이 코드를 변경하면 Laravel5.5 컨트롤러도 정상적으로 실행됩니다. 메소드 매개변수 삽입 소스 코드 분석

1 UrlRoutable 인터페이스 구현 매개변수 유형은 라우팅 미들웨어 IlluminateRoutingMiddlewareSubstituteBinding 구현에 의해 구성됩니다.

<?php
namespace App\Http\Controllers\Diary;
use App\Http\Controllers\Controller;
class DiaryController extends Controller
{
    public function show(\App\Diary $diary,$pag){
        var_dump($diary->title,$pag); 
  } 
}
로그인 후 복사

IlluminateRoutingRouter의 대체ImplicitBindings 메소드

    public function handle($request, Closure $next)
    {
        $this->router->substituteBindings($route = $request->route());
        $this->router->substituteImplicitBindings($route);
        return $next($request);
    }
로그인 후 복사

IlluminateRoutingImplicitRouteBinding

rr의solveForRoute 메소드에서 구현됩니다. reee

추가 메모:

The 여기서 $route 객체(Illu)는 minateRoutingRoute 유형) 모델을 설명하는 setParameter 메소드입니다. 매개변수 유형(2(1) 참조)은 매개변수 유형과 매개변수 이름을 동시에 일치시켜 모델 인스턴스에 주입됩니다

2. 다른 유형의 컨트롤러 매개변수는 라우팅 컨트롤러를 실행할 때 바인딩됩니다.

핵심 부분은 IlluminateRoutingControllerDispatcher의 디스패치 메소드에 있습니다. 구현 위치:

    public function substituteImplicitBindings($route)
    {
        ImplicitRouteBinding::resolveForRoute($this->container, $route);
    }
로그인 후 복사

solveClassMethodDependities 메소드 호출

    public static function resolveForRoute($container, $route)
    {
        //从路由参数中获取参数值,$parameters为 [&#39;diary&#39;:&#39;4&#39;,&#39;page&#39;:&#39;12&#39;]
        $parameters = $route->parameters();
        //获取控制器的函数参数列表,此处传入UrlRoutable::class,只返回实现UrlRoutable接口的参数
        $signatureParameters = $route->signatureParameters(UrlRoutable::class);
        foreach ($signatureParameters as $parameter) {
            if (! $parameterName = static::getParameterName($parameter->name, $parameters)) {
                continue;
            }
            $parameterValue = $parameters[$parameterName];
            if ($parameterValue instanceof UrlRoutable) {
                continue;
            }
            //构建模型的实例(基础自Illuminate\Database\Eloquent\Model),此处为App\Diary
            $instance = $container->make($parameter->getClass()->name);
            //将参数值绑定到模型,参加Illuminate\Database\Eloquent\Model的resolveRouteBinding方法
            if (! $model = $instance->resolveRouteBinding($parameterValue)) {
                throw (new ModelNotFoundException)->setModel(get_class($instance));
            }
       //根据参数名称注入模型实例
            $route->setParameter($parameterName, $model);
        }
    }
로그인 후 복사

문제 요약:

1. 2(1) 참조) 및 라우팅 매개변수(2(3) 참조)에 정의된 이름의 기본 유형은 라우팅을 따라야 합니다. 에 정의된 순서는 먼저 컨트롤러 메소드로 전달됩니다. 그렇지 않으면 유형 불일치 오류가 발생합니다.

2. 사용자 정의 유형(2(2) 참조) 및 라우팅 매개변수에 이름이 정의되지 않은 기본 유형 매개변수(2(2) 4) 참조)는 컨트롤러 메소드에 나타나는 순서대로 전달합니다.

5. 문제 수정

/vendor/laravel/framework/src/Illuminate/Routing/RouteDependencyResolverTrait.php 파일을 열고,

resolveMethodDependency 메소드를 다음 코드로 수정합니다.

    public function dispatch(Route $route, $controller, $method)
    {
        //解析控制器方法的参数
        $parameters = $this->resolveClassMethodDependencies(
            $route->parametersWithoutNulls(), $controller, $method
        );
        if (method_exists($controller, &#39;callAction&#39;)) {
            //通过Illuminate\Routing\Controller的callAction调用控制器方法
            return $controller->callAction($method, $parameters);
        }
        //直接调用控制器方法
        return $controller->{$method}(...array_values($parameters));
    }
로그인 후 복사

수정 후 컨트롤러 메소드를 완전히 삽입합니다. 매개변수의 이름과 유형을 변경하면 코드가 더욱 간결해지고 기능이 더욱 강력해집니다!

라우터에 매개변수가 정의되어 있지 않고 기본값이 제공되지 않으면 null로 주입됩니다.

관련 권장 사항:

PHP가 리플렉션 메커니즘을 기반으로 자동 종속성 주입을 구현하는 방법에 대한 자세한 설명

종속성 주입이란 무엇입니까?

Laravel 5.5의 해당 인터페이스를 사용하는 방법은 무엇입니까?

위 내용은 Laravel5.5 컨트롤러 매개변수 전달 순서 문제 및 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

중국어 언어 팩을 설치할 수 없는 Win11용 솔루션 중국어 언어 팩을 설치할 수 없는 Win11용 솔루션 Mar 09, 2024 am 09:15 AM

Win11은 Microsoft가 출시한 최신 운영 체제로, 이전 버전에 비해 인터페이스 디자인과 사용자 경험이 크게 향상되었습니다. 그러나 일부 사용자들은 Win11을 설치한 후 중국어 언어 팩을 설치할 수 없는 문제가 발생하여 시스템에서 중국어를 사용하는 데 문제가 발생했다고 보고했습니다. 이 글에서는 Win11에서 중국어 언어팩을 설치할 수 없는 문제에 대한 해결 방법을 제시하여 사용자들이 중국어를 원활하게 사용할 수 있도록 도와드리겠습니다. 먼저 중국어 언어팩을 설치할 수 없는 이유를 이해해야 합니다. 일반적으로 Win11은

scipy 라이브러리 설치 실패의 원인과 해결 방법 scipy 라이브러리 설치 실패의 원인과 해결 방법 Feb 22, 2024 pm 06:27 PM

scipy 라이브러리 설치 실패 이유와 해결 방법, 특정 코드 예제가 필요합니다. Python에서 과학 계산을 수행할 때 scipy는 수치 계산, 최적화, 통계 및 신호 처리를 위한 많은 기능을 제공하는 매우 일반적으로 사용되는 라이브러리입니다. 그러나 scipy 라이브러리를 설치할 때 가끔 문제가 발생하여 설치가 실패하는 경우가 있습니다. 이 기사에서는 scipy 라이브러리 설치가 실패하는 주요 이유를 살펴보고 해당 솔루션을 제공합니다. 종속 패키지 설치에 실패했습니다. scipy 라이브러리는 nu와 같은 다른 Python 라이브러리에 의존합니다.

Oracle 문자셋 수정으로 인한 문자 깨짐 문제에 대한 효과적인 솔루션 Oracle 문자셋 수정으로 인한 문자 깨짐 문제에 대한 효과적인 솔루션 Mar 03, 2024 am 09:57 AM

제목: Oracle 문자 집합 수정으로 인해 발생하는 문자 깨짐 문제를 해결하는 효과적인 솔루션 Oracle 데이터베이스에서 문자 집합을 수정하면 데이터에 호환되지 않는 문자가 존재하여 문자 깨짐 문제가 자주 발생합니다. 이 문제를 해결하려면 몇 가지 효과적인 솔루션을 채택해야 합니다. 이 문서에서는 Oracle 문자 집합 수정으로 인해 발생하는 문자 왜곡 문제를 해결하기 위한 몇 가지 구체적인 솔루션과 코드 예제를 소개합니다. 1. 데이터 내보내기 및 문자 집합 재설정 먼저 expdp 명령을 사용하여 데이터베이스의 데이터를 내보낼 수 있습니다.

Oracle NVL 기능의 일반적인 문제 및 솔루션 Oracle NVL 기능의 일반적인 문제 및 솔루션 Mar 10, 2024 am 08:42 AM

OracleNVL 기능에 대한 일반적인 문제 및 해결 방법 Oracle 데이터베이스는 널리 사용되는 관계형 데이터베이스 시스템이므로 데이터 처리 중에 null 값을 처리해야 하는 경우가 많습니다. Null 값으로 인해 발생하는 문제를 해결하기 위해 Oracle에서는 Null 값을 처리하는 NVL 기능을 제공합니다. 이 문서에서는 NVL 함수의 일반적인 문제와 해결 방법을 소개하고 구체적인 코드 예제를 제공합니다. 질문 1: NVL 함수의 부적절한 사용 NVL 함수의 기본 구문은 NVL(expr1,default_value)입니다.

C++에서 기계 학습 알고리즘 구현: 일반적인 과제 및 솔루션 C++에서 기계 학습 알고리즘 구현: 일반적인 과제 및 솔루션 Jun 03, 2024 pm 01:25 PM

C++의 기계 학습 알고리즘이 직면하는 일반적인 과제에는 메모리 관리, 멀티스레딩, 성능 최적화 및 유지 관리 가능성이 포함됩니다. 솔루션에는 스마트 포인터, 최신 스레딩 라이브러리, SIMD 지침 및 타사 라이브러리 사용은 물론 코딩 스타일 지침 준수 및 자동화 도구 사용이 포함됩니다. 실제 사례에서는 Eigen 라이브러리를 사용하여 선형 회귀 알고리즘을 구현하고 메모리를 효과적으로 관리하며 고성능 행렬 연산을 사용하는 방법을 보여줍니다.

응용 프로그램을 제대로 시작할 수 없음 오류 코드 0xc000007b 해결 응용 프로그램을 제대로 시작할 수 없음 오류 코드 0xc000007b 해결 Feb 20, 2024 pm 01:24 PM

정상적으로 시작할 수 없는 문제를 해결하는 방법 0xc000007b 컴퓨터를 사용할 때 때때로 다양한 오류 코드가 발생하는데, 가장 일반적인 오류 중 하나는 0xc000007b입니다. 일부 응용 프로그램이나 게임을 실행하려고 하면 이 오류 코드가 갑자기 나타나 제대로 시작하지 못하게 됩니다. 그렇다면 이 문제를 어떻게 해결해야 할까요? 먼저 에러코드 0xc000007b의 의미를 이해해야 합니다. 이 오류 코드는 일반적으로 하나 이상의 중요한 시스템 파일이나 라이브러리 파일이 누락, 손상 또는 올바르지 않음을 나타냅니다.

PyCharm 키 오류 해결 방법 공개 PyCharm 키 오류 해결 방법 공개 Feb 23, 2024 pm 10:51 PM

PyCharm은 개발자들에게 널리 사랑받는 강력한 Python 통합 개발 환경입니다. 그러나 PyCharm을 사용할 때 키 무효화 문제가 발생하여 소프트웨어를 정상적으로 사용하지 못하는 경우가 있습니다. 이 기사에서는 PyCharm 키 오류에 대한 솔루션을 공개하고 독자가 이 문제를 빠르게 해결할 수 있도록 구체적인 코드 예제를 제공합니다. 문제 해결을 시작하기 전에 먼저 키가 유효하지 않은 이유를 이해해야 합니다. PyCharm 키 오류는 일반적으로 네트워크 문제나 소프트웨어 자체로 인해 발생합니다.

MySQL 설치 시 중국어 문자가 왜곡되는 일반적인 원인과 해결 방법 MySQL 설치 시 중국어 문자가 왜곡되는 일반적인 원인과 해결 방법 Mar 02, 2024 am 09:00 AM

MySQL 설치 시 중국어 문자 깨짐의 일반적인 원인과 해결 방법 MySQL은 일반적으로 사용되는 관계형 데이터베이스 관리 시스템이지만 사용 중에 중국어 문자 깨짐 문제가 발생할 수 있으며 이는 개발자와 시스템 관리자에게 문제를 야기합니다. 중국어 깨짐 문제는 주로 잘못된 문자 집합 설정, 데이터베이스 서버와 클라이언트 간의 문자 집합 불일치 등으로 인해 발생합니다. 이 기사에서는 모든 사람이 이 문제를 더 잘 해결할 수 있도록 MySQL 설치 시 중국어 문자가 왜곡되는 일반적인 원인과 해결 방법을 자세히 소개합니다. 1. 일반적인 이유: 문자 집합 설정

See all articles