Teras aplikasi php indeks abstrak. Pertanyaan untuk fail statik

Artikel pertama tentang membangunkan rangka kerja anda sendiri akan ditumpukan kepada gambaran keseluruhan keupayaan yang dimaksudkan utama dan ciri seni bina rangka kerja baharu. Di sini saya akan menerangkan modul dan komponen, pembangunannya akan diterangkan secara terperinci dalam artikel seterusnya. Jadi, mari kita tentukan cara kita mengatur kod rangka kerja dan aplikasi yang akan menggunakannya, dan kemudian kita akan membuat peta jalan untuk pembangunan komponen utama.

Sebagai permulaan, saya memilih struktur direktori projek yang mudah dan ringkas:

    /
  • app – direktori pelayan webroot, letakkan index.php di sini
    • awam - di sini kami akan menyimpan fail aplikasi statik
  • src – direktori dengan kod sumber aplikasi itu sendiri
    • Blog – setiap aplikasi terletak dalam direktorinya sendiri
  • lib - direktori untuk perpustakaan luaran. Kod rangka kerja juga akan terletak di sini.
  • var – direktori untuk fail aplikasi (cache, storan fail, sesi, dll.)

Kami telah memutuskan pada direktori. Kini kita boleh memisahkan komponen aplikasi individu dengan mudah ke dalam direktori yang berbeza, menggunakan PSR0 untuk autoload kelas, dsb.
Seterusnya, anda perlu memilih nama rangka kerja untuk mencipta direktori untuknya di dalam lib. Tanpa berfikir dua kali, saya memilih nama Bun - pendek, mudah diingati dan seolah-olah tidak bercanggah dengan apa-apa.

Di dalam lib kami mencipta direktori bun (penjual ruang nama), di dalamnya direktori bun lain (pustaka ruang nama), dan di dalamnya src - di sini kami akan meletakkan kod rangka kerja kami. Struktur direktori yang canggih ini akan membolehkan kami menyambungkan rangka kerja melalui http://packagist.org pada masa hadapan tanpa masalah yang tidak perlu.

Seterusnya, kami memilih ruang nama untuk kelas asas rangka kerja - saya memilih Teras. Untuk mengatur sambungan komponen di luar direktori Teras pada masa hadapan, anda perlu mengatur struktur modular rangka kerja. Oleh itu, komponen pertama sistem yang saya ada ialah modul (Bun\Core\Module).

Bun\Core\Modul

Modul ini harus menyediakan maklumat asas kepada komponen rangka kerja bebas. Sebagai permulaan, konfigurasi dan kebergantungan yang digunakan oleh modul, versi, perihalan modul, dsb. Setiap direktori di dalam lib/bun/bun/src akan menjadi modul yang berasingan dan mesti mengandungi kelas dengan nama yang sama (contohnya, Bun\Core\Core.php) - yang mewakili pelaksanaan modul.

Bun\Core\Application

Aplikasi ini adalah pelaksanaan corak Pengawal Hadapan - satu titik masuk ke dalam aplikasi untuk semua permintaan. Seni bina Bun akan menyediakan bahawa semua permintaan, termasuk php cli atau permintaan untuk fail statik, mesti diproses dalam Aplikasi. Contoh aplikasi akan dibuat dalam index.php (fail mula); apabila memulakan aplikasi, persekitaran pelaksanaannya (pengeluaran, pembangunan, ujian, dll) akan ditunjukkan. Aplikasi kemudiannya akan melakukan kerja memuatkan konfigurasi, memulakan bekas perkhidmatan, menghalakan permintaan melalui komponen tambahan, memanggil pengawal, mengeluarkan respons dan menamatkan aplikasi.

Perkara pertama yang kami lakukan apabila aplikasi bermula, sebagai peraturan, adalah untuk memuatkan fail konfigurasi, jadi komponen asas seterusnya ialah Config

Bun\Core\Config

Untuk mengkonfigurasi komponen aplikasi dan rangka kerja, satu set kelas yang berasingan diperuntukkan - Bun\Core\Config\ApplicationConfig - perkhidmatan itu sendiri untuk mengurus konfigurasi dan kelas Bun\Core\Config\AbstractConfig - kelas abstrak yang merupakan kelas asas untuk elemen konfigurasi. Kelas PHP dipilih sebagai format konfigurasi. Ini mudah dari sudut pandangan caching, i.e. Lebih menguntungkan untuk menyimpan konfigurasi terus dalam kod aplikasi daripada menggunakan fail berasingan dalam format xml, json, ini, dsb.

Menggunakan kelas sebagai konfigurasi juga mudah untuk memisahkan konfigurasi komponen individu dan bahagian aplikasi. Ia juga mudah untuk mengatasi tetapan rangka kerja lalai dalam aplikasi, atau tetapan aplikasi dalam persekitaran pelaksanaan tertentu. Mengikut reka bentuk, setiap modul atau aplikasi mengandungi dalam dirinya sendiri ruang nama Config - di mana kelas konfigurasi disimpan. Setiap kelas mempunyai ruang nama sendiri, dan menyimpan parameter konfigurasi sebagai tatasusunan dalam harta yang dilindungi.
Akses kepada konfigurasi diandaikan melalui notasi titik $config->get("name1.name2.param1") .

Selepas kami memulakan konfigurasi aplikasi, kami boleh mula memproses permintaan. Set komponen Http yang berasingan diperuntukkan untuk bekerja dengan permintaan dan respons daripada aplikasi web



Bun\Core\Http

Set komponen Http akan bertanggungjawab untuk mengabstraksi daripada bekerja dengan pembolehubah superglobal $_SERVER, $_GET, $_POST, dll. Perkhidmatan Bun\Core\Http\Request akan bertanggungjawab untuk ini. Selain itu, Http akan menyertakan kelas Respons - yang akan menjadi standard untuk hasil aplikasi, i.e. melancarkan pengawal mesti berakhir dengan menerima objek Bun\Core\Http\Response. Kelas ini mengabstrak kita daripada bekerja dengan pengepala http, dsb. Selain itu, adalah mudah untuk menggunakan kelas terbitan seperti AjaxResponse, DownloadResponse, ConsoleResponse, dsb.

Apabila kami bersedia untuk menerima maklumat tentang permintaan itu, kami boleh beralih kepada penghalaan: komponen seterusnya ialah Penghala

Bun\Core\Router

Penghala ialah komponen standard aplikasi web PHP moden. Tiada apa-apa yang lebih biasa dalam penghala Rangka Kerja Bun, konfigurasi mudah dalam bentuk tatasusunan templat permintaan URL, yang dipetakan ke kelas pengawal dan tindakannya. Saya merancang untuk melaksanakan keupayaan untuk menghuraikan parameter daripada url seperti /page/view/:page_id - yang akan dihantar kepada tindakan pengawal sebagai argumen. Saya juga merancang untuk memisahkan permintaan mengikut kaedah (mudah apabila beberapa kaedah hanya boleh dipanggil melalui POST - tidak perlu melakukan semakan yang tidak perlu dalam kod logik perniagaan)

Kami beralih daripada satu komponen standard aplikasi PHP ke yang lain - penghalaan permintaan berkait rapat dengan pelaksanaan corak MVC (Model View Controller). Ini melibatkan pengasingan logik aplikasi, data dan paparan.

Rangka Kerja Bun MVC

Sukar untuk membezakan diri anda dalam pelaksanaan MVC - jadi segala-galanya di sini juga agak prosaik. Di dalam Teras, saya memperuntukkan ruang nama Pengawal - di sini saya mencipta kelas pengawal asas yang mempunyai akses kepada semua komponen sistem, menyimpan objek aplikasi yang melancarkannya, dan perkhidmatan konfigurasi. Semasa permulaan, pengawal menerima parameter pelancaran: nama kaedah (tindakan) dan hujahnya.

Saya memperuntukkan kod paparan ke direktori Lihat berasingan di dalam Teras. Rangka Kerja Bun tidak menyediakan sebarang komponen khusus jenis Paparan - diandaikan bahawa anda hanya menarik templat yang dikehendaki di dalam pengawal, menghantar data ke sana. Secara lalai, saya berhasrat untuk menambah sokongan untuk enjin templat Twig dan sokongan untuk templat *.phtml asli ke dalam rangka kerja

Komponen terakhir ialah Model. Saya juga memperuntukkan ruang nama yang berasingan untuknya di dalam Core: Model. Di sinilah satu lagi komponen asas rangka kerja akan dimainkan - ObjectMapper. Model itu sendiri hanyalah kelas, i.e. bukan ActiveRecord, tetapi mereka melaksanakan Bun\Core\Model\ModelInterface tertentu. Kelas inilah yang ObjectMapper boleh bekerjasama dan menyimpannya ke beberapa jenis storan.

Sekarang kita perlu bercakap tentang kedua-dua pemeta objek dan storan, mari kita mulakan dengan yang pertama.

Bun\Core\ObjectMapper

Pemeta objek mungkin merupakan bahagian paling kompleks dalam modul Teras rangka kerja. Ia akan menjadi perkhidmatan yang boleh menukar objek model menjadi rekod dalam beberapa pangkalan data, dan juga melakukan sebaliknya - ambil rekod dari stor data dan petakannya menjadi objek model. Secara lalai, modul Teras akan menyertakan perkhidmatan yang melaksanakan penyimpanan fail objek.

Bun\Core\Storage

Set komponen Storan mewakili abstraksi dan antara muka yang perlu diikuti oleh mana-mana pelaksanaan storan dalam aplikasi. Storan pertama sedemikian ialah Bun\Core\Storage\FileStorage . Untuk beroperasi, storan fail akan menggunakan satu set kelas tambahan untuk bekerja dengan fail, serta untuk membina pertanyaan untuk mencari rekod dalam storan fail.

Pemeta objek yang diterangkan di atas akan dapat berfungsi dengan mana-mana pelaksanaan Storan untuk menyimpan objeknya di sana. Di sini adalah bernilai menyerlahkan satu lagi komponen penting modul Teras - Repositori.

Bun\Core\Repository

Repositori ialah lapisan akses kepada objek. Untuk tidak membebankan pemeta objek dengan fungsi carian dan pelbagai pilihan objek dari repositori, kerja ini telah dipindahkan ke repositori. Repositori boleh berfungsi secara langsung dengan repositori, pilih data dari sana, dan kemudian mengubahnya menjadi objek melalui ObjectMapper dan memindahkannya ke aplikasi.

Biar saya segera menyebut sesuatu yang berkaitan dengan komponen yang diterangkan di atas - cache

Bun\Core\Cache

Cache – akan mengandungi satu set abstraksi untuk melaksanakan interaksi dengan pelbagai storan cache, seperti Redis, Memacached, dsb. Selain itu, modul Teras akan menyertakan komponen FileCacheDriver, yang melaksanakan caching data dalam fail.

Di sini kita beralih kepada komponen rangka kerja yang penting dan, pada pendapat saya, menentukan seni bina. Fleksibiliti dan kebolehgantian komponen dicapai apabila kod anda tidak terikat dengan perkhidmatan terkemuka, tetapi boleh bertukar dengan cepat antara mereka. Di samping itu, komponen seterusnya melakukan tugas yang hebat dalam mengatur rangka kerja dan kod aplikasi dengan cekap.

Bun\Core\Container

Bekas – melaksanakan salah satu corak pengaturcaraan kegemaran saya – Suntikan Ketergantungan. Suntikan kebergantungan adalah baik dalam segala-galanya - bahagian aplikasi bergantung pada komponen tertentu secara lemah, kelas individu mudah diuji dengan menggantikan kebergantungan mereka. Adalah mudah untuk melaksanakan pelaksanaan alternatif dalam beberapa perkhidmatan, dan kemudian menukar antara mereka dengan mudah walaupun tanpa perubahan pada kod aplikasi. Selain itu, kelas anda yang menggunakan suntikan kebergantungan jelas menunjukkan kebergantungan mereka - malah anda boleh membina graf kebergantungan komponen aplikasi anda.

Kontena memulakan dan menyimpan perkhidmatan yang dikonfigurasikan semasa masa jalan aplikasi apabila perkhidmatan ini diakses oleh aplikasi. Dalam satu kelas, anda pada dasarnya mempunyai kawalan ke atas semua bahagian aplikasi.

Ini melengkapkan komponen asas rangka kerja dalam modul Teras buat masa ini. Semasa pelaksanaan, modul Teras mungkin termasuk pelaksanaan pengurusan acara, FormBuilder. Antara komponen tambahan, perlu diperhatikan menaip pengecualian. Kelas pengecualian asas Bun\Core\Exception\Exception disediakan supaya semua pengecualian ditaip lain dalam aplikasi dan rangka kerja mewarisi daripadanya. Ini menyediakan pemintasan pengecualian terpusat pada peringkat aplikasi dan menghalang pengecualian yang tidak ditangkap daripada berlaku dan menyebabkan aplikasi ranap.

Dalam bahagian berikut cerita tentang pembangunan Rangka Kerja Bun, saya akan mula bercakap tentang komponen Aplikasi, dan juga menerangkan intipati fail autoloading mengikut piawaian PSR0. Selepas itu, saya akan beralih kepada penerangan perkhidmatan konfigurasi aplikasi dan satu set komponen Http

Daripada corak, saya berpuas hati dengan mvc, pendaftaran. Untuk permintaan, saya menulis lapisan abstraksi kecil, untuk penghalaan - fungsi parsing permintaan saya sendiri.
Struktur aplikasi web akan menjadi seperti ini

folder aplikasi

Fail input index.php termasuk bootstrap.php. Itu, seterusnya, menyambungkan kernel, fail konfigurasi, beberapa perpustakaan dan memulakan penghala.

Gunakan Core\Route; memerlukan_sekali "lib/registry.php"; memerlukan_sekali "config.php"; memerlukan_sekali "lib/datebase.php"; memerlukan_sekali "teras/model.php"; memerlukan_sekali "teras/view.php"; memerlukan_sekali "teras/pengawal.php"; memerlukan_sekali "teras/laluan.php"; $router = Laluan baru(); $router->start(); //mulakan penghala

Pendaftaran adalah mudah:

Ruang nama Lib; kelas Lib_Registry ( $data peribadi statik = array(); set fungsi awam statik ($kunci, $value) ( ​​​​self::$data[$key] = $value; ) fungsi awam statik get($key) ( return isset( self::$data[$key]) ? self::$data[$key] : null; ) statik public function remove($key) ( if (isset(self::$data[$key])) ( unset (self::$data[$key]); ) ) )

Berikut ialah getter dan setter untuk menyimpan nilai global.

Gunakan Lib\Lib_Registry; define("PATH_SITE", $_SERVER["DOCUMENT_ROOT"]); define("HOST", "localhost"); define("USER", "root"); define("KATAlaluan", "laluan saya"); define("NAME_BD", "articles"); define("DS", DIRECTORY_SEPARATOR); $mysqli = mysqli baharu(HOST, USER, PASSWORD,NAME_BD)atau die("Tidak dapat mewujudkan sambungan ke pangkalan data."$mysqli->connect_errno()); Lib_Registry::set("mysqli",$mysqli); $mysqli->query("SET nama "utf8""); //base menetapkan pengekodan data dalam pangkalan data

Permintaan seperti http://domen.ru/articles/index ditukar menjadi Pengawal - Tindakan. Nama pengawal dan tindakan ditetapkan dalam gaya rangka kerja Zend, sarung unta - Nama_Pengawal, nama_tindakan fungsi (). Pengawal, model, fail paparan mesti sepadan dengan nama pengawal dalam huruf kecil tanpa awalan Controller_ atau Model_

Kelas model ditentukan dengan cara yang sama - Model_Name, kami telah mengetahui fail paparan - dengan nama tindakan atau secara eksplisit dalam kaedah generate(name)

Memandangkan kami merancang untuk membuat panel pentadbir pada masa hadapan, kami akan mencipta folder klien dan pentadbir. Dengan cara ini, penghala kami akan mengambil kira subfolder, i.e. adalah mungkin untuk membuat subfolder dalam pengawal (cth. /about/contacts/contacts.php) dan mengaksesnya di sepanjang laluannya /about/contacts/
Jadi kami memulakan penghala

/** * */ public function start() ( // tangkap permintaan AJAX if ($this->getIsAjaxRequest()) ( ) session_start(); $this->dispatch(); ) /** * */ public function dispatch())( // penghantar menerima fail yang sepadan dengan nama pengawal, tindakan dan argumen $this->getDirections($file, $controller, $action, $args); /* ******* ***** * sertakan Pengawal - Model */ if (is_readable($file) == false) ( die ("Fail $fail 404 Tidak Ditemui"); ) // menyambungkan pengawal termasuk ($fail); $model = str_replace("controller" , "model", $file); // Model tambahan if(is_readable($model))( // sambungkan model include($model); ) /* ****** dapatkan kelas ** */ $controller = ucfirst($controller); $class = ucfirst($this->namespace)."\Controller_" . $controller; // buat instance $controller = new $class($this-> controller_path_folder); if (is_callable(array( $controller, $action)) == false) ( die ("Action $action 404 Not Found"); ) // panggil tindakan $controller->$action($args); )

Penghantar memanggil kaedah getDirections(), i.e. dapatkan arahan permintaan. Secara lalai, pengawal lalai ialah artikel, tindakannya ialah indeks.

/** * @param $file * @param $controller * @param $action * @param $args */ private function getDirections(&$file, &$controller, &$action, &$args) ($route = ( kosong($_SERVER["REQUEST_URI"])) ? "" : $_SERVER["REQUEST_URI"]; unset($_SERVER["REQUEST_URI"]); $route = trim($route, "/\\"); $ controller_path = $this->path; if (kosong($route)) ( /* ******************* Arah lalai ******** */ $controller = "articles"; $action = "action_index"; $controller_path = $this->controller_path_folder = "application/controllers/$this->namespace/"; $file = $controller_path.$controller.".php"; ) else ( $parts = explode("/", $route); /* ************** ruang nama ********** */ if($parts = = "admin") ( $this->namespace = "admin"; array_shift($parts); ) /* ***************** folder & subfolder ***** ** */ $fullpath = $this->controller_path_folder = $controller_path . $this->namespace; foreach ($parts as $part) ( $fullpath .= DS . $part; if (is_dir($fullpath)) ( array_shift ($bahagian); teruskan; ) if (is_file($fullpath . ".php")) ( array_shift($parts); $file = "$fullpath.php"; break; ) ) /* ************* ** Pengawal, Tindakan, Param ******** */ if(!isset($part)) $part = "articles"; $pengawal = $bahagian; if(!$file) $file = $fullpath."/$part.php"; $action = array_shift($parts); if(!$action) $action = "indeks_tindakan"; else $action = "action_$action"; $args = $bahagian; ) )

Dalam pelajaran seterusnya kita akan melihat untuk mencipta pengawal asas, model dan pandangan, dan menulis pertanyaan.

Pelajaran 1 fail di sini

https://github.com/vaajnur/create_php_application
Cawangan induk akan menjadi pelajaran pertama, maka untuk setiap pelajaran akan ada cabang dengan nama yang sama - pelajaran1, pelajaran2, 3..

Kemas kini terakhir: 29/11/2017

Angular mempunyai sistem penghalaan sendiri yang membolehkan anda memetakan laluan ke komponen. Tetapi ASP.NET Core juga mempunyai sistem penghalaan sendiri, yang digunakan untuk memproses permintaan. Apakah masalah yang mungkin kita hadapi? Sebagai contoh, mari kita ambil projek dari topik sebelumnya, di mana penghalaan telah digunakan. Jika kita mengikuti pautan di dalam aplikasi Angular, maka semuanya akan baik-baik saja.

Walau bagaimanapun, jika kami terus memasukkan alamat yang kami perlukan dalam bar alamat penyemak imbas dan menghantar permintaan, maka permintaan sedemikian tidak akan diproses dengan betul:

Walaupun permintaan dibuat ke alamat yang sama, dalam kes kedua kami akan menerima ralat 404.

Apabila kami mengklik pada pautan atau secara pemrograman di dalam aplikasi Angular, API HTML5 (Pushstate API) yang sepadan digunakan, yang menukar URL dalam penyemak imbas tanpa menghantar permintaan HTTP. Tetapi apabila kami memasukkan alamat sumber secara manual dalam bar alamat penyemak imbas, penyemak imbas menghantar permintaan baharu kepada aplikasi Teras ASP.NET.

Dalam contoh di atas, permintaan "produk/1" telah dihantar. Tetapi kami tidak mempunyai tindakan pengawal yang memetakan permintaan sedemikian. Jadi secara semula jadi kita akan mendapat ralat. Dan kita perlu menambah kod sisi pelayan tambahan supaya permintaan tersebut juga akan diproses oleh aplikasi Angular.

Apa yang boleh kita lakukan dalam kes ini? Semuanya bergantung pada bagaimana halaman web terbentuk. Atau ia secara langsung adalah halaman web statik yang dihantar terus kepada pengguna. Atau ini ialah paparan (fail dengan sambungan cshtml) di mana kod pemuatan untuk aplikasi Angulr ditakrifkan.

Pertanyaan untuk fail statik

Dalam topik sebelumnya, aplikasi Angular telah dimuatkan ke dalam halaman web statik, index.html, yang terletak dalam projek dalam folder wwwroot:

Sudut dalam Teras ASP.NET

Dan dalam kes ini, kami memerlukannya, jika permintaan itu tidak dimaksudkan untuk fail statik, dan tidak dimaksudkan untuk mana-mana tindakan pengawal, maka fail index.html akan dihantar sebagai tindak balas kepada permintaan sedemikian. Dan dalam kes ini, di sisi pelayan kita boleh menggunakan beberapa pendekatan.

Kaedah jalankan

Cara paling mudah ialah menambah perisian tengah pada penghujung saluran paip pemprosesan permintaan, yang akan menghantar fail index.html. Untuk melakukan ini, tukar kaedah Konfigurasikan dalam kelas Permulaan:

Public void Configure(apl IApplicationBuilder, IHostingEnvironment env) ( if (env.IsDevelopment()) ( app.UseDeveloperExceptionPage(); app.UseWebpackDevMiddleware(WebpackDevMiddlewareOptions baharu ( HotModuleReplacement = true )); ) app.UseFilesDefault(UseFiles); ); app.UseMvc(); // proses laluan yang sebelum ini tidak dipetakan ke app.Run(async (context) => ( context.Response.ContentType = "text/html"; tunggu context.Response.SendFileAsync(Path .Combine(env.WebRootPath, "index.html")); )); )

Oleh itu, untuk semua permintaan yang tidak dipetakan kepada sumber dalam aplikasi, fail wwwroot/index.html akan dihantar.

Kelemahan pendekatan ini ialah sukar bagi kami untuk mendayakan pengendalian ralat 404 pada bahagian pelayan. Memandangkan jika kami tidak mempunyai pengawal dan tindakan yang sepadan dengan permintaan, maka permintaan itu akan tetap diproses, walaupun pada bahagian klien dalam Sudut.

Menghantar fail menggunakan kaedah pengawal

Pendekatan serupa disediakan dengan menghantar fail menggunakan kaedah pengawal. Sebagai contoh, katakan anda mempunyai HomeController berikut dalam projek anda dalam folder Pengawal:

Menggunakan Microsoft.AspNetCore.Mvc; menggunakan System.IO; menggunakan Microsoft.AspNetCore.Hosting; ruang nama HelloAngularApp.Controllers ( public class HomeController: Controller ( IHostingEnvironment env; public HomeController(IHostingEnvironment env) ( this.env = env; ) public IActionResult Index() ( return new PhysicalFileResult(Path.Combine(env.WebRootPath, "index.WebRootPath, "index.WebRootPath, "index. "), "teks/html"); ) ) )

Dalam kes ini, kaedah Indeks menghantar fail index.html.

Dalam kes ini, tukar kaedah Konfigurasikan kelas Permulaan seperti berikut:

Public void Configure(Apl IApplicationBuilder, IHostingEnvironment env) ( if (env.IsDevelopment()) ( app.UseDeveloperExceptionPage(); app.UseWebpackDevMiddleware(WebpackDevMiddlewareOptions baharu ( HotModuleReplacement = true )); ) ` app.UseDeveloperExceptionPage(); app.UseWebpackDevMiddleware(WebpackDevMiddlewareOptions baharu ( HotModuleReplacement = true )); ) ` app.UseDeveloperExceptionPage(); (); app.UseMvc(laluan =>

Dalam kes ini, dua laluan ditentukan untuk infrastruktur MVC. Laluan pertama memetakan kepada pengawal biasa dan tindakan mereka. Laluan kedua ditakrifkan menggunakan kaedah MapSpaFallbackRoute() dan peta kepada tindakan Indeks pengawal Rumah, yang dalam kes ini menghantar fail index.html kembali kepada pengguna.

Permintaan kepada tindakan pengawal

Kami secara pilihan boleh menentukan pemuatan aplikasi Angular dalam halaman html statik. Ia juga boleh menjadi persembahan. Sebagai contoh, mari tentukan direktori Views/Home dalam projek dan letakkan fail baharu Index.cshtml di dalamnya:

Sudut dalam Teras ASP.NET

Dalam kes ini, paparan hanya mengandungi kod html, walaupun jika perlu, anda juga boleh menentukan arahan Razor di dalamnya, membuat halaman induk untuknya, dsb.

Dan kaedah Indeks HomeController akan menggunakan pandangan ini:

Menggunakan Microsoft.AspNetCore.Mvc; ruang nama HelloAngularApp.Controllers ( public class HomeController: Controller ( public IActionResult Index() ( return View(); ) ) )

Dalam kaedah Konfigurasikan kelas Permulaan, kami mentakrifkan kod berikut:

Public void Configure(IApplicationBuilder app, IHostingEnvironment env) ( if (env.IsDevelopment()) ( app.UseDeveloperExceptionPage(); app.UseWebpackDevMiddleware(WebpackDevMiddlewareOptions baharu ( HotModuleReplacement = true )); ) //app.UseDefast();) //app.UseDefa kaedah tidak lagi diperlukan app.UseStaticFiles(); app.UseMvc(routes => ( routes.MapRoute(name: "default", template: "(controller=Home)/(action=Index)/(id?)" ); route.MapSpaFallbackRoute("angular-fallback", new ( controller = "Home", action = "Index")); )); )

Di sini sekali lagi, menggunakan kaedah route.MapSpaFallbackRoute, semua permintaan lain yang tidak dipetakan kepada sumber lain akan dikendalikan oleh kaedah Indeks HomeController.