Cara menggunakan getparameter php

Phalcon\Mvc\Dispatcher adalah komponen yang bertanggung jawab untuk instantiating controller dan mengeksekusi tindakan yang diperlukan pada mereka dalam aplikasi MVC. Memahami operasi dan kemampuannya membantu kami mendapatkan lebih banyak dari layanan yang disediakan oleh framework

Putaran Pengiriman

Ini adalah proses penting yang banyak berkaitan dengan aliran MVC itu sendiri, terutama dengan bagian pengontrol. Pekerjaan terjadi di dalam controller dispatcher. File pengontrol dibaca, dimuat, dan dipakai. Kemudian tindakan yang diperlukan dijalankan. Jika suatu tindakan meneruskan aliran ke pengontrol/tindakan lain, pengirim pengontrol akan memulai lagi. Untuk mengilustrasikan hal ini dengan lebih baik, contoh berikut menunjukkan kira-kira proses yang dilakukan di dalam Phalcon\Mvc\Dispatcher

0. Beberapa peristiwa saat mengembalikan boolean 
1 dapat menghentikan operasi aktif. Acara berikut ini didukung

Nama PeristiwaDipicuDapatkah menghentikan operasi?Dipicu sebelumDispatchLoopDipicu sebelum masuk dalam loop pengiriman. Pada titik ini operator tidak mengetahui apakah pengontrol atau tindakan yang akan dieksekusi ada. Dispatcher hanya mengetahui informasi yang disampaikan oleh Router. YesListenersbeforeDispatchDipicu setelah masuk dalam loop pengiriman. Pada titik ini operator tidak mengetahui apakah pengontrol atau tindakan yang akan dieksekusi ada. Dispatcher hanya mengetahui informasi yang disampaikan oleh Router. YesListenersbeforeExecuteRouteTriggered sebelum menjalankan metode controller/action. Pada titik ini operator telah menginisialisasi pengontrol dan mengetahui apakah ada tindakan. YesListeners/ControllersinitializeAllow untuk menginisialisasi pengontrol secara global di requestNoControllersafterExecuteRouteTriggered setelah menjalankan metode pengontrol/tindakan. Karena operasi tidak dapat dihentikan, hanya gunakan acara ini untuk melakukan pembersihan setelah menjalankan actionNoListeners/ControllersbeforeNotFoundActionTriggered ketika tindakan tidak ditemukan di controllerYesListenersbeforeExceptionTriggered sebelum operator melempar exceptionYesListenersafterDispatchTriggered setelah mengeksekusi metode pengontrol/tindakan. Karena operasi tidak dapat dihentikan, hanya gunakan acara ini untuk melakukan pembersihan setelah mengeksekusi actionYesListenersafterDispatchLoopTriggered setelah keluar dari dispatch loopNoListenersafterBindingTriggered setelah model terikat tetapi sebelum mengeksekusi routeYesListeners/Controllers

Tutorial INVO menunjukkan cara memanfaatkan pengiriman peristiwa yang mengimplementasikan filter keamanan dengan Acl

Contoh berikut menunjukkan cara melampirkan pendengar ke komponen ini

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);

Pengontrol yang dibuat secara otomatis bertindak sebagai pendengar untuk peristiwa pengiriman, sehingga Anda dapat menerapkan metode sebagai panggilan balik

2 tidak sama dengan membuat pengalihan HTTP. Meski ternyata mereka mendapat hasil yang sama. 
3 tidak memuat ulang halaman saat ini, semua pengalihan terjadi dalam satu permintaan, sedangkan pengalihan HTTP memerlukan dua permintaan untuk menyelesaikan proses

Lebih banyak contoh penerusan

dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);

Tindakan

_3 menerima parameter berikut

ParameterDescription
5Nama pengontrol yang valid untuk diteruskan. 
6Nama tindakan yang valid untuk diteruskan. 
7Sebuah array parameter untuk tindakan. 
8Nama ruang nama yang valid tempat pengontrol menjadi bagiannya

Menggunakan Pengelola Acara

Anda dapat menggunakan acara

_9 untuk mengubah modul dan mengarahkan ulang lebih mudah dan "lebih bersih"

 [
      'className' => 'App\Backend\Bootstrap',
      'path'      => '/app/Modules/Backend/Bootstrap.php',
      'metadata'  => [
          'controllersNamespace' => 'App\Backend\Controllers',
      ],
  ],
];

