제어 장치
Controller 컨트롤러 컨트롤러 및 네임 스페이스 싱글 동작 컨트롤러
- 이름 리소스 라우팅
- 리소스 컨트롤러
- 현지화된 리소스 URI
- 보충 리소스 컨트롤러
- 종속성 주입 및 컨트롤러
- 생성자 주입
- 메서드 주입
- 라우트 캐시
컨트롤러 소개
- 기본 컨트롤러
- 정의 컨트롤러 컨트롤러 미들웨어 명명된 리소스 경로 매개변수
- 로컬 리소스 URI
- 보충 리소스 컨트롤러
- 종속성 주입 및 컨트롤러
- 경로 캐시
- 소개
에 정의된 모든 요청 처리 로직을 대체하기 위해 라우팅 파일의 클로저 형식을 사용하려면 컨트롤 클래스를 사용하여 이러한 동작을 구성할 수 있습니다. 컨트롤러는 관련 요청 처리 논리를 별도의 클래스로 그룹화할 수 있습니다. 컨트롤러는 - 기본 컨트롤러
app/Http/Controllers
디렉터리에 저장됩니다.컨트롤러 정의
다음은 기본 컨트롤러 클래스의 예입니다. 이 컨트롤러는 Laravel의 내장 기본 클래스 컨트롤러를 상속한다는 점에 유의해야 합니다. 이 기본 클래스 컨트롤러는 컨트롤러 동작에 미들웨어를 추가할 수 있는middleware
메서드와 같은 몇 가지 편리한 메서드를 제공합니다.<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 显示给定用户的概要文件. * * @param int $id * @return View */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
다음과 같이 컨트롤러 동작을 가리키는 경로를 정의할 수 있습니다.Route::get('user/{id}', 'UserController@show');
이제 요청이 지정된 경로의 URI와 일치하면
UserController
컨트롤러의show
메서드가 실행됩니다. 경로 매개변수도 이 메소드에 전달됩니다.{tip} 컨트롤러는 기본 클래스에서 상속하는 데 필요하지 않습니다. 그러나 컨트롤러가 기본 클래스에서 상속받지 않으면
미들웨어
,validate
및dispatch<와 같은 몇 가지 편리한 기능을 사용할 수 없습니다. /코드> 메소드.
app/Http/Controllers
目录中。基础控制器
定义控制器
下面是一个基础控制器类的例子。 需要注意的是,该控制器继承了 Laravel 内置的基类控制器。 该基类控制器提供了一些便利的方法,比如
middleware
方法,该方法可以为控制器行为添加中间件:Route::get('foo', 'Photos\AdminController@method');
你可以这样定义一个指向控制器行为的路由:
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { /** * 展示给定用户的资料. * * @param int $id * @return View */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
现在,当一个请求与指定路由的 URI 匹配时,
UserController
控制器中的show
方法就会被执行。路由参数也将会被传递给该方法。{tip} 控制器并 不是强制要求继承基础类 。 但是, 如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如
middleware
,validate
和dispatch
컨트롤러 및 네임스페이스
컨트롤러 경로를 정의할 때 전체 컨트롤러 네임스페이스를 지정할 필요가 없다는 점을 지적하는 것이 중요합니다.
RouteServiceProvider
는 네임스페이스가 포함된 경로 그룹에 경로 파일을 로드하므로AppHttpControllers
네임스페이스 뒤에 클래스 이름 부분만 지정하면 됩니다.RouteServiceProvider
会在一个包含命名空间的路由组中加载路由文件,我们只需要指定类名中AppHttpControllers
命名空间之后的部分就可以了。如果你选择将控制器放在
AppHttpControllers
更深层次的目录中,需要使用相对于AppHttpControllers
作为根命名空间的指定类名。 因此,如果你完整的控制器类名为AppHttpControllersPhotosAdminController
,你在路由中应当采用如下的形式注册:Route::get('user/{id}', 'ShowProfile');
单个行为控制器
如果你想定义一个只处理单个行为的控制器,你可以在控制器中放置一个
__invoke
方法:php artisan make:controller ShowProfile --invokable
当注册单个行为控制器的路由时,无需指明方法:
Route::get('profile', 'UserController@show')->middleware('auth');
你可以通过 Artisan 命令工具里的
make:controller
命令中的--invokable
选项来生成一个可调用的控制器:class UserController extends Controller{ /** * Instantiate a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } }
控制器中间件
Middleware 可以在路由文件中分配给控制器的路由。
$this->middleware(function ($request, $next) { // ... return $next($request);});
但是,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的
middleware
AppHttpControllers
보다 더 깊은 디렉터리에 컨트롤러를 배치하도록 선택한 경우AppHttpControllers
와 관련된 특정 클래스 이름을 루트 네임스페이스로 사용해야 합니다. 따라서 전체 컨트롤러 클래스 이름이AppHttpControllersPhotosAdminController
인 경우 다음과 같이 경로에 등록해야 합니다.php artisan make:controller PhotoController --resource
단일 동작 컨트롤러단일 동작만 처리하는 컨트롤러를 정의하려면 컨트롤러 메서드에
__invoke
를 배치할 수 있습니다.Route::resource('photos', 'PhotoController');
단일 동작 컨트롤러의 경로를 등록할 때 메서드를 지정할 필요가 없습니다.Artisan의Route::resources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
make:controller
명령에--invokable<을 전달할 수 있습니다. 호출 가능한 컨트롤러를 생성하는 명령 도구 /code> 옵션: 🎜
php artisan make:controller PhotoController --resource --model=Photo
🎜🎜🎜🎜controller-middleware 구성요소
🎜미들웨어는 경로 파일의 컨트롤러 경로에 할당될 수 있습니다. 🎜<form action="/foo/bar" method="POST"> @method('PUT') </form>
🎜 하지만 컨트롤러 생성자에서 미들웨어를 지정하는 것이 더 편리합니다. 컨트롤러 생성자의middleware
메서드를 사용하여 미들웨어를 컨트롤러 작업에 쉽게 할당할 수 있습니다. 미들웨어를 컨트롤러 클래스의 특정 메서드로 제한할 수도 있습니다. 🎜Route::resource('photos', 'PhotoController')->only([ 'index', 'show' ]); Route::resource('photos', 'PhotoController')->except([ 'create', 'store', 'update', 'destroy' ]);
🎜동시에 컨트롤러에서는 클로저를 사용하여 미들웨어를 등록할 수도 있습니다. 이는 전체 미들웨어 클래스를 정의하지 않고 단일 컨트롤러에 대한 미들웨어를 정의하는 편리한 방법을 제공합니다. 🎜Route::apiResource('photos', 'PhotoController');
🎜🎜{tip} 컨트롤러 작업의 하위 집합에 미들웨어를 할당할 수 있지만 이는 컨트롤러가 매우 커지고 있음을 나타낼 수 있습니다. 컨트롤러를 여러 개의 작은 컨트롤러로 분할하는 것이 좋습니다. 🎜🎜🎜🎜🎜🎜🎜🎜Resource Controller
Laravel 리소스 라우팅은 한 줄의 코드로 일반적인 "CURD(생성, 삭제, 수정, 확인)" 경로를 컨트롤러에 할당합니다. 예를 들어, 앱에 저장된 "사진"에 대한 모든 HTTP 요청을 처리하는 컨트롤러를 생성하려고 합니다. Artisan 명령
make:controller
를 사용하면 이러한 컨트롤러를 빠르게 생성할 수 있습니다.make:controller
, 我们可以快速创建这样一个控制器:Route::apiResources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
这个命令会生成一个控制器
app/Http/Controllers/PhotoController.php
。 其中包括每个可用资源操作的方法。接下来,你可以给控制器注册一个资源路由:
php artisan make:controller API/PhotoController --api
这个单一的路由声明创建多个路由来处理资源上的各种行为。生成的控制器为每个行为保留了方法,包括了关于处理 HTTP 动词和 URLs 的声明注释。
你可以通过将数组传参到
resources
Route::resource('photos', 'PhotoController')->names([ 'create' => 'photos.build' ]);
이 명령은app/Http/Controllers/PhotoController.php
컨트롤러를 생성합니다. 여기에는 사용 가능한 각 리소스 작업에 대한 메서드가 포함됩니다. 다음으로 컨트롤러에 리소스 경로를 등록할 수 있습니다. 🎜Route::resource('users', 'AdminUserController')->parameters([ 'users' => 'admin_user' ]);
🎜이 단일 경로 선언은 리소스의 다양한 동작을 처리하기 위해 여러 경로를 생성합니다. 생성된 컨트롤러는 HTTP 동사 및 URL을 처리하기 위한 선언적 주석을 포함하여 각 작업에 대한 메서드를 유지합니다. 🎜🎜배열 매개변수를resources
메소드에 전달하여 한 번에 여러 리소스 컨트롤러를 생성할 수 있습니다: 🎜/users/{admin_user}
🎜🎜리소스 컨트롤러 작업 처리
HTTP 메서드 URI Action Route Name GET /photos
index photos.index GET /photos/create
create photos.create POST /photos
store photos.store GET /photos/{photo}
show photos.show GET /photos/{photo}/edit
/photosindex 사진 s.index GET /photos/create
🎜🎜create🎜🎜photos.create🎜🎜🎜🎜POST🎜🎜🎜/photos🎜🎜store🎜🎜photos.store🎜🎜🎜 🎜GET 🎜🎜 🎜/photos/{사진}🎜🎜show🎜🎜photos.show🎜🎜🎜🎜GET🎜🎜🎜/photos/{사진}/edit🎜🎜edit🎜🎜photos.edit🎜🎜🎜 🎜PUT/PATCH🎜🎜🎜/photos/{사진}update photos.update DELETE /photos/{photo}
/photos/{photo}
destroy photos.destroy 리소스 모델 지정
경로 모델 바인딩을 사용하고 리소스 컨트롤러 메서드에서 유형 힌트를 사용하려는 경우 컨트롤러 생성 시
--model
옵션을 사용할 수 있습니다.--model
选项:use Illuminate\Support\Facades\Route; /** * 初始化任何应用服务 * * @return void */ public function boot(){ Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
伪造表单方法
因为 HTML 表单不能生成
PUT
,PATCH
, 和DELETE
请求,所以你需要一个添加一个隐藏的_method
字段来伪造 HTTP 动作。这个 Blade 指令@method
可以为你创建这个字段:/fotos/crear/fotos/{foto}/editar
部分资源路由
声明资源路由时,你可以指定控制器应该处理的部分行为,而不是所有默认的行为:
Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController');
API 资源路由
当声明用于 APIs 的资源路由时,通常需要排除显示 HTML 模板的路由, 如
create
和edit
。 为了方便起见,你可以使用apiResource
方法自动排除这两个路由:<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller{ /** * The user repository instance. */ protected $users; /** * Create a new controller instance. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } }
你可以通过传递一个数组给
apiResources
方法的方式来一次性注册多个 API 资源控制器:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Store a new user. * * @param Request $request * @return Response */ public function store(Request $request) { $name = $request->name; // } }
为了快速生成一个不包含
create
和edit
方法的 API 资源控制器,可以在执行make:controller
命令时加上--api
选项:Route::put('user/{id}', 'UserController@update');
命名资源路由
默认情况下,所有资源控制器操作都有一个路由名称;但是,是可以通过用选项传递一个
names
数组来覆盖这些名称:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Update the given user. * * @param Request $request * @param string $id * @return Response */ public function update(Request $request, $id) { // } }
命名资源路由参数
默认情况下,
Route::resource
会根据资源名称的 「单数」 形式创建资源路由的路由参数。你可以在选项数组中传入parameters
参数来轻松地覆盖每个资源。parameters
数组应当是一个资源名称和参数名称的关联数组:php artisan route:cache
上列将会为资源的
show
php artisan route:clear
가짜 양식 방법HTML 양식은
rrreee🎜PUT
,PATCH
및 < code>DELETE 요청이므로 HTTP 작업을 위조하려면 숨겨진_method
필드를 추가해야 합니다. 이 블레이드 지시어@method
는 다음 필드를 생성할 수 있습니다:🎜부분 리소스 라우팅
🎜리소스 경로를 선언할 때 모든 기본 동작 대신 컨트롤러가 처리해야 하는 일부 동작을 지정할 수 있습니다: 🎜rrreee🎜🎜API 리소스 경로🎜🎜API에 대한 리소스 경로를 선언할 때 일반적으로create
및edit<와 같은 HTML 템플릿을 표시하는 경로를 제외해야 합니다. /코드>. 편의를 위해
apiResource
메서드를 사용하여 다음 두 경로를 자동으로 제외할 수 있습니다. 🎜rrreee🎜apiResources
메서드 API 리소스에 배열을 전달하여 한 번에 여러 경로를 등록할 수 있습니다. 컨트롤러: 🎜rrreee🎜create
및edit
메서드가 포함되지 않은 API 리소스 컨트롤러를 빠르게 생성하려면make:controller
명령을 내릴 때--api
옵션을 추가하세요: 🎜rrreee🎜🎜🎜🎜명명된 리소스 경로
🎜기본적으로 모든 리소스 컨트롤러 작업에는 경로 이름이 있습니다. 그러나 이러한 이름은 옵션 :🎜rrreee🎜과 함께names
배열을 전달하여 재정의할 수 있습니다. 🎜🎜🎜명명된 리소스 경로 매개변수
🎜 기본적으로 < code>Route::resource는 리소스 이름의 "단수" 형식을 기반으로 리소스 경로에 대한 라우팅 매개변수를 생성합니다. 옵션 배열에parameters
매개변수를 전달하여 각 리소스를 쉽게 재정의할 수 있습니다.parameters
배열은 리소스 이름과 매개변수 이름의 연관 배열이어야 합니다. 🎜rrreee🎜위 목록은 리소스의show
경로에 대해 다음 URL을 생성합니다. 🎜rrreee🎜🎜 🎜 🎜🎜🎜현지화된 리소스 URI
기본적으로
rrreeeRoute::resource
는 영어 동사를 사용하여 리소스 URI를 생성합니다.create
및edit
작업 이름을 현지화해야 하는 경우boot
메서드에서AppServiceProvider
를 사용할 수 있습니다. >Route::resourceVerbs 메소드 구현.Route::resource
将会使用英文动词来创建资源 URI 。如果你需要本地化create
和edit
行为动作名,你可以在AppServiceProvider
的boot
方法中使用Route::resourceVerbs
方法实现。一旦动作被自定义后,像
rrreeeRoute::resource('fotos', 'PhotoController')
这样注册的资源路由将会产生如下的 URI:补充资源控制器
如果你需要为资源控制器添加默认路由之外的额外路由,你应该调用
rrreeeRoute::resource
;之前定义这些路由;否则,由resource
方法定义的路由可能会无意中优先你补充的路由:{tip} 记住保持控制器的专一性。如果你发现自己经常需要典型资源操作之外的方法,请考虑将控制器拆分为较小的控制器。
依赖注入 & 控制器
构造函数注入
Laravel 服务容器 解析所有的控制器。因此,你可以在控制器的构造函数中使用类型提示可能需要的依赖项。依赖声明会被自动解析并注入到控制器实例:
rrreee当然,你可以输入任何的 Laravel 契约. 只要容器可以解析它。根据你的应用,注入你的类型提示到控制器会提供更好可测试性。
方法注入
处理构造函数注入,你还可以在控制器方法中输入类型提示依赖项。方法注入最常见的用例是在控制器方法中注入
rrreeeIlluminateHttpRequest
的实例:如果你的控制器还需要获取路由参数中的输入,把路由参数放在这些依赖项的后面。例如,你的路由定义像这样:
rrreee你仍然可以输入
작업이 사용자 정의되면IlluminateHttpRequest
类型提示,并通过在你的控制器方法中使用下面的定义来访问id
rrreeeRoute::resource('fotos', 'PhotoController')
와 같이 등록된 리소스 경로는 다음 URI를 생성합니다:보충 리소스 컨트롤러🎜🎜리소스 컨트롤러의 기본 경로 외에 추가 경로를 추가해야 하는 경우 다음을 정의해야 합니다.Route::resource
를 호출하기 전에 경로를 지정하세요. 그렇지 않으면resource
메서드로 정의된 경로가 실수로 추가한 경로보다 우선할 수 있습니다. 🎜rrreee🎜{tip} 컨트롤러에 집중하는 것을 잊지 마세요. 일반적인 리소스 작업 이외의 방법이 자주 필요한 경우 컨트롤러를 더 작은 컨트롤러로 분할하는 것이 좋습니다. 🎜
🎜🎜🎜🎜종속성 주입 및 컨트롤러
< div name="342751" data-unique="342751">🎜생성자 주입
🎜Laravel 서비스 컨테이너는 모든 컨트롤러를 확인합니다. 따라서 필요할 수 있는 종속성에 대해 컨트롤러 생성자에서 유형 힌트를 사용할 수 있습니다. 종속성 선언은 자동으로 해결되어 컨트롤러 인스턴스에 주입됩니다. 🎜rrreee🎜 물론 컨테이너가 이를 해결할 수 있는 한 모든 Laravel 계약을 입력할 수 있습니다. 애플리케이션에 따라 유형 힌트를 컨트롤러에 삽입하면 더 나은 테스트 가능성을 제공할 수 있습니다. 🎜🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜메서드 주입
🎜생성자 주입을 처리하면 컨트롤러 메서드의 종속성을 유형 힌트로 지정할 수도 있습니다. 메서드 주입의 가장 일반적인 사용 사례는IlluminateHttpRequest
의 인스턴스를 컨트롤러 메서드에 주입하는 것입니다. 🎜rrreee🎜컨트롤러가 경로 매개변수에서도 입력을 받아야 하는 경우 나중에 이러한 종속성에 경로 매개변수를 추가하세요. . 예를 들어 경로 정의는 다음과 같습니다. 🎜rrreee🎜 컨트롤러 메서드 매개변수에서 다음 정의를 사용하여IlluminateHttpRequest
유형 힌트를 입력하고id
에 액세스할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜경로 캐싱
{note} 폐쇄 기반 경로는 캐시할 수 없습니다. 경로 캐싱을 사용합니다. 클로저 경로를 컨트롤러 경로로 변환해야 합니다.
애플리케이션이 컨트롤러 기반 라우팅만 사용하는 경우 경로 캐싱을 활용해야 합니다. 경로 캐싱을 사용하면 모든 애플리케이션 경로를 등록하는 데 필요한 시간이 크게 줄어듭니다. 경우에 따라 경로 등록이 100배 더 빨라지기도 합니다. 경로 캐시를 생성하려면
rrreeeroute:cache
를 실행하세요.route:cache
:运行此命令之后,每个请求都将加载缓存的路由文件。记住,如果你添加了任何的新路由,则需要生成新的路由缓存。因此,你只应在项目部署期间运行
route:cache
命令。你可以使用
이 명령을 실행한 후 캐시된 경로 파일은 요청이 있을 때마다 로드됩니다. 새 경로를 추가하는 경우 새 경로 캐시를 생성해야 한다는 점을 기억하세요. 따라서 프로젝트 배포 중에는route:clear
rrreeeroute:cache
명령만 실행해야 합니다. 이 기사는
- 콘트롤러 미들웨어