[Laravel8.x] web.phpとapi.phpの違い

Routeにはweb.phpとapi.phpがある。

web.php
-> ブラウザからHTTPリクエストを受けて、画面に表示するようなルーティングを設定する場合に使用する

api.php
-> 外部からのHTTPリクエストを受けて値を返却するようなルーティング
-> ミニマムなミドルウェアが適用される

kernel.php
-> apiは、VerifyCsrfTokenが入っていない

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Laravel\Jetstream\Http\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

キャッシュとして失敗回数を保存しているのかな。
apiで認証しているのはわかるが、イマイチ理解できんな。。

Laravel : http requestからルーティングまでのkernel処理の流れ

ユーザがアクセスしてきた時に、requestからresponseまでの処理がどうなっているのか?
1. /public/.httaccess が読み込まれる
2. RewriteCond %{REQUEST_FILENAME}により、該当ディレクトリ、該当ファイルが読み込まれる
3. /public/index.php が呼ばれる
4. index.phpにより、カーネル処理が登録される
5. ルーティング処理

### 1,2 /public/.httaccess
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
-> RewriteCondで、該当ディレクトリ、該当ファイルが読み込まれる
-> RewriteCond に記述した条件が満たされた時のみ RewriteRule に記述したURLの書き換えと転送が実行される

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

### 3~4./public/index.php
– autoload.php、bootstrap/app.phpが読み込まれる
 (controllerのuse classを使用する為)
– アプリケーションインスタンスの生成
 (Illuminate\Foundation\Applicationのインスタンス)
– カーネル処理
 (app/Http/Kernel.phpに渡される。その際に「環境設定」「エラーハンドラー」「ミドルウェア」「サービスプロバイダ」などが読み込まれる)
 HTTPカーネルがサービスプロバイダを登録する際に、web.phpファイルが読み込まれる
– リクエストのディスパッチ

require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);

### 5. Illuminate\Contracts\Http\Kernel

public function bootstrap();
public function handle($request);
public function terminate($request, $response);
public function getApplication();

### 6. ルーティング
– ファサードを使い、Illuminate\Routing\Routerクラスの各メソッドを使う

vendor/laravel/framework/src/illuminateに機能が揃ってますね。

Laravel 権限よる表示制御と404ページの作成方法

Userモデル側でロールの判定は行い、middlewareではページ遷移の制御を行う
404はviews/errors/フォルダの下に404.blade.phpを作る

### middlewareによる制御
$ php artisan make:middleware Admin
$ git add .
$ git commit -m “user section working except security”

app/Http/kernel.php

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'admin' => \App\Http\Middleware\Admin::class,
    ];

Route

Route::group(['middleware']=>'admin', function(){
	Route::resource('admin/users', 'AdminUsersController');	
});

User.php

public function isAdmin(){
        if($this->role->name == "administrator"){
            return true;
        }
        return false;
    }

app/Http/Middleware/Admin.php

use Illuminate\Support\Facades\Auth;
public function handle($request, Closure $next)
    {
        if(Auth::check()){
            if(Auth::user()->IsAdmin()){
                return $next($request);
            }

        }
        return redirect('/');
    }

※return redirect(404);で404にリダイレクトする

### 404ページ作成
resources/views/errors/404.blade.php

<h1>Custom 404 Page</h1>

That’s it.
他のアプリケーションでどうやってるかや開発文化などにもよるが、403、404、503あたりはカスタムで作っておきたい。ちょくちょく、404に異常に凝ったデザインを見かけるが、私はシンプル派。デザイン全然勉強してないからかな😅😅😅

routeからcontrollerへのデータパス

getでcontrollerを呼ぶとき

Route::get('/post', 'PostsController@index');
public function index()
    {
        return "its working";
    }

ここで、routeからデータを渡したい
ブランケットで囲むとデータを引き継げる

Route::get('/post/{id}/', 'PostsController@index');

indexがfunction

public function index($id)
    {
        return "its working with" . $id;
    }

Laravel Route

基礎をやります。
パラメーターを渡す。

Route::get('/post/{id}/{name}', function($id, $name){
	return "this is post number " . $id . "," . $name;
});

asで引数を渡す。
パスが長い場合は書き換える

Route::get('/admin/posts/example', array('as'=>'admin.home', function(){
	$url = route('admin.home');
	return "this url is" . $url;

}));

php artisan route:listで表示

$ php artisan route:list
+——–+———-+———————+————+———+————+
| Domain | Method | URI | Name | Action | Middleware |
+——–+———-+———————+————+———+————+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | about | | Closure | web |
| | GET|HEAD | admin/posts/example | admin.home | Closure | web |
| | GET|HEAD | post/{id}/{name} | | Closure | web |
+——–+———-+———————+————+———+————+