$manager = new Manager();

$manager->attach(
  'dispatch:beforeForward',
  function (Event $event, Dispatcher $dispatcher, array $forward) use ($modules) {
      $metadata = $modules[$forward['module']]['metadata'];
      $dispatcher->setModuleName($forward['module']);
      $dispatcher->setNamespaceName($metadata['controllersNamespace']);
  }
);

$dispatcher = new Dispatcher();
$dispatcher->setDI($di);
$dispatcher->setEventsManager($manager);
$di->set('dispatcher', $dispatcher);
$dispatcher->forward(
  [
      'module'     => 'backend',
      'controller' => 'posts',
      'action'     => 'index',
  ]
);

echo $dispatcher->getModuleName(); // will display properly 'backend'

Mempersiapkan parameter

Berkat hook point yang disediakan oleh Phalcon\Mvc\Dispatcher, Anda dapat dengan mudah mengadaptasi aplikasi Anda ke skema URL apa pun; . e. Anda mungkin ingin URL Anda terlihat seperti itu.

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
0. Karena parameter diteruskan dengan urutan yang ditentukan dalam URL ke tindakan, Anda dapat mengubahnya untuk mengadopsi skema yang diinginkan

set(
    'dispatcher',
    function () {
        // Create an EventsManager
        $eventsManager = new EventsManager();

        // Attach a listener
        $eventsManager->attach(
            'dispatch:beforeDispatchLoop',
            function (Event $event, $dispatcher) {
                $params = $dispatcher->getParams();

                $keyParams = [];

                // Use odd parameters as keys and even as values
                foreach ($params as $i => $value) {
                    if ($i & 1) {
                        // Previous param
                        $key = $params[$i - 1];

                        $keyParams[$key] = $value;
                    }
                }

                // Override parameters
                $dispatcher->setParams($keyParams);
            }
        );

        $dispatcher = new MvcDispatcher();

        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    }
);

Jika skema yang diinginkan adalah.

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
1, kode berikut diperlukan

set(
    'dispatcher',
    function () {
        // Create an EventsManager
        $eventsManager = new EventsManager();

        // Attach a listener
        $eventsManager->attach(
            'dispatch:beforeDispatchLoop',
            function (Event $event, $dispatcher) {
                $params = $dispatcher->getParams();

                $keyParams = [];

                // Explode each parameter as key,value pairs
                foreach ($params as $number => $value) {
                    $parts = explode(':', $value);

                    $keyParams[$parts[0]] = $parts[1];
                }

                // Override parameters
                $dispatcher->setParams($keyParams);
            }
        );

        $dispatcher = new MvcDispatcher();

        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    }
);

Mendapatkan Parameter

Ketika rute menyediakan parameter bernama, Anda dapat menerimanya di pengontrol, tampilan, atau komponen lain apa pun yang memperluas Phalcon\Di\Injectable

dispatcher->getParam('title');

        // Get the post's year passed in the URL as parameter
        // or prepared in an event also filtering it
        $year = $this->dispatcher->getParam('year', 'int');

        // ...
    }
}

Mempersiapkan tindakan

Anda juga dapat menentukan skema arbitrer untuk tindakan

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
2 di loop pengiriman

Camelize nama tindakan

Jika URL aslinya adalah.

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
3, dan misalnya anda ingin melakukan camelize
dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
4 menjadi
dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
5, diperlukan kode berikut

set(
    'dispatcher',
    function () {
        // Create an EventsManager
        $eventsManager = new EventsManager();

        // Camelize actions
        $eventsManager->attach(
            'dispatch:beforeDispatchLoop',
            function (Event $event, $dispatcher) {
                $dispatcher->setActionName(
                    Text::camelize($dispatcher->getActionName())
                );
            }
        );

        $dispatcher = new MvcDispatcher();

        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    }
);

Hapus ekstensi lawas

Jika URL asli selalu berisi ekstensi

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
6

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
0

Anda dapat menghapusnya sebelum mengirimkan kombinasi pengontrol/tindakan

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
1

Menyuntikkan instance model

Dalam contoh ini, pengembang ingin memeriksa parameter yang akan diterima suatu tindakan untuk menginjeksi instance model secara dinamis

Pengontrolnya terlihat seperti

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
2

Metode

dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
_7 menerima turunan dari model
dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
8, pengembang dapat memeriksa ini sebelum mengirimkan tindakan yang mempersiapkan parameter yang sesuai

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
_3

Contoh di atas telah disederhanakan. Pengembang dapat meningkatkannya untuk menyuntikkan segala jenis ketergantungan atau model dalam tindakan sebelum dieksekusi

Dari 3. 1. x dan seterusnya operator juga dilengkapi dengan opsi untuk menangani ini secara internal untuk semua model yang diteruskan ke aksi pengontrol dengan menggunakan Phalcon\Mvc\Model\Binder

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
_4

Karena objek Binder menggunakan Api Refleksi internal yang berat, ada kemampuan untuk menyetel cache. Ini dapat dilakukan dengan menggunakan argumen kedua di
dispatcher->forward(
            [
                'controller' => 'posts',
                'action'     => 'index',
            ]
        );
    }
}
9 yang juga dapat menerima nama layanan atau hanya dengan meneruskan instance cache ke konstruktor
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
0

Itu juga memperkenalkan antarmuka baru Phalcon\Mvc\Model\Binder\BinderBinder yang memungkinkan Anda untuk menentukan model terkait pengontrol untuk memungkinkan model mengikat di pengontrol dasar

Misalnya, Anda memiliki basis

dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
_1 yang
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
2 Anda memanjang dari.
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
_1 Anda terlihat seperti ini

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
5

Di PostsController Anda, Anda perlu menentukan model mana yang dikaitkan dengan pengontrol. Ini dilakukan dengan mengimplementasikan Phalcon\Mvc\Model\Binder\BinderFace yang akan menambahkan metode

dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
4 dari mana Anda dapat mengembalikan nama model. Itu dapat mengembalikan string hanya dengan satu nama model atau array asosiatif di mana kuncinya adalah nama parameter

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
6

Dengan mendeklarasikan model yang terkait dengan

dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
2, pengikat dapat memeriksa pengontrol untuk metode
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
4 sebelum meneruskan model yang ditentukan ke dalam tindakan pertunjukan induk

Jika struktur proyek Anda tidak menggunakan pengontrol induk apa pun, tentu saja Anda masih dapat mengikat model secara langsung ke dalam tindakan pengontrol

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
_7

Saat ini pengikat hanya akan menggunakan kunci utama model untuk menjalankan
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
7. Contoh rute untuk hal di atas adalah
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
8

Menangani Pengecualian Tidak Ditemukan

Menggunakan EventsManager dimungkinkan untuk memasukkan titik pengait sebelum operator melempar pengecualian ketika kombinasi pengontrol/tindakan tidak ditemukan

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
8

Tentu saja, metode ini dapat dipindahkan ke kelas plugin independen, yang memungkinkan lebih dari satu kelas mengambil tindakan saat pengecualian dihasilkan di loop pengiriman

set(
    'dispatcher',
    function () {
        // Create an event manager
        $eventsManager = new EventsManager();

        // Attach a listener for type 'dispatch'
        $eventsManager->attach(
            'dispatch',
            function (Event $event, $dispatcher) {
                // ...
            }
        );

        $dispatcher = new MvcDispatcher();

        // Bind the eventsManager to the view component
        $dispatcher->setEventsManager($eventsManager);

        return $dispatcher;
    },
    true
);
_9

Hanya pengecualian yang dihasilkan oleh operator dan pengecualian yang dihasilkan dalam tindakan yang dieksekusi yang diberitahukan dalam peristiwa
dispatcher->forward(
    [
        'action' => 'search'
    ]
);

// Forward flow to another action in the current controller
// passing parameters
$this->dispatcher->forward(
    [
        'action' => 'search',
        'params' => [1, 2, 3]
    ]
);
9. Pengecualian yang dihasilkan di pendengar atau peristiwa pengontrol dialihkan ke try/catch terbaru

Menerapkan Dispatcher Anda sendiri

Antarmuka Phalcon\Mvc\DispatcherInterface harus diimplementasikan untuk membuat dispatcher Anda sendiri menggantikan yang disediakan oleh Phalcon