目次
#コントローラーの紹介
コントローラの定義
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
ログイン後にコピー
" >Middleware ルート ファイルでコントローラに割り当てることができるルート:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
ログイン後にコピー
php artisan make:controller PhotoController --resource
ログイン後にコピー
" >Laravel のリソースルーティングは、典型的な「CURD (作成、削除、変更、確認)」ルートを 1 行で割り当てることができます。コントローラーへのコード。たとえば、Save Photos アプリのすべての HTTP リクエストを処理するコントローラーを作成するとします。このようなコントローラーをすばやく作成するには、アーティザン コマンド make:controller を使用します。
php artisan make:controller PhotoController --resource
ログイン後にコピー
部分资源路由" >部分资源路由
嵌套资源
命名资源路由
命名资源路由参数
限定范围的资源路由
本地化资源 URI" >本地化资源 URI
补充资源控制器
依赖注入 & 控制器
路由缓存" >路由缓存
ホームページ PHPフレームワーク Laravel Laravelコントローラーとは何ですか

Laravelコントローラーとは何ですか

Jan 14, 2023 am 11:16 AM
php laravel コントローラ

laravel では、コントローラー (Controller) は特定の機能を実装するために使用されるクラスであり、コントローラーは関連するリクエスト処理ロジックを別のクラスに結合できます。一部のメソッドは、特定の機能を実装するためにコントローラーに保存されます。コントローラーはルーティングを通じて呼び出され、コールバック関数は使用されなくなり、コントローラーは「app/Http/Controllers」ディレクトリに保存されます。

Laravelコントローラーとは何ですか

このチュートリアルの動作環境: Windows 7 システム、Laravel 6 バージョン、DELL G3 コンピューター。

#コントローラーの紹介

#1. コントローラーとは何ですか?

ルート ファイル内のクロージャの形式で定義されているすべてのリクエスト処理ロジックを置き換えるには、コントロール クラスを使用してこの動作を整理する必要がある場合があります。コントローラーは、関連するリクエスト処理ロジックを別のクラスにグループ化できます。

Controller は、特定の機能を実装するために使用されるクラスです。一部のメソッドは、特定の機能を実装するためにコントローラに格納されます。コントローラはルーティングを通じて呼び出され、コールバック関数は使用されなくなりました。

2. コントローラーはどこに書かれていますか?

#App/Http/Controllers コントローラーを配置します

Controller.php は親クラス ファイルであり、他のコントローラーは継承できます

#3. コントローラーファイルに名前を付けるにはどうすればよいですか? #せむしコントローラ名Controller.php

例: AddDataController.php LoginController.php

#4. コントローラの書き方構造?

artisan コマンドによって自動的に生成されます。例: 現在のプロジェクトのルート ディレクトリにいることを確認し、コマンド ラインに次のように入力します:

php artisan make:controller TestController
ログイン後にコピー

構造コードは自動的に完了します。

   namespace App\Http\Controller;
   use Illuminate\Http\Request;    
   class TestController extends  Controller{
     //
   }
ログイン後にコピー

基本コントローラ

コントローラの定義

次は基本的なコントローラの例です。コントローラークラス。このコントローラーは
Laravel

のベースコントローラーを継承していることに注意してください。このクラスのコントローラーには、コントローラーの動作にミドルウェアを追加できる

middleware メソッドなどの便利なメソッドがいくつか用意されています。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class UserController extends Controller
{
    /**
     * 显示指定用户的简介
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function show($id)
    {
        return view(&#39;user.profile&#39;, [&#39;user&#39; => User::findOrFail($id)]);
    }
}
ログイン後にコピー
次のルーティングのように、コントローラーの動作へのポインターを定義できます。
use App\Http\Controllers\UserController;

Route::get(&#39;user/{id}&#39;, [UserController::class, &#39;show&#39;]);
ログイン後にコピー

リクエストが指定されたルートの URI と一致すると、

UserController

コントローラーの

show メソッドが実行されます。ルート パラメーターもこのメソッドに渡されます。 ヒント: コントローラーは基本クラスを継承するために

必須ではありません。コントローラーが基本クラスから継承していない場合、
middleware

validatedispatch メソッドなどの一部の便利な機能を使用できません。 。 単一動作コントローラー

単一動作のみを処理するコントローラーを定義したい場合は、__invoke# を配置できます。 ## メソッド:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class ShowProfile extends Controller
{
    /**
     * 显示指定用户的简介
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function __invoke($id)
    {
        return view(&#39;user.profile&#39;, [&#39;user&#39; => User::findOrFail($id)]);
    }
}
ログイン後にコピー

単一の動作コントローラーのルートを登録する場合、メソッドを指定する必要はありません:

use App\Http\Controllers\ShowProfile;

Route::get(&#39;user/{id}&#39;, ShowProfile::class);
ログイン後にコピー
これは、Artisan コマンド ツールの make を通じて実行できます。 :controller

コマンドの

--invokable

オプションは、呼び出し可能なコントローラー

php artisan make:controller ShowProfile --invokable
ログイン後にコピー
を生成します。 ヒント: スタブを使用して、 カスタム コントロール コントローラーをカスタマイズできます。 template

Controller middleware

Middleware ルート ファイルでコントローラに割り当てることができるルート:
Route::get(&#39;profile&#39;, [UserController::class, &#39;show&#39;])->middleware(&#39;auth&#39;);
ログイン後にコピー

ただし、コントローラーのコンストラクターでミドルウェアを指定する方が便利です。コントローラーのコンストラクターで

middleware メソッドを使用すると、ミドルウェアをコントローラーに簡単に割り当てることができます。コントローラー内の特定のメソッドにのみ有効になるようにミドルウェアを制限することもできます。

class UserController extends Controller
{
    /**
     * 实例化一个新的控制器实例
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(&#39;auth&#39;);

        $this->middleware(&#39;log&#39;)->only(&#39;index&#39;);

        $this->middleware(&#39;subscribed&#39;)->except(&#39;store&#39;);
    }
}
ログイン後にコピー

同時に、コントローラーではクロージャーを使用してミドルウェアを登録することもできます。これにより、ミドルウェア クラス全体を定義せずに、単一のコントローラーのミドルウェアを定義する便利な方法が提供されます。

$this->middleware(function ($request, $next) {
    // ...

    return $next($request);
});
ログイン後にコピー
ヒント: ミドルウェアをコントローラー アクション サブセットの 1 つに割り当てることができます。ただし、それはコントローラーが複雑になっていることを示している可能性があります。コントローラーを複数の小さなコントローラーに分割することをお勧めします。

リソースコントローラー

Laravel のリソースルーティングは、典型的な「CURD (作成、削除、変更、確認)」ルートを 1 行で割り当てることができます。コントローラーへのコード。たとえば、Save Photos アプリのすべての HTTP リクエストを処理するコントローラーを作成するとします。このようなコントローラーをすばやく作成するには、アーティザン コマンド make:controller を使用します。
php artisan make:controller PhotoController --resource
ログイン後にコピー

このコマンドは、コントローラー

app/Http/Controllers/PhotoController.php を生成します。これには、利用可能な各リソース操作のメソッドが含まれます。

次に、リソース ルートをコントローラーに登録できます。

Route::resource(&#39;photos&#39;, PhotoController::class);
ログイン後にコピー
この 1 つのルート宣言により、リソース上のさまざまな動作を処理するための複数のルートが作成されます。生成されたコントローラーは、HTTP 動詞と URL を処理するための宣言的アノテーションを含む、各アクションのメソッドを保持します。

配列パラメーターを

resources

メソッドに渡すことで、複数のリソース コントローラーを一度に作成できます:

Route::resources([
    &#39;photos&#39; => PhotoController::class,
    &#39;posts&#39; => PostController::class,
]);
ログイン後にコピー

リソース コントローラー操作の処理

VerbURIActionRoute Name
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy

指定资源模型

如果你使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,你可以在生成控制器的时候使用 --model 选项:

php artisan make:controller PhotoController --resource --model=Photo
ログイン後にコピー

当声明资源路由时,你可以指定控制器处理的部分行为,而不是所有默认的行为:

Route::resource(&#39;photos&#39;, PhotoController::class)->only([
    &#39;index&#39;, &#39;show&#39;
]);

Route::resource(&#39;photos&#39;, PhotoController::class)->except([
    &#39;create&#39;, &#39;store&#39;, &#39;update&#39;, &#39;destroy&#39;
]);
ログイン後にコピー

API 资源路由

当声明用于 APIs 的资源路由时,通常需要排除显示 HTML 模板的路由(如 createedit )。为了方便起见,你可以使用 apiResource 方法自动排除这两个路由:

Route::apiResource(&#39;photos&#39;, PhotoController::class);
ログイン後にコピー

你也可以传递一个数组给 apiResources 方法来同时注册多个 API 资源控制器:

Route::apiResources([
    &#39;photos&#39; => PhotoController::class,
    &#39;posts&#39; => PostController::class,
]);
ログイン後にコピー

要快速生成不包含 createedit 方法的用于开发接口的资源控制器,请在执行 make:controller 命令时使用 --api 参数:

php artisan make:controller API/PhotoController --api
ログイン後にコピー

嵌套资源

有时可能需要定义一个嵌套的资源型路由。例如,照片资源可能被添加了多个评论。那么可以在路由中使用 “点” 符号来声明资源型控制器:

Route::resource(&#39;photos.comments&#39;, PhotoCommentController::class);
ログイン後にコピー

该路由会注册一个嵌套资源,可以使用如下 URI 访问:

/photos/{photo}/comments/{comment}
ログイン後にコピー

限定嵌套资源的范围

Laravel 的 隐式模型绑定 特性可以自动限定嵌套绑定的范围,因此已解析的子模型会自动属于父模型。定义嵌套路由时,使用 scoped 方法,可以开启自动范围限定,也可以指定 Laravel 应该按照哪个字段检索子模型资源

Route::resource(&#39;photos.comments&#39;, PhotoCommentController::class)->scoped([
    &#39;comment&#39; => &#39;slug&#39;,
]);
ログイン後にコピー

这个路由会注册一个限定范围的嵌套资源路由,可以像下面这样来访问:

/photos/{photo}/comments/{comment:slug}
ログイン後にコピー

浅层嵌套

通常,并不完全需要在 URI 中同时拥有父 ID 和子 ID ,因为子 ID 已经是唯一的标识符。当使用唯一标识符(如自动递增的主键)来标识 URI 中的模型时,可以选择使用「浅嵌套」的方式定义路由:

Route::resource(&#39;photos.comments&#39;, CommentController::class)->shallow();
ログイン後にコピー

上面的路由定义方式会定义以下路由:

HTTP 方式URI行为路由名称
GET/photos/{photo}/commentsindexphotos.comments.index
GET/photos/{photo}/comments/createcreatephotos.comments.create
POST/photos/{photo}/commentsstorephotos.comments.store
GET/comments/{comment}showcomments.show
GET/comments/{comment}/editeditcomments.edit
PUT/PATCH/comments/{comment}updatecomments.update
DELETE/comments/{comment}destroycomments.destroy

命名资源路由

默认情况下,所有的资源控制器行为都有一个路由名称。你可以传入 names 数组来覆盖这些名称:

Route::resource(&#39;photos&#39;, PhotoController::class)->names([
    &#39;create&#39; => &#39;photos.build&#39;
]);
ログイン後にコピー

命名资源路由参数

默认情况下,Route::resource 会根据资源名称的「单数」形式创建资源路由的路由参数。你可以在选项数组中传入 parameters 参数来轻松地覆盖每个资源。parameters 数组应该是资源名称和参数名称的关联数组:

Route::resource(&#39;users&#39;, AdminUserController::class)->parameters([
    &#39;users&#39; => &#39;admin_user&#39;
]);
ログイン後にコピー

上例将会为资源的 show 路由生成如下的 URI :

/users/{admin_user}
ログイン後にコピー

限定范围的资源路由

有时,在定义资源路由时隐式绑定了多个 Eloquent 模型,你希望限定第二个 Eloquent 模型必须为第一个 Eloquent 模型的子模型。例如,考虑这样一个场景,通过 slug 检索某个特殊用户的一篇文章:

use App\Http\Controllers\PostsController;Route::resource(&#39;users.posts&#39;, PostsController::class)->scoped();
ログイン後にコピー

你可以通过给 scoped 方法传递一个数组来覆盖默认的模型路由键:

use App\Http\Controllers\PostsController;Route::resource(&#39;users.posts&#39;, PostsController::class)->scoped([
    &#39;post&#39; => &#39;slug&#39;,
]);
ログイン後にコピー

当使用一个自定义键的隐式绑定作为嵌套路由参数时,Laravel 会自动限定查询范围,按照约定的命名方式去父类中查找关联方法,然后检索到对应的嵌套模型。在这种情况下,将假定 User 模型有一个叫 posts(路由参数名的复数)的关联方法,通过这个方法可以检索到 Post 模型。

默认情况下,Route::resource 将会用英文动词创建资源 URI。如果需要自定义 createedit 行为的动作名,可以在 AppServiceProviderboot 中使用 Route::resourceVerbs 方法实现:

use Illuminate\Support\Facades\Route;

/**
 * 引导任何应用服务。
 *
 * @return void
 */
public function boot()
{
    Route::resourceVerbs([
        &#39;create&#39; => &#39;crear&#39;,
        &#39;edit&#39; => &#39;editar&#39;,
    ]);
}
ログイン後にコピー

动作被自定义后,像 Route::resource(&#39;fotos&#39;, &#39;PhotoController&#39;) 这样注册的资源路由将会产生如下的 URI:

/fotos/crear

/fotos/{foto}/editar
ログイン後にコピー

补充资源控制器

如果您需要增加额外的路由到默认的资源路由之中,您需要在 Route::resource 前定义它们;否则, resource 方法定义的路由可能会无意间优先于您定义的路由:

Route::get('photos/popular', [PhotoController::class, 'popular']);

Route::resource(&#39;photos&#39;, PhotoController::class);
ログイン後にコピー

技巧:记得保持您的控制器的专一性。如果您需要典型的资源操作以外的方法,请考虑将您的控制器分割为两个更小的控制器。

依赖注入 & 控制器

构造注入

Laravel 服务容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的构造函数中使用类型提示需要的依赖项。声明的解析会自动解析并注入到控制器实例中去:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * 用户 repository 实例。
     */
    protected $users;

    /**
     * 创建一个新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}
ログイン後にコピー

您亦可类型提示 Laravel 契约 ,只要它能够被解析。取决于您的应用,注入依赖到控制器可能会提供更好的可测试性。

方法注入

除了构造器注入以外,您亦可在控制器方法中类型提示依赖。最常见的用法便是注入 Illuminate\Http\Request 到您的控制器方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 保存一个新用户。
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->name;

        //
    }
}
ログイン後にコピー

如果您的控制器方法要从路由参数中获取输入内容,请在您的依赖项之后列出您的路由参数。例如,您可以像下方这样定义路由:

Route::put(&#39;user/{id}&#39;, [UserController::class, &#39;update&#39;]);
ログイン後にコピー

如下所示,您依然可以类型提示 Illuminate\Http\Request 并通过定义您的控制器方法访问 id 参数:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 修改指定的用户。
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}
ログイン後にコピー

如果您的应用仅使用了基于路由的控制器,您应该充分利用 Laravel 路由缓存。使用路由缓存将会大幅降低您的应用路由的注册时间。有时,您的路由注册的速度可能会提高 100 倍。要生成路由缓存,仅需执行 route:cache Artisan 命令:

php artisan route:cache
ログイン後にコピー

在运行该命令后,每次请求将会加载您缓存的路由文件。请记住,您每次添加新路由后均需要生成新的路由缓存。因此,您应该在项目部署时才运行 route:cache 命令。

您亦可使用 route:clear 来清除路由缓存:

php artisan route:clear
ログイン後にコピー

【相关推荐:laravel视频教程

以上がLaravelコントローラーとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